예제 #1
0
        /// <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);
            }
        }
예제 #2
0
 /// <summary>
 /// 接收K线数据。
 /// </summary>
 /// <param name="kLine"></param>
 public void ReceiveKLineData(USeKLine kLine)
 {
     if (FilterKLineData(kLine))
     {
         m_kLineQueue.Enqueue(kLine);
     }
 }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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);
        }
예제 #5
0
        /// <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);
        }
예제 #6
0
        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);
        }
예제 #7
0
        /// <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);
        }
예제 #8
0
        /// <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);
            }
        }
예제 #9
0
        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);
        }
예제 #10
0
        /// <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));
        }
예제 #11
0
        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);
                }
            }
        }
예제 #12
0
        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);
        }
예제 #13
0
        /// <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);
        }
예제 #14
0
        /// <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);
        }
예제 #15
0
        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);
        }
예제 #16
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);
            }
        }
예제 #17
0
        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);
            }
        }
예제 #18
0
        /// <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);
            }
        }
예제 #19
0
 /// <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);
     }
 }
예제 #20
0
        /// <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);
        }
예제 #21
0
        /// <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);
        }
예제 #22
0
 /// <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));
     }
 }
예제 #23
0
        /// <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);
        }
예제 #24
0
        //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);
        }
예제 #25
0
        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
            }
        }
예제 #26
0
        /// <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);
        }
예제 #27
0
 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);
     }
 }
예제 #28
0
        /// <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);
        }
예제 #29
0
        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);
        }
예제 #30
0
        /// <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);
        }