Exemple #1
0
        /// <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);
            }
        }
Exemple #3
0
        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);
            }
        }
Exemple #4
0
        /// <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"));
                }
            }
        }
Exemple #5
0
        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);
        }
Exemple #9
0
        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);
        }
Exemple #10
0
        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);
                }
            }
        }
Exemple #13
0
        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);
                }
            }
        }
Exemple #14
0
 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);
            }
        }
Exemple #17
0
        /// <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);
            }
        }
Exemple #19
0
        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);
                }
            }
        }
Exemple #20
0
        /// <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);
            }
        }
Exemple #22
0
        /// <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);
            }
        }