/// <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 CreateMQChannel() { if (m_mqChannel != null && m_mqChannel.IsOpen) { return; } StopMQChannel(); try { ConnectionFactory factory = new ConnectionFactory(); factory.HostName = m_mqServerAddress; IConnection mqConnection = factory.CreateConnection();// factory.CreateConnection(m_mqServerAddress); IModel channel = mqConnection.CreateModel(); m_mqConnnection = mqConnection; m_mqChannel = channel; } catch (Exception ex) { string text = "创建RabbitMQ Channel失败," + ex.Message; m_eventLogger.WriteWarning(text); USeNotifyEventArgs notify = new USeNotifyEventArgs(USeNotifyLevel.Warning, text); SafeRaiseNotifyEvent(this, notify); } }
private void CreateMQChannel() { if (m_mqttClient.IsPublishing) { return; } StopMQTTChannel(); try { var connArgs = new MqttConnectionArgs() { ClientId = m_clientId, Hostname = m_mqttServerAddress, Port = m_mqttPort, Keepalive = new TimeSpan(1, 0, 0) }; m_mqttClient = new MqttConnection(connArgs, m_mqttPersistence, null); m_mqttClient.Connect(); } catch (Exception ex) { string text = "创建MQTTChannel失败," + ex.Message; m_eventLogger.WriteWarning(text); USeNotifyEventArgs notify = new USeNotifyEventArgs(USeNotifyLevel.Warning, text); SafeRaiseNotifyEvent(this, notify); } }
/// <summary> /// 获取交易日(临时做法周五不适用)。 /// </summary> /// <returns></returns> private string GetTradeDayPath() { TradeCalendar tradeCalendar = m_tradeCalendar.GetTradeCalendar(DateTime.Today); if (tradeCalendar == null) { string text = string.Format("未能找到{0:yyyy-MM-dd}交易日历", DateTime.Today); m_eventLogger.WriteError(text); USeNotifyEventArgs arg = new USeNotifyEventArgs(USeNotifyLevel.Error, text); SafeRaiseNotifyEvent(this, arg); return(DateTime.Today.ToString("yyyyMMdd")); } else { if (tradeCalendar.IsTradeDay) { if (DateTime.Now.TimeOfDay > new TimeSpan(20, 0, 0)) { return(tradeCalendar.NextTradeDay.ToString("yyyyMMdd")); } else { return(DateTime.Today.ToString("yyyyMMdd")); } } else { return(tradeCalendar.NextTradeDay.ToString("yyyyMMdd")); } } }
private void InternalSendTotMQTT(USeMarketData marketData) { try { CreateMQChannel(); byte[] body = CreateMQTTBody(marketData); if (marketData.Instrument.Market == USeMarket.LME) { m_mqttClient.Publish(m_topicLME, body, MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, false); Interlocked.Increment(ref m_sotreCount); } else { m_mqttClient.Publish(m_topic, body, MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, false); Interlocked.Increment(ref m_sotreCount); } Debug.WriteLine(string.Format("时间:{0} 合约:{1} 最新价:{2} body:{3}", marketData.QuoteTime, marketData.Instrument.InstrumentCode, marketData.ClosePrice, body)); } catch (Exception ex) { Interlocked.Increment(ref m_errorStoreCount); string text = string.Format("{0}发送MQTT实时行情数据失败,{1}", this, ex.Message); m_eventLogger.WriteError(text); USeNotifyEventArgs notify = new USeNotifyEventArgs(USeNotifyLevel.Warning, text); SafeRaiseNotifyEvent(this, notify); } }
/// <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); } }
/// <summary> /// 读数据线程 /// </summary> private void DoWork() { try { while (m_runFlag) { while (m_marketDataQueue.Count > 0) { USeMarketData marketData = null; m_marketDataQueue.TryDequeue(out marketData); Debug.Assert(marketData != null); FileStorer storer = GetFileStorer(marketData); try { storer.Write(ToMarketDataLog(marketData)); Interlocked.Increment(ref m_sotreCount); } catch (Exception ex) { Interlocked.Increment(ref m_errorStoreCount); USeNotifyEventArgs arg = new USeNotifyEventArgs(USeNotifyLevel.Error, "文件保存行情数据失败," + ex.Message); SafeRaiseNotifyEvent(this, arg); } } Thread.Sleep(1000); } } catch (Exception ex) { Debug.WriteLine(ex.Message); } }
private void QuoteDriver_OnDriverStateChanged(object sender, USeQuoteDriverStateChangedEventArgs e) { string text = string.Format("行情驱动状态为{0},{1}", e.NewState.ToString(), e.Reason); USeNotifyEventArgs args = new USeNotifyEventArgs(USeNotifyLevel.Information, text); SafeRaiseNotifyEvent(this, args); }
private void OnNotifyEventArrived(object sender, USeNotifyEventArgs e) { string text = String.Format("Notify[{0}]: {1}", e.Level.ToString()[0], e.Message); Debug.WriteLine("==>" + text); SafeRaiseNotifyEvent(sender, e); }
private void StartListner(HttpServer.HttpListener httpListenner) { m_listener.Start(5); m_eventLogger.WriteError("启动Http监听成功..."); string text = string.Format("时间:" + DateTime.Now.ToString() + "\n" + " 建立HttpServer,启动Http监听成功.."); USeNotifyEventArgs notify = new USeNotifyEventArgs(USeNotifyLevel.Warning, text); SafeRaiseNotifyEvent(this, notify); }
/// <summary> /// 读数据线程 /// </summary> private void DoWork() { lock (m_locker) { try { var connArgs = new MqttConnectionArgs() { ClientId = m_clientId, Hostname = m_mqttServerAddress, Port = m_mqttPort, Keepalive = new TimeSpan(1, 0, 0) }; using (m_mqttClient = new MqttConnection(connArgs)) { m_mqttClient.Connect(); while (m_runFlag) { USeMarketData marketData = null; m_marketDataQueue.TryDequeue(out marketData); if (marketData == null) { Thread.Sleep(1000); continue; } Debug.WriteLine(string.Format("当前MQTT链接:{0}", connArgs.ClientId)); //[hanyu]暂时只推送上期的品种行情 if (marketData.Instrument.Market == USeMarket.SHFE || marketData.Instrument.Market == USeMarket.LME) { InternalSendTotMQTT(marketData); } } } } catch (Exception ex) { Debug.WriteLine(ex.Message); string text = string.Format("** {0}链接MQTT失败,{1}", this.StoreageName, ex.Message); m_eventLogger.WriteError(text); USeNotifyEventArgs notify = new USeNotifyEventArgs(USeNotifyLevel.Warning, text); SafeRaiseNotifyEvent(this, notify); } finally { m_mqttClient.Disconnect(); DoWork(); } } }
/// <summary> /// 安全地发布指定的通知事件。 /// </summary> /// <param name="sender">通知事件发送者对象。</param> /// <param name="e">通知事件参数对象。</param> protected void SafeRaiseNotifyEvent(object sender, USeNotifyEventArgs e) { EventHandler <USeNotifyEventArgs> handler = this.Notify; if (handler != null) { try { handler(sender, e); } catch (Exception ex) { Debug.Assert(false, ex.Message); } } }
private void SafeRaiseNotifyEvent(object sender, USeNotifyEventArgs e) { EventHandler <USeNotifyEventArgs> handler = this.Notify; if (handler != null) { try { handler(sender, e); } catch (Exception ex) { string text = String.Format("{0} raise Notify event failed, Error: {1}", this, ex.Message); m_eventLogger.WriteWarning(text); } } }
private void StopMQTTChannel() { try { if (m_mqttClient != null) { m_mqttClient.Disconnect(); m_mqttClient = null; } } catch (Exception ex) { string text = "关闭MQTTChannel失败," + ex.Message; m_eventLogger.WriteWarning(text); USeNotifyEventArgs notify = new USeNotifyEventArgs(USeNotifyLevel.Warning, text); SafeRaiseNotifyEvent(this, notify); } }
/// <summary> /// K先保存。 /// </summary> /// <param name="kLineList"></param> private void InternalSendToRocketMQ(USeKLine kLine) { Debug.Assert(kLine.Cycle == USeCycleType.Day); try { CreateMQChannel(); byte[] body = CreateMQBody(kLine); if (kLine.SettlementPrice > 0m) { //有结算价K线 m_mqChannel.BasicPublish(MQ_EXCHNAGE, MQ_CLOSE_ROUTING_KEY, null, body); //有结算价的时候代表收盘上述先发送了一遍,等待用结算价更新资金沉淀的任务全部结束以后,再次发送一边缓存数据, //有结算价的时候先全部缓存起来,根据三个更新资金沉淀的任务的最终截止时间是每天15:45,所以在15:50-以后,进程 //退出之前,再发送一次结算价的缓存 m_settlementKlineDic[kLine.InstrumentCode] = kLine; } else { //无结算价K线 if (IsInCloseTimeRange() == false) { m_mqChannel.BasicPublish(MQ_EXCHNAGE, MQ_ROUTING_KEY, null, body); } else { m_mqChannel.BasicPublish(MQ_EXCHNAGE, MQ_CLOSE_ROUTING_KEY, null, body); } } 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); } }
public void StopMQChannel() { try { if (m_mqChannel != null) { if (m_mqChannel.IsOpen) { m_mqChannel.Close(); } m_mqChannel = null; } } catch (Exception ex) { string text = "关闭RabbitMQ Channel失败," + ex.Message; m_eventLogger.WriteWarning(text); USeNotifyEventArgs notify = new USeNotifyEventArgs(USeNotifyLevel.Warning, text); SafeRaiseNotifyEvent(this, notify); } try { if (m_mqConnnection != null) { if (m_mqConnnection.IsOpen) { m_mqConnnection.Close(); } m_mqConnnection = null; } } catch (Exception ex) { string text = "关闭RabbitMQ Connection失败," + ex.Message; m_eventLogger.WriteWarning(text); USeNotifyEventArgs notify = new USeNotifyEventArgs(USeNotifyLevel.Warning, text); SafeRaiseNotifyEvent(this, notify); } }
/// <summary> /// 读数据线程 /// </summary> private void DoWork() { try { while (m_runFlag) { USeMarketData marketData = GetNextMarketData(); if (marketData == null) { Thread.Sleep(10); continue; } ProcessNextMarketData(marketData); } } catch (Exception ex) { USeNotifyEventArgs notify = new USeNotifyEventArgs(USeNotifyLevel.Critical, ex.Message, ToString(), 0); SafeRaiseNotifyEvent(this, notify); } }
/// <summary> /// K先保存。 /// </summary> /// <param name="kLineList"></param> private void InternalSendToRocketMQ(USeKLine kLine) { Debug.Assert(kLine.Cycle == USeCycleType.Day); try { CreateMQChannel(); byte[] body = CreateMQBody(kLine); if (kLine.SettlementPrice > 0m) { //有结算价K线 m_mqChannel.BasicPublish(MQ_EXCHNAGE, MQ_CLOSE_ROUTING_KEY, null, body); } else { //无结算价K线 if (IsInCloseTimeRange() == false) { m_mqChannel.BasicPublish(MQ_EXCHNAGE, MQ_ROUTING_KEY, null, body); } else { m_mqChannel.BasicPublish(MQ_EXCHNAGE, MQ_CLOSE_ROUTING_KEY, null, body); } } 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); } }
public void Stop() { try { m_listener.Stop(); } catch (Exception ex) { string text = string.Format("时间:" + DateTime.Now.ToString() + "\n" + "监听停止异常" + ex.Message); USeNotifyEventArgs notify = new USeNotifyEventArgs(USeNotifyLevel.Warning, text); SafeRaiseNotifyEvent(this, notify); m_eventLogger.WriteError(text); } while (true) { try { //停止行情接收线程 if (m_threadListener.ThreadState == System.Threading.ThreadState.Running || m_threadListener.IsAlive) { m_threadListener.Abort(); } else { break; } } catch (ThreadAbortException ex) { string text = string.Format("时间:" + DateTime.Now.ToString() + "\n" + "监听线程停止异常" + ex.Message); USeNotifyEventArgs notify = new USeNotifyEventArgs(USeNotifyLevel.Warning, text); SafeRaiseNotifyEvent(this, notify); m_eventLogger.WriteError(text); } } }
/// <summary> /// 处理下条行情。 /// </summary> private void ProcessNextMarketData(USeMarketData marketData) { try { List <KLineFactory> kLineFactoryList = GetKLineFactory(marketData.Instrument); List <KLineFactory> indexKLineFactoryList = GetIndexKLineFactory(marketData.Instrument); if (indexKLineFactoryList != null) { kLineFactoryList.AddRange(indexKLineFactoryList); } if (kLineFactoryList != null) { foreach (KLineFactory factory in kLineFactoryList) { try { factory.UpdateMarketData(marketData); } catch (Exception exx) { USeNotifyEventArgs notify = new USeNotifyEventArgs(USeNotifyLevel.Error, exx.Message, ToString(), 0); SafeRaiseNotifyEvent(this, notify); } } } Interlocked.Increment(ref m_processCount); } catch (Exception ex) { USeNotifyEventArgs notify = new USeNotifyEventArgs(USeNotifyLevel.Error, ex.Message, ToString(), 0); SafeRaiseNotifyEvent(this, notify); } }
/// <summary> /// K线保存。 /// </summary> /// <param name="kLineList"></param> private void InternalSaveKLineData(List <USeKLine> kLineList) { try { using (MySqlConnection connection = new MySqlConnection(m_dbConnStr)) { connection.Open(); foreach (USeKLine kLine in kLineList) { //if (kLine.Cycle == USeCycleType.Day) { //日线先进行更新,如果返回影响条数为0则插入 string cmdText = CreateKLineUpdateSql(kLine); MySqlCommand command = new MySqlCommand(cmdText, connection); command.Parameters.AddWithValue("@contract", kLine.InstrumentCode); command.Parameters.AddWithValue("@exchange", kLine.Market.ToString()); command.Parameters.AddWithValue("@date_time", kLine.DateTime); command.Parameters.AddWithValue("@price_open", kLine.Open); command.Parameters.AddWithValue("@price_high", kLine.High); command.Parameters.AddWithValue("@price_low", kLine.Low); command.Parameters.AddWithValue("@price_close", kLine.Close); command.Parameters.AddWithValue("@volumn", kLine.Volumn); command.Parameters.AddWithValue("@turnover", kLine.Turnover); command.Parameters.AddWithValue("@openinterest", kLine.OpenInterest); command.Parameters.AddWithValue("@pre_settlement_price", kLine.PreSettlementPrice); command.Parameters.AddWithValue("@settlement_price", kLine.SettlementPrice); command.Parameters.AddWithValue("@ask_volumn", kLine.AskVolumn); command.Parameters.AddWithValue("@bid_volumn", kLine.BidVolumn); command.Parameters.AddWithValue("@sendimentary_money", kLine.SendimentaryMoney); command.Parameters.AddWithValue("@flow_fund", kLine.FlowFund); int result = command.ExecuteNonQuery(); if (result > 0) { continue; // 已更新则返回 } } { string cmdText = CreateKLineInsertSql(kLine); MySqlCommand command = new MySqlCommand(cmdText, connection); command.Parameters.AddWithValue("@contract", kLine.InstrumentCode); command.Parameters.AddWithValue("@exchange", kLine.Market.ToString()); command.Parameters.AddWithValue("@date_time", kLine.DateTime); command.Parameters.AddWithValue("@price_open", kLine.Open); command.Parameters.AddWithValue("@price_high", kLine.High); command.Parameters.AddWithValue("@price_low", kLine.Low); command.Parameters.AddWithValue("@price_close", kLine.Close); command.Parameters.AddWithValue("@volumn", kLine.Volumn); command.Parameters.AddWithValue("@turnover", kLine.Turnover); command.Parameters.AddWithValue("@openinterest", kLine.OpenInterest); command.Parameters.AddWithValue("@sendimentary_money", kLine.SendimentaryMoney); command.Parameters.AddWithValue("@flow_fund", kLine.FlowFund); command.Parameters.AddWithValue("@pre_settlement_price", kLine.PreSettlementPrice); command.Parameters.AddWithValue("@settlement_price", kLine.SettlementPrice); command.Parameters.AddWithValue("@ask_volumn", kLine.AskVolumn); command.Parameters.AddWithValue("@bid_volumn", kLine.BidVolumn); int result = command.ExecuteNonQuery(); Debug.Assert(result == 1); } } } m_sotreCount += kLineList.Count; } catch (Exception ex) { m_errorStoreCount += kLineList.Count; string text = string.Format("{0}保存K线数据失败,{1}", this, ex.Message); USeNotifyEventArgs notify = new USeNotifyEventArgs(USeNotifyLevel.Warning, text); //SafeRaiseNotifyEvent(this, notify); } }
/// <summary> /// K线保存。 /// </summary> /// <param name="kLineList"></param> private void InternalSaveKLineData(List <USeKLine> kLineList) { //[hanyu]新增字段资金沉淀,资金流入流出在存入数据库前加工 //资金沉淀 = 合约持仓量*结算价(盘中为最新价)*每手的数量*保证金比例 //资金流入流出 = 合约持仓变动*结算价(盘中为平均价) * 每手数量*保证金比例 foreach (USeKLine kline in kLineList) { int perSharesContract = GetInstrumentPerSharesContract(kline.InstrumentCode); decimal exchangeLongMarginRatio = GetExchangeLongMarginRatio(kline.InstrumentCode); decimal diffOpenInterest = 0m; kline.SendimentaryMoney = kline.OpenInterest * kline.Close * perSharesContract * exchangeLongMarginRatio; foreach (KeyValuePair <string, USeKLine> kv in m_insKLineDic) { if (kv.Key == kline.InstrumentCode) { diffOpenInterest = kline.OpenInterest - kv.Value.OpenInterest; break; } } kline.FlowFund = diffOpenInterest * Convert.ToDecimal(kline.AvgPrice) * perSharesContract * exchangeLongMarginRatio; m_insKLineDic[kline.InstrumentCode] = kline; } try { using (MySqlConnection connection = new MySqlConnection(m_dbConnStr)) { connection.Open(); foreach (USeKLine kLine in kLineList) { if (kLine.Cycle == USeCycleType.Day) { //日线先进行更新,如果返回影响条数为0则插入 string cmdText = CreateKLineUpdateSql(kLine); MySqlCommand command = new MySqlCommand(cmdText, connection); command.Parameters.AddWithValue("@contract", kLine.InstrumentCode); command.Parameters.AddWithValue("@exchange", kLine.Market.ToString()); command.Parameters.AddWithValue("@date_time", kLine.DateTime); command.Parameters.AddWithValue("@price_open", kLine.Open); command.Parameters.AddWithValue("@price_high", kLine.High); command.Parameters.AddWithValue("@price_low", kLine.Low); command.Parameters.AddWithValue("@price_close", kLine.Close); command.Parameters.AddWithValue("@volumn", kLine.Volumn); command.Parameters.AddWithValue("@turnover", kLine.Turnover); command.Parameters.AddWithValue("@openinterest", kLine.OpenInterest); command.Parameters.AddWithValue("@pre_settlement_price", kLine.PreSettlementPrice); command.Parameters.AddWithValue("@settlement_price", kLine.SettlementPrice); command.Parameters.AddWithValue("@ask_volumn", kLine.AskVolumn); command.Parameters.AddWithValue("@bid_volumn", kLine.BidVolumn); command.Parameters.AddWithValue("@sendimentary_money", kLine.SendimentaryMoney); command.Parameters.AddWithValue("@flow_fund", kLine.FlowFund); int result = command.ExecuteNonQuery(); if (result > 0) { continue; // 已更新则返回 } } { string cmdText = CreateKLineInsertSql(kLine); MySqlCommand command = new MySqlCommand(cmdText, connection); command.Parameters.AddWithValue("@contract", kLine.InstrumentCode); command.Parameters.AddWithValue("@exchange", kLine.Market.ToString()); command.Parameters.AddWithValue("@date_time", kLine.DateTime); command.Parameters.AddWithValue("@price_open", kLine.Open); command.Parameters.AddWithValue("@price_high", kLine.High); command.Parameters.AddWithValue("@price_low", kLine.Low); command.Parameters.AddWithValue("@price_close", kLine.Close); command.Parameters.AddWithValue("@volumn", kLine.Volumn); command.Parameters.AddWithValue("@turnover", kLine.Turnover); command.Parameters.AddWithValue("@openinterest", kLine.OpenInterest); command.Parameters.AddWithValue("@sendimentary_money", kLine.SendimentaryMoney); command.Parameters.AddWithValue("@flow_fund", kLine.FlowFund); if (kLine.Cycle == USeCycleType.Day) { command.Parameters.AddWithValue("@pre_settlement_price", kLine.PreSettlementPrice); command.Parameters.AddWithValue("@settlement_price", kLine.SettlementPrice); command.Parameters.AddWithValue("@ask_volumn", kLine.AskVolumn); command.Parameters.AddWithValue("@bid_volumn", kLine.BidVolumn); command.Parameters.AddWithValue("@sendimentary_money", kLine.SendimentaryMoney); command.Parameters.AddWithValue("@flow_fund", kLine.FlowFund); } int result = command.ExecuteNonQuery(); Debug.Assert(result == 1); } } } m_sotreCount += kLineList.Count; } catch (Exception ex) { m_errorStoreCount += kLineList.Count; string text = string.Format("{0}保存K线数据失败,{1}", this, ex.Message); m_eventLogger.WriteError(text); USeNotifyEventArgs notify = new USeNotifyEventArgs(USeNotifyLevel.Warning, text); SafeRaiseNotifyEvent(this, notify); } }