/// <summary> /// 构造方法。 /// </summary> /// <param name="instrument">合约。</param> /// <param name="publisher">发布者。</param> /// <param name="tradeRange">交易时段。</param> /// <param name="publishInterval">发布间隔(单位:秒)。</param> public DayKLineFactory(USeInstrument instrument, USeKLine initKLine, IKLinePublisher publisher, DayTradeRange tradeRange, IAppLogger eventLogger, TimeSpan publishInterval, bool isMainContract, USeTradingInstrumentManager instrumentManager) : base(instrument, publisher, tradeRange, eventLogger) { m_publishInterval = publishInterval; m_nextPublishTime = DateTime.Now.AddTicks(publishInterval.Ticks); m_isMainContract = isMainContract; if (initKLine != null) { Debug.Assert(initKLine.InstrumentCode == instrument.InstrumentCode); m_kLine = initKLine; } if (isMainContract) { string varieties = USeTraderProtocol.GetVarieties(instrument.InstrumentCode); m_mainContractCode = USeTraderProtocol.GetMainContractCode(varieties, instrument.Market); } //获取该数据库下的合约详细信息 try { Debug.Assert(instrumentManager != null); m_insDetailList = instrumentManager.GetAllInstrumentDetails(); } catch (Exception ex) { throw new Exception("IndexDayKLineFactory 获取全部合约详细信息异常:" + ex.Message); } }
/// <summary> /// 接收K线数据。 /// </summary> /// <param name="kLine"></param> public void ReceiveKLineData(USeKLine kLine) { if (FilterKLineData(kLine)) { m_kLineQueue.Enqueue(kLine); } }
/// <summary> /// 创建KLine。 /// </summary> /// <param name="marketData"></param> /// <returns></returns> private USeKLine CreateDefaultKLine() { USeKLine kline = new USeKLine() { InstrumentCode = m_instrument.InstrumentCode, Market = m_instrument.Market, Cycle = USeCycleType.Day, DateTime = GetCycleTime(DateTime.Now), Open = 0m, High = 0m, Low = 0m, Close = 0m, Volumn = 0, Turnover = 0m, OpenInterest = 0m, SettlementPrice = 0m, PreSettlementPrice = 0m, AskVolumn = 0, BidVolumn = 0, SendimentaryMoney = 0m, FlowFund = 0m, SpeculateRadio = 0m }; return(kline); }
/// <summary> /// 创建KLine。 /// </summary> /// <param name="marketData"></param> /// <returns></returns> private USeKLine CreateFirstKLine(USeMarketData marketData) { USeKLine kline = new USeKLine() { InstrumentCode = m_instrument.InstrumentCode, Market = m_instrument.Market, Cycle = USeCycleType.Day, DateTime = GetCycleTime(marketData.UpdateTime), Open = marketData.OpenPrice, High = marketData.HighPrice, Low = marketData.LowPrice, Close = marketData.LastPrice, Volumn = marketData.Volume, Turnover = marketData.Turnover, OpenInterest = marketData.OpenInterest, SettlementPrice = marketData.SettlementPrice, PreSettlementPrice = marketData.PreSettlementPrice, AskVolumn = (int)(marketData.Volume / 2), BidVolumn = marketData.Volume - (int)(marketData.Volume / 2), SendimentaryMoney = 0m, FlowFund = 0m, SpeculateRadio = 0m }; return(kline); }
/// <summary> /// 根据加工后的K线获取数据表名。 /// </summary> /// <param name="kLine"></param> /// <returns></returns> private string GetDBTableName(USeKLine kLine) { string tableName = string.Empty; if (kLine.Cycle == USeCycleType.Day) { tableName = "day_kline"; } else if (kLine.Cycle == USeCycleType.Min1) { Debug.Assert(kLine.Cycle == USeCycleType.Min1); switch (kLine.Market) { case USeMarket.CFFEX: case USeMarket.CZCE: case USeMarket.DCE: case USeMarket.SHFE: tableName = string.Format("min1_kline_{0}", kLine.Market.ToString().ToLower()); break; default: Debug.Assert(false); throw new Exception("Invalid market:" + kLine.Market.ToString()); } } else { throw new Exception("Invalid cycel:" + kLine.Cycle.ToString()); } return(tableName); }
private USeKLine ParseKLine(string line, ImportFileEntity entity) { string[] items = line.Split(new char[] { ',' }); USeKLine kLine = new USeKLine(); //文件名带过来的 kLine.InstrumentCode = entity.InstrumentCode; //搜索匹配过来的 kLine.Market = FromCodeToMarket(entity.InstrumentCode); //entity根据文件名获取过来的 kLine.Cycle = entity.Cycle; //line[0]和line[1]合成...开高低收 string dateRegion = items[0]; string[] dateArray = items[0].Split('.'); string dateProcess = dateArray[0] + "-" + dateArray[1] + "-" + dateArray[2] + " " + items[1]; kLine.DateTime = Convert.ToDateTime(dateProcess); kLine.Open = Convert.ToDecimal(items[2]); kLine.High = Convert.ToDecimal(items[3]); kLine.Low = Convert.ToDecimal(items[4]); kLine.Close = Convert.ToDecimal(items[5]); kLine.OpenInterest = Convert.ToDecimal(items[6]); kLine.Volumn = Convert.ToInt32(items[7]); kLine.Turnover = Convert.ToDecimal(items[8]) * 10000; return(kLine); }
/// <summary> /// 获取K线生成器。 /// </summary> /// <param name="instrument"></param> /// <returns></returns> private List <KLineFactory> GetIndexKLineFactory(USeInstrument instrument) { Debug.Assert(instrument.Market != USeMarket.Unknown); string varieties = USeTraderProtocol.GetVarieties(instrument.InstrumentCode); List <KLineFactory> factoryList = null; if (m_indexkLineFactoryDic.TryGetValue(varieties, out factoryList) == false) { USeProduct product = m_productManager.GetPruduct(varieties); factoryList = new List <KLineFactory>(); DayTradeRange tradeRange = m_tradeRangeManager.CreateTradeRange(varieties); DateTime tradeDay = tradeRange.GetTradeDay(DateTime.Now); USeInstrument indexInstrument = USeTraderProtocol.GetVarietiesIndexCode(product); USeKLine dayKLine = GetDayKLine(tradeDay, indexInstrument); List <USeInstrument> instrumentList = m_instrumentManager.GetAllInstruments(varieties, product.Market); IndexDayKLineFactory dayFactory = new IndexDayKLineFactory(product, instrumentList, dayKLine, m_dayKLinePublishInterval, m_kLinePublisher, tradeRange, m_eventLogger, m_instrumentManager); factoryList.Add(dayFactory); IndexMinKLineFactory min1Factory = new IndexMinKLineFactory(product, instrumentList, USeCycleType.Min1, m_kLinePublisher, tradeRange, m_eventLogger, m_instrumentManager); factoryList.Add(min1Factory); m_indexkLineFactoryDic.Add(varieties, factoryList); } Debug.Assert(factoryList != null && factoryList.Count == 2); return(factoryList); }
/// <summary> /// K先保存。 /// </summary> /// <param name="kLineList"></param> private void InternalSendToRocketMQ(USeKLine kLine) { try { HttpHeader header = HttpHeader.DefaultPostHeader; header.Param = CreatePostParameter(kLine); JsonData jsonData = m_httpVistor.GetJsonData(m_sendUrl, header, null); if (jsonData.StatusCode == System.Net.HttpStatusCode.OK) { RocketMQReply reply = JsonConvert.DeserializeObject <RocketMQReply>(jsonData.JsonString); } else { string jsonReply = jsonData.JsonString; } Interlocked.Increment(ref m_sotreCount); } catch (Exception ex) { Interlocked.Increment(ref m_errorStoreCount); string text = string.Format("{0}保存K线数据失败,{1}", this, ex.Message); m_eventLogger.WriteError(text); USeNotifyEventArgs notify = new USeNotifyEventArgs(USeNotifyLevel.Warning, text); SafeRaiseNotifyEvent(this, notify); } }
private USeKLine ParseKLine(string line) { line = line.Substring(19); string[] items = line.Split(new char[] { ',' }); USeKLine kLine = new USeKLine(); kLine.InstrumentCode = items[0]; kLine.Market = (USeMarket)(Enum.Parse(typeof(USeMarket), items[1])); kLine.Cycle = (USeCycleType)(Enum.Parse(typeof(USeCycleType), items[2])); kLine.DateTime = Convert.ToDateTime(items[3]); kLine.Open = Convert.ToDecimal(items[4]); kLine.High = Convert.ToDecimal(items[5]); kLine.Low = Convert.ToDecimal(items[6]); kLine.Close = Convert.ToDecimal(items[7]); kLine.Volumn = Convert.ToInt32(items[8]); kLine.Turnover = Convert.ToDecimal(items[9]); kLine.OpenInterest = Convert.ToDecimal(items[10]); kLine.SettlementPrice = Convert.ToDecimal(items[11]); kLine.PreSettlementPrice = Convert.ToDecimal(items[12]); kLine.AskVolumn = Convert.ToInt32(items[13]); kLine.BidVolumn = Convert.ToInt32(items[14]); return(kLine); }
/// <summary> /// 获取K线生成器。 /// </summary> /// <param name="instrument"></param> /// <returns></returns> private List <KLineFactory> GetKLineFactory(USeInstrument instrument) { Debug.Assert(instrument.Market != USeMarket.Unknown); List <KLineFactory> factoryList = null; if (m_kLineFactoryDic.TryGetValue(instrument.InstrumentCode, out factoryList) == false) { factoryList = new List <KLineFactory>(); DayTradeRange tradeRange = m_tradeRangeManager.CreateTradeRange(instrument); bool isMainConract = m_mainContractManager.IsMainContract(instrument.InstrumentCode); DateTime tradeDay = tradeRange.GetTradeDay(DateTime.Now); USeKLine dayKLine = GetDayKLine(tradeDay, instrument); DayKLineFactory dayFactory = new DayKLineFactory(instrument, dayKLine, m_kLinePublisher, tradeRange, m_eventLogger, m_dayKLinePublishInterval, isMainConract, m_instrumentManager); factoryList.Add(dayFactory); MinKLineFactory min1Factory = new MinKLineFactory(instrument, m_kLinePublisher, tradeRange, m_eventLogger, USeCycleType.Min1, isMainConract); factoryList.Add(min1Factory); m_kLineFactoryDic.Add(instrument.InstrumentCode, factoryList); } Debug.Assert(factoryList != null && factoryList.Count == 2); return(new List <KLineFactory>(factoryList)); }
public void ImportDayKLine(ImportFileEntity entity) { USeKLine kLine = ReadDayKLineFile(entity.FilePath); if (kLine != null) { //日线先更新,影响条目为0,则Insert try { using (MySqlConnection connection = new MySqlConnection(m_dbConStr)) { connection.Open(); string cmdUpdateText = CreateKLineUpdateSql(kLine); MySqlCommand updateCommand = new MySqlCommand(cmdUpdateText, connection); updateCommand.Parameters.AddWithValue("@contract", kLine.InstrumentCode); updateCommand.Parameters.AddWithValue("@exchange", kLine.Market.ToString()); updateCommand.Parameters.AddWithValue("@date_time", kLine.DateTime); updateCommand.Parameters.AddWithValue("@price_open", kLine.Open); updateCommand.Parameters.AddWithValue("@price_high", kLine.High); updateCommand.Parameters.AddWithValue("@price_low", kLine.Low); updateCommand.Parameters.AddWithValue("@price_close", kLine.Close); updateCommand.Parameters.AddWithValue("@volumn", kLine.Volumn); updateCommand.Parameters.AddWithValue("@turnover", kLine.Turnover); updateCommand.Parameters.AddWithValue("@openinterest", kLine.OpenInterest); updateCommand.Parameters.AddWithValue("@pre_settlement_price", kLine.PreSettlementPrice); updateCommand.Parameters.AddWithValue("@settlement_price", kLine.SettlementPrice); updateCommand.Parameters.AddWithValue("@ask_volumn", kLine.AskVolumn); updateCommand.Parameters.AddWithValue("@bid_volumn", kLine.BidVolumn); int updateResult = updateCommand.ExecuteNonQuery(); if (updateResult <= 0) { string cmdInsertText = CreateKLineUpdateSql(kLine); MySqlCommand insertCommand = new MySqlCommand(cmdInsertText, connection); insertCommand.Parameters.AddWithValue("@contract", kLine.InstrumentCode); insertCommand.Parameters.AddWithValue("@exchange", kLine.Market.ToString()); insertCommand.Parameters.AddWithValue("@date_time", kLine.DateTime); insertCommand.Parameters.AddWithValue("@price_open", kLine.Open); insertCommand.Parameters.AddWithValue("@price_high", kLine.High); insertCommand.Parameters.AddWithValue("@price_low", kLine.Low); insertCommand.Parameters.AddWithValue("@price_close", kLine.Close); insertCommand.Parameters.AddWithValue("@volumn", kLine.Volumn); insertCommand.Parameters.AddWithValue("@turnover", kLine.Turnover); insertCommand.Parameters.AddWithValue("@openinterest", kLine.OpenInterest); insertCommand.Parameters.AddWithValue("@pre_settlement_price", kLine.PreSettlementPrice); insertCommand.Parameters.AddWithValue("@settlement_price", kLine.SettlementPrice); insertCommand.Parameters.AddWithValue("@ask_volumn", kLine.AskVolumn); insertCommand.Parameters.AddWithValue("@bid_volumn", kLine.BidVolumn); int insertResult = insertCommand.ExecuteNonQuery(); } } } catch (Exception ex) { throw new Exception("ImportDayKLine异常:" + ex.Message); } } }
private USeKLine GetSeriesTradingKline(DateTime dateTime, string seriesInstrument) { string strSel = string.Format(@"select * from {0}.day_kline where contract='{1}' AND date_time='{2:yyyy-MM-dd 00:00:00}';", m_alphaDBName, seriesInstrument, dateTime); DataTable table = MySQLDriver.GetTableFromDB(m_dbConnStr, strSel); foreach (DataRow row in table.Rows) { try { USeKLine tempKline = new USeKLine(); tempKline.InstrumentCode = row["contract"].ToString(); tempKline.Market = (USeMarket)Enum.Parse(typeof(USeMarket), row["exchange"].ToString()); tempKline.Close = Convert.ToDecimal(row["price_close"]); tempKline.DateTime = Convert.ToDateTime(row["date_time"]); tempKline.OpenInterest = Convert.ToDecimal(row["openinterest"]); tempKline.SettlementPrice = (row["settlement_price"] != DBNull.Value) ? Convert.ToDecimal(row["settlement_price"]) : 0m; tempKline.SendimentaryMoney = (row["sendimentary_money"] != DBNull.Value) ? Convert.ToDecimal(row["sendimentary_money"]) : 0m; tempKline.FlowFund = (row["flow_fund"] != DBNull.Value) ? Convert.ToDecimal(row["flow_fund"]) : 0m; return(tempKline); } catch (Exception ex) { throw new Exception("GetTradingDaySeriesKline:" + ex.Message); } } return(null); }
/// <summary> /// 获取合约指定交易日日K线。 /// </summary> public USeKLine GetMin1KLine(USeInstrument instrument, DateTime time) { string strSel = string.Format(@"select * from {0}.{1} where contract = '{1}' and date_time = '{3:yyyy-MM-dd HH:mm:00}';", m_alphaDBName, GetMin1KLineTableName(instrument.Market), instrument.InstrumentCode, time); DataTable table = MySQLDriver.GetTableFromDB(m_dbConnStr, strSel); if (table != null && table.Rows.Count > 0) { DataRow row = table.Rows[0]; USeKLine kline = new USeKLine() { InstrumentCode = row["contract"].ToString(), Market = USeTraderProtocol.ToUseMarket(row["exchange"].ToString()), Cycle = USeCycleType.Day, DateTime = Convert.ToDateTime(row["date_time"]), Open = row["price_open"].ToDecimal(), High = row["price_high"].ToDecimal(), Low = row["price_low"].ToDecimal(), Close = row["price_close"].ToDecimal(), Volumn = row["volumn"].ToInt(), Turnover = row["turnover"].ToDecimal(), OpenInterest = row["openinterest"].ToDecimal() }; return(kline); } return(null); }
/// <summary> /// 获取当前K线前一个交易日指数的的资金沉淀去用于计算资金流入流出 /// </summary> /// <param name="kline"></param> /// <returns></returns> private decimal GetLastTradingDayIndexInsSendimentaryMoney(USeKLine kline) { decimal lastTradingDaySendimentaryMoney = 0m; DateTime preTradingDay = m_tradeCalendarManager.GetPreTradingDate(kline.DateTime); string strSel = string.Format(@"select * from {0}.day_kline where contract='{1}' AND date_time='{2:yyyy-MM-dd 00:00:00}';", m_alphaDBName, kline.InstrumentCode, preTradingDay); DataTable table = MySQLDriver.GetTableFromDB(m_dbConnStr, strSel); foreach (DataRow row in table.Rows) { try { USeKLine tempKline = new USeKLine(); tempKline.InstrumentCode = row["contract"].ToString(); tempKline.Market = (USeMarket)Enum.Parse(typeof(USeMarket), row["exchange"].ToString()); tempKline.Close = Convert.ToDecimal(row["price_close"]); tempKline.DateTime = Convert.ToDateTime(row["date_time"]); tempKline.OpenInterest = Convert.ToDecimal(row["openinterest"]); tempKline.SettlementPrice = (row["settlement_price"] != DBNull.Value) ? Convert.ToDecimal(row["settlement_price"]) : 0m; tempKline.SendimentaryMoney = (row["sendimentary_money"] != DBNull.Value) ? Convert.ToDecimal(row["sendimentary_money"]) : 0m; return(lastTradingDaySendimentaryMoney = tempKline.SendimentaryMoney); } catch (Exception ex) { throw new Exception("GetLastTradingDayIndexInsSendimentaryMoney:" + ex.Message); } } return(lastTradingDaySendimentaryMoney); }
private string CreatePostParameter(USeKLine kLine) { List <string> filedList = new List <string>(); filedList.Add(kLine.InstrumentCode); filedList.Add(kLine.Market.ToString()); filedList.Add(kLine.Cycle.ToString()); filedList.Add(kLine.DateTime.ToString("yyyy-MM-dd HH:mm:ss")); filedList.Add(kLine.Open.ToString()); filedList.Add(kLine.High.ToString()); filedList.Add(kLine.Low.ToString()); filedList.Add(kLine.Close.ToString()); filedList.Add(kLine.Volumn.ToString()); filedList.Add(kLine.Turnover.ToString()); filedList.Add(kLine.OpenInterest.ToString()); filedList.Add(kLine.SettlementPrice.ToString()); filedList.Add(kLine.PreSettlementPrice.ToString()); filedList.Add(kLine.AskVolumn.ToString()); filedList.Add(kLine.BidVolumn.ToString()); RocketMQMessage message = new RocketMQMessage() { body = string.Join(",", filedList), keys = "ctp", producerGroup = "basedata", tags = "kline", topic = "alpha" }; string parameter = JsonConvert.SerializeObject(message); return(parameter); }
/// <summary> /// 读数据线程 /// </summary> protected override void DoWork() { try { while (m_runFlag) { while (m_kLineQueue.Count > 0) { USeKLine kLine = null; m_kLineQueue.TryDequeue(out kLine); Debug.Assert(kLine != null); FileStorer storer = GetFileStorer(kLine); try { storer.Write(ToKLineLog(kLine)); Interlocked.Increment(ref m_sotreCount); } catch (Exception ex) { Interlocked.Increment(ref m_errorStoreCount); USeNotifyEventArgs arg = new USeNotifyEventArgs(USeNotifyLevel.Error, "文件保存K线失败," + ex.Message); SafeRaiseNotifyEvent(this, arg); } } Thread.Sleep(1000); } } catch (Exception ex) { Debug.WriteLine(ex.Message); } }
private void btnTest_Click(object sender, EventArgs e) { try { USeKLine kline = new USeKLine(); kline.InstrumentCode = "cu1707"; kline.Market = USeMarket.CFFEX; kline.Cycle = USeCycleType.Min1; kline.DateTime = new DateTime(2017, 06, 26, 09, 30, 0); kline.Open = 43325; kline.High = 43325; kline.Low = 43325; kline.Close = 43325; kline.Volumn = 122222; kline.Turnover = 122222.780m; kline.OpenInterest = 2345; List <KLineStoreage> storeageList = USeManager.Instance.KLineStorages; foreach (KLineStoreage storeage in storeageList) { if (storeage is FileKLineStoreage) { storeage.ReceiveKLineData(kline); } } //IKLineDataListener store = USeManager.Instance.RabbitMQStore; //store.ReceiveKLineData(kline); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
/// <summary> /// 判断是否为8888合约 /// </summary> /// <param name="kline"></param> /// <returns></returns> private bool VerifyIsIndexInstrument(USeKLine kline) { if (kline == null || kline.InstrumentCode == "") { throw new Exception("VerifyIsIndexInstrument is empty or null"); } string instrumentCode = kline.InstrumentCode; foreach (char c in instrumentCode) { if (c >= '0' && c <= '9') { instrumentCode = instrumentCode + c; } else { continue; } } if (instrumentCode == "8888") { return(true); } else { return(false); } }
/// <summary> /// 发布K线。 /// </summary> /// <param name="kLine"></param> /// <param name="cycle"></param> public void PublishKLine(USeKLine kLine) { foreach (IKLineDataListener storer in m_marketDataStore) { storer.ReceiveKLineData(kLine); } }
/// <summary> /// 获取当天交易日的K线 /// </summary> public List <USeKLine> GetTodayDayKlineList(DateTime dateTime) { string strSel = string.Format(@"select * from {0}.day_kline where date_time>='{1:yyyy-MM-dd 00:00:00}';", m_alphaDBName, dateTime); DataTable table = MySQLDriver.GetTableFromDB(m_dbConnStr, strSel); List <USeKLine> klineList = new List <USeKLine>(); foreach (DataRow row in table.Rows) { try { USeKLine kline = new USeKLine(); kline.InstrumentCode = row["contract"].ToString(); kline.Market = (USeMarket)Enum.Parse(typeof(USeMarket), row["exchange"].ToString()); kline.Close = Convert.ToDecimal(row["price_close"]); kline.DateTime = Convert.ToDateTime(row["date_time"]); kline.OpenInterest = Convert.ToDecimal(row["openinterest"]); kline.SettlementPrice = (row["settlement_price"] != DBNull.Value) ? Convert.ToDecimal(row["settlement_price"]) : 0m; klineList.Add(kline); } catch (Exception ex) { throw new Exception("初始化当天交易日的K线:" + ex.Message); } } return(klineList); }
/// <summary> /// 创建delete SQL语句。 /// </summary> /// <param name="kLine"></param> /// <returns></returns> private string CreateKLineDeleteSql(USeKLine kLine) { string tableName = GetDBTableName(kLine); string strSql = string.Empty; strSql = string.Format(@"DELETE FROM {0}.{1} where contract=@contract and exchange=@exchange and date_time= @date_time", m_alphaDBName, tableName); return(strSql); }
/// <summary> /// 保存K线数据。 /// </summary> /// <param name="kLine"></param> public void ReceiveKLineData(USeKLine kLine) { Interlocked.Increment(ref m_storeCount); //if (kLine.InstrumentCode == "cu1708") { Debug.WriteLine(string.Format("{0}@{1},Cycle:{7},Open:{2},High:{3},Low:{4},Close:{5},SettlentPrice:{6}", kLine.InstrumentCode, kLine.DateTime, kLine.Open, kLine.High, kLine.Low, kLine.Close, kLine.SettlementPrice, kLine.Cycle)); } }
/// <summary> /// 创建Insert SQL语句。 /// </summary> /// <param name="kLine"></param> /// <returns></returns> private string CreateKLineInsertSql(USeKLine kLine) { string tableName = "day_kline"; string strSql = string.Format(@"INSERT INTO {0}(contract,exchange,date_time,price_open,price_high,price_low,price_close,volumn,turnover,openinterest,pre_settlement_price,settlement_price,ask_volumn,bid_volumn,update_time,sendimentary_money,flow_fund) values (@contract,@exchange,@date_time,@price_open,@price_high,@price_low,@price_close,@volumn,@turnover,@openinterest,@pre_settlement_price,@settlement_price,@ask_volumn,@bid_volumn,now(),@sendimentary_money,@flow_fund)", tableName); return(strSql); }
//public void ReImportDayKLine(ImportFileEntity entity) //{ // int count = 0; // List<USeKLine> kLineList = ReadDayKLineFile(entity); // if (kLineList != null) // { // using (MySqlConnection connection = new MySqlConnection(m_dbConStr)) // { // connection.Open(); // MySqlCommand updateCommand = new MySqlCommand(); // updateCommand.Connection = connection; // MySqlTransaction tx = connection.BeginTransaction(); // updateCommand.Transaction = tx; // try // { // List<string> SQLStringList = new List<string>(); // foreach (USeKLine kline in kLineList) // { // string cmdUpdateText = CreateKLineUpdateSql(kline); // SQLStringList.Add(cmdUpdateText); // } // for (int n = 0; n < SQLStringList.Count; n++) // { // string strsql = SQLStringList[n].ToString(); // if (strsql.Trim().Length > 1) // { // updateCommand.CommandText = strsql; // updateCommand.Parameters.AddWithValue("@contract", kLine.InstrumentCode); // updateCommand.Parameters.AddWithValue("@exchange", kLine.Market.ToString()); // updateCommand.Parameters.AddWithValue("@date_time", kLine.DateTime); // updateCommand.Parameters.AddWithValue("@price_open", kLine.Open); // updateCommand.Parameters.AddWithValue("@price_high", kLine.High); // updateCommand.Parameters.AddWithValue("@price_low", kLine.Low); // updateCommand.Parameters.AddWithValue("@price_close", kLine.Close); // updateCommand.Parameters.AddWithValue("@volumn", kLine.Volumn); // updateCommand.Parameters.AddWithValue("@turnover", kLine.Turnover); // updateCommand.Parameters.AddWithValue("@openinterest", kLine.OpenInterest); // int updateResult = updateCommand.ExecuteNonQuery(); // if (updateResult <= 0) // { // string cmdInsertText = CreateKLineInsertSql(kLine); // MySqlCommand insertCommand = new MySqlCommand(cmdInsertText, connection); // insertCommand.Parameters.AddWithValue("@contract", kLine.InstrumentCode); // insertCommand.Parameters.AddWithValue("@exchange", kLine.Market.ToString()); // insertCommand.Parameters.AddWithValue("@date_time", kLine.DateTime); // insertCommand.Parameters.AddWithValue("@price_open", kLine.Open); // insertCommand.Parameters.AddWithValue("@price_high", kLine.High); // insertCommand.Parameters.AddWithValue("@price_low", kLine.Low); // insertCommand.Parameters.AddWithValue("@price_close", kLine.Close); // insertCommand.Parameters.AddWithValue("@volumn", kLine.Volumn); // insertCommand.Parameters.AddWithValue("@turnover", kLine.Turnover); // updateCommand.Parameters.AddWithValue("@openinterest", kLine.OpenInterest); // int insertResult = insertCommand.ExecuteNonQuery(); // } // //后来加上的 // if (n > 0 && (n % 500 == 0 || n == SQLStringList.Count - 1)) // { // tx.Commit(); // tx = connection.BeginTransaction(); // } // } // } // } // count++; // Debug.WriteLine("该文件共{1}个条目,目前:{2},正在处理的文件:{0},", kLineList.Count(), count, entity.FilePath); // OnProcessDataEvent("Inner", kLineList.Count(), count, entity.FilePath); // } // } // catch (Exception ex) // { // throw new Exception("ImportDayKLine异常:" + ex.Message); // } //} //private void ReImportMin1KLine(ImportFileEntity entity) //{ // int count = 0; // List<USeKLine> kLineList = ReadMin1KLineFile(entity); // if (kLineList != null) // { // foreach (USeKLine kLine in kLineList) // { // try // { // using (MySqlConnection connection = new MySqlConnection(m_dbConStr)) // { // connection.Open(); // string cmdUpdateText = CreateKLineUpdateSql(kLine); // MySqlCommand updateCommand = new MySqlCommand(cmdUpdateText, connection); // updateCommand.Parameters.AddWithValue("@contract", kLine.InstrumentCode); // updateCommand.Parameters.AddWithValue("@exchange", kLine.Market.ToString()); // updateCommand.Parameters.AddWithValue("@date_time", kLine.DateTime); // updateCommand.Parameters.AddWithValue("@price_open", kLine.Open); // updateCommand.Parameters.AddWithValue("@price_high", kLine.High); // updateCommand.Parameters.AddWithValue("@price_low", kLine.Low); // updateCommand.Parameters.AddWithValue("@price_close", kLine.Close); // updateCommand.Parameters.AddWithValue("@volumn", kLine.Volumn); // updateCommand.Parameters.AddWithValue("@turnover", kLine.Turnover); // updateCommand.Parameters.AddWithValue("@openinterest", kLine.OpenInterest); // int updateResult = updateCommand.ExecuteNonQuery(); // if (updateResult <= 0) // { // string cmdInsertText = CreateKLineInsertSql(kLine); // MySqlCommand insertCommand = new MySqlCommand(cmdInsertText, connection); // insertCommand.Parameters.AddWithValue("@contract", kLine.InstrumentCode); // insertCommand.Parameters.AddWithValue("@exchange", kLine.Market.ToString()); // insertCommand.Parameters.AddWithValue("@date_time", kLine.DateTime); // insertCommand.Parameters.AddWithValue("@price_open", kLine.Open); // insertCommand.Parameters.AddWithValue("@price_high", kLine.High); // insertCommand.Parameters.AddWithValue("@price_low", kLine.Low); // insertCommand.Parameters.AddWithValue("@price_close", kLine.Close); // insertCommand.Parameters.AddWithValue("@volumn", kLine.Volumn); // insertCommand.Parameters.AddWithValue("@turnover", kLine.Turnover); // insertCommand.Parameters.AddWithValue("@openinterest", kLine.OpenInterest); // int insertResult = insertCommand.ExecuteNonQuery(); // } // count++; // Debug.WriteLine("该文件共{0}个条目,目前:{1},正在处理的文件:{2},", kLineList.Count(), count, entity.FilePath); // OnProcessDataEvent("Inner", kLineList.Count(), count, entity.FilePath); // } // } // catch (Exception ex) // { // throw new Exception("ImportDayKLine异常:" + ex.Message); // } // } // } //} #endregion /// <summary> /// 创建Update SQL语句。 /// </summary> /// <param name="kLine"></param> /// <returns></returns> private string CreateKLineUpdateSql(USeKLine kLine) { string tableName = GetDBTableName(kLine); string strSql = string.Empty; strSql = string.Format(@"update {0}.{1} set price_open = @price_open,price_high=@price_high,price_low=@price_low,price_close=@price_close,volumn=@volumn,turnover=@turnover,openinterest=@openinterest where contract=@contract and exchange=@exchange and date_time= @date_time", m_alphaDBName, tableName); return(strSql); }
private void RefreashSeriesContractsSendimentaryMoney(List <USeKLine> klineList) { Debug.Assert(klineList != null); foreach (USeKLine kline in klineList) { #region 主力合约更新 if (VerifyISIndexOrSeries(kline) == 1) //主力合约更新 { //找到当天的主力合约表,确定当天哪一个合约为主力合约,然后把day_kline中的主力合约的数据更新到相应的9999上去 string seriesContract = GetTradingDaySeriesKline(kline.DateTime, USeTraderProtocol.GetVarieties(kline.InstrumentCode)); USeKLine seriesKline = GetSeriesTradingKline(kline.DateTime, seriesContract); try { using (MySqlConnection connection = new MySqlConnection(m_dbConnStr)) { connection.Open(); string cmdText = string.Format(@"update {0}.day_kline set sendimentary_money=@sendimentary_money,flow_fund=@flow_fund where contract=@contract AND date_time=@date_time;", m_alphaDBName); MySqlCommand command = new MySqlCommand(cmdText, connection); command.Parameters.AddWithValue("@contract", kline.InstrumentCode); command.Parameters.AddWithValue("@date_time", kline.DateTime); command.Parameters.AddWithValue("@sendimentary_money", seriesKline.SendimentaryMoney); command.Parameters.AddWithValue("@flow_fund", seriesKline.FlowFund); int result = command.ExecuteNonQuery(); Debug.Assert(result == 1); if (kline.SettlementPrice == 0m) { string text = string.Format("用当前收盘价更新主力合约资金沉淀-资金流向成功,合约:{0} 交易所:{1} 当前收盘价:{2} 结算价:{3} 沉淀资金:{4} 资金流向:{5} K线时间:{6}", kline.InstrumentCode, kline.Market.ToString(), kline.Close, kline.SettlementPrice, seriesKline.SendimentaryMoney, seriesKline.FlowFund, kline.DateTime); WriteConsoleLog(text); m_eventLogger.WriteInformation(text); } else { string text = string.Format("用结算价更新主力合约资金沉淀-资金流向成功,合约:{0} 交易所:{1} 当前收盘价:{2} 结算价:{3} 沉淀资金:{4} 资金流向:{5} K线时间:{6}", kline.InstrumentCode, kline.Market.ToString(), kline.Close, kline.SettlementPrice, seriesKline.SendimentaryMoney, seriesKline.FlowFund, kline.DateTime); WriteConsoleLog(text); m_eventLogger.WriteInformation(text); } } } catch (Exception ex) { string text = "用结算价更新主力合约资金沉淀失败:" + ex.Message; WriteConsoleLog(text); } } #endregion } }
/// <summary> /// 创建Update SQL语句。 /// </summary> /// <param name="kLine"></param> /// <returns></returns> private string CreateKLineUpdateSql(USeKLine kLine) { string tableName = "day_kline"; string strSql = string.Format(@"update {0}.{1} set price_open = @price_open,price_high=@price_high,price_low=@price_low,price_close=@price_close,volumn=@volumn,turnover=@turnover,openinterest=@openinterest, pre_settlement_price=@pre_settlement_price,settlement_price = @settlement_price,ask_volumn = @ask_volumn,bid_volumn = @bid_volumn,update_time = now(),sendimentary_money=@sendimentary_money ,flow_fund=@flow_fund where contract=@contract and exchange=@exchange and date_time= @date_time", m_marketDataDBName, tableName); return(strSql); }
private USeKLine GetDayKLine(DateTime day, USeInstrument instrument) { try { USeKLine kline = m_alphaDBVistor.GetDayKLine(instrument, day); return(kline); } catch (Exception ex) { m_eventLogger.WriteError(string.Format("获取{0}@{1:yyyy-MM-dd}日K线数据失败,{2}", instrument, day, ex.Message)); return(null); } }
/// <summary> /// 定时器合成K线 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void M_timerOutMarketData_Tick(object sender, EventArgs e) { if (m_marketDataQueue.Count <= 0) { return; } USeMarketData marketData; m_marketDataQueue.TryDequeue(out marketData); Debug.Assert(marketData != null); //去字典中找是否有一条K线记录,如果没有创建一条新的发布存储,如果找到了,开始update USeKLine kline = new USeKLine(); kline.InstrumentCode = marketData.Instrument.InstrumentCode; kline.Market = USeMarket.LME; //如果K线的时间现在在夜盘时间,而且小于第二天的凌晨时间,那么交易日应该归为前一交易日的行情 Debug.Assert(kline.DateTime != null); if (kline.DateTime >= m_tradingDayflag) { kline.DateTime = new DateTime(m_tradingDayflag.Year, m_tradingDayflag.Month, m_tradingDayflag.Day, 0, 0, 0); } else { kline.DateTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0); } kline.Open = marketData.OpenPrice; kline.High = marketData.HighPrice; kline.Low = marketData.LowPrice; kline.Close = marketData.ClosePrice; kline.Volumn = marketData.Volume; kline.Turnover = marketData.Turnover; kline.OpenInterest = marketData.OpenInterest; kline.PreSettlementPrice = marketData.PreSettlementPrice; kline.SettlementPrice = marketData.SettlementPrice; kline.AskVolumn = 0; kline.BidVolumn = 0; kline.SendimentaryMoney = 0m; kline.FlowFund = 0m; //发布 List <USeKLine> klineList = new List <USeKLine>(); klineList.Add(kline); InternalSaveKLineData(klineList); }
private FileStorer GetFileStorer(USeKLine kLine) { string key = string.Format("{0}_{1}", kLine.Cycle.ToString(), kLine.InstrumentCode); FileStorer storer = null; if (m_fileStorerDic.TryGetValue(key, out storer) == false) { string fileName = Path.Combine(m_kLineFolderPath, GetTradeDayPath(), key + ".csv"); storer = new FileStorer(fileName); m_fileStorerDic.Add(key, storer); } return(storer); }
/// <summary> /// 获取上一个有效交易日的指数资金沉淀 /// </summary> /// <param name="lastTradingDay"></param> /// <returns></returns> private USeKLine CalKlineFlowMoney(USeKLine kline) { //根据目前交易日到交易日历中找到上一个交易日,再到day_kline中找到上一个交易日该指数合约的sendmentaryMoney DateTime preTradingDay = USeManager.Instance.TradeCalendarManager.GetPreTradingDate(kline.DateTime); foreach (USeKLine k in m_preKlineList) { if (k.DateTime == preTradingDay && k.InstrumentCode == kline.InstrumentCode) { kline.FlowFund = kline.SendimentaryMoney - k.SendimentaryMoney; } } return(kline); }