Exemplo n.º 1
0
        public IEnumerable<Tick> CalculateSpread(CThostFtdcDepthMarketDataField pDepthMarketData)
        {
            List<Tick> list = new List<Tick>();
            _dict[pDepthMarketData.InstrumentID] = pDepthMarketData;

            if (pDepthMarketData.InstrumentID == "IF1305"
                    || pDepthMarketData.InstrumentID == "IF1306")
            {
                CThostFtdcDepthMarketDataField pMD1, pMD2;
                if (_dict.TryGetValue("IF1305", out pMD1)
                        && _dict.TryGetValue("IF1306", out pMD2))
                {
                    Tick t1 = new Tick("IF1305-IF1306",
                            pMD1.LastPrice - pMD2.LastPrice,
                            0);

                    Tick t2 = new Tick("IF1305-IF1306*2",
                            pMD1.LastPrice - pMD2.LastPrice * 2,
                            0);

                    list.Add(t1);
                    list.Add(t2);
                }
            }

            return list;
        }
Exemplo n.º 2
0
 public void FireOnRspQryDepthMarketData(CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     if (null != OnRspQryDepthMarketData)
     {
         OnRspQryDepthMarketData(pDepthMarketData);
     }
 }
Exemplo n.º 3
0
 void OnRspQryDepthMarketData(CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     Console.WriteLine("==取深度行情");
     Console.WriteLine(pDepthMarketData.InstrumentID);
     Console.WriteLine(pDepthMarketData.LastPrice);
     Console.WriteLine(pDepthMarketData.UpperLimitPrice);
     Console.WriteLine(pDepthMarketData.LowerLimitPrice);
 }
Exemplo n.º 4
0
        public static bool TryConvert(Quote quote, ref CThostFtdcDepthMarketDataField DepthMarketData)
        {
#if OQ
            if (quoteField == null)
            {
                quoteField = typeof(Quote).GetField("quote", BindingFlags.NonPublic | BindingFlags.Instance);
            }

            CTPQuote q = quoteField.GetValue(quote) as CTPQuote;
#elif QD
            CTPQuote q = quote as CTPQuote;
#endif
            if (null != q)
            {
                DepthMarketData = q.DepthMarketData;
                return true;
            }
            return false;
        }
Exemplo n.º 5
0
        public static bool TryConvert(Trade trade, ref CThostFtdcDepthMarketDataField DepthMarketData)
        {
#if OQ
            if (tradeField == null)
            {
                tradeField = typeof(Trade).GetField("trade", BindingFlags.NonPublic | BindingFlags.Instance);
            }

            CTPTrade t = tradeField.GetValue(trade) as CTPTrade;
#elif QD
            CTPTrade t = trade as CTPTrade;
#endif           
            if (null != t)
            {
                DepthMarketData = t.DepthMarketData;
                return true;
            }

            return false;
        }
        public void OnRspQryDepthMarketData(IntPtr pTraderApi, ref CThostFtdcDepthMarketDataField pDepthMarketData, ref CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast)
        {
            if (0 == pRspInfo.ErrorID)
            {
                CThostFtdcDepthMarketDataField DepthMarket;
                if (!_dictDepthMarketData.TryGetValue(pDepthMarketData.InstrumentID, out DepthMarket))
                {
                    //没找到此元素,保存一下
                    _dictDepthMarketData[pDepthMarketData.InstrumentID] = pDepthMarketData;
                }

                tdlog.Info("已经接收查询深度行情 {0}", pDepthMarketData.InstrumentID);
                //通知单例
                CTPAPI.GetInstance().FireOnRspQryDepthMarketData(pDepthMarketData);
            }
            else
            {
                tdlog.Error("nRequestID:{0},ErrorID:{1},OnRspQryDepthMarketData:{2}", nRequestID, pRspInfo.ErrorID, pRspInfo.ErrorMsg);
                EmitError(nRequestID, pRspInfo.ErrorID, "OnRspQryDepthMarketData:" + pRspInfo.ErrorMsg);
            }
        }
Exemplo n.º 7
0
 private void OnRtnDepthMarketData_callback(IntPtr pMdUserApi, ref CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     if (null != OnRtnDepthMarketData)
     {
         OnRtnDepthMarketData(this, new OnRtnDepthMarketDataArgs(pMdUserApi, ref pDepthMarketData));
     }
 }
Exemplo n.º 8
0
        private void OnRtnDepthMarketData(IntPtr pApi, ref CThostFtdcDepthMarketDataField pDepthMarketData)
        {
            CThostFtdcDepthMarketDataField DepthMarket;
            _dictDepthMarketData.TryGetValue(pDepthMarketData.InstrumentID, out DepthMarket);
            //将更新字典的功能提前,因为如果一开始就OnTrade中下单,涨跌停没有更新
            _dictDepthMarketData[pDepthMarketData.InstrumentID] = pDepthMarketData;

            if (TimeMode.LocalTime == _TimeMode)
            {
                //为了生成正确的Bar,使用本地时间
                _dateTime = Clock.Now;
            }
            else
            {
                //直接按HH:mm:ss来解析,测试过这种方法目前是效率比较高的方法
                int HH = int.Parse(pDepthMarketData.UpdateTime.Substring(0, 2));
                int mm = int.Parse(pDepthMarketData.UpdateTime.Substring(3, 2));
                int ss = int.Parse(pDepthMarketData.UpdateTime.Substring(6, 2));

                _dateTime = new DateTime(_yyyy, _MM, _dd, HH, mm, ss, pDepthMarketData.UpdateMillisec);
            }

            Instrument instrument = _dictAltSymbol2Instrument[pDepthMarketData.InstrumentID];

            //通过测试,发现IB的Trade与Quote在行情过来时数量是不同的,在这也做到不同
            if (DepthMarket.LastPrice == pDepthMarketData.LastPrice
                && DepthMarket.Volume == pDepthMarketData.Volume)
            { }
            else
            {
                //行情过来时是今天累计成交量,得转换成每个tick中成交量之差
                int volume = pDepthMarketData.Volume - DepthMarket.Volume;
                if (0 == DepthMarket.Volume)
                {
                    //没有接收到最开始的一条,所以这计算每个Bar的数据时肯定超大,强行设置为0
                    volume = 0;
                }
                else if (volume < 0)
                {
                    //如果隔夜运行,会出现今早成交量0-昨收盘成交量,出现负数,所以当发现为负时要修改
                    volume = pDepthMarketData.Volume;
                }

                Trade trade = new Trade(_dateTime,
                    pDepthMarketData.LastPrice == double.MaxValue ? 0 : pDepthMarketData.LastPrice,
                    volume);

                if (null != MarketDataFilter)
                {
                    Trade t = MarketDataFilter.FilterTrade(trade, instrument.Symbol);
                    if (null != t)
                    {
                        EmitNewTradeEvent(instrument, t);
                    }
                }
                else
                {
                    EmitNewTradeEvent(instrument, trade);
                }
            }

            if (
                DepthMarket.BidVolume1 == pDepthMarketData.BidVolume1
                && DepthMarket.AskVolume1 == pDepthMarketData.AskVolume1
                && DepthMarket.BidPrice1 == pDepthMarketData.BidPrice1
                && DepthMarket.AskPrice1 == pDepthMarketData.AskPrice1
                )
            { }
            else
            {
                Quote quote = new Quote(_dateTime,
                    pDepthMarketData.BidPrice1 == double.MaxValue ? 0 : pDepthMarketData.BidPrice1,
                    pDepthMarketData.BidVolume1,
                    pDepthMarketData.AskPrice1 == double.MaxValue ? 0 : pDepthMarketData.AskPrice1,
                    pDepthMarketData.AskVolume1
                );

                if (null != MarketDataFilter)
                {
                    Quote q = MarketDataFilter.FilterQuote(quote, instrument.Symbol);
                    if (null != q)
                    {
                        EmitNewQuoteEvent(instrument, q);
                    }
                }
                else
                {
                    EmitNewQuoteEvent(instrument, quote);
                }
            }
        }
        public void SendMarketDataRequest(FIXMarketDataRequest request)
        {
            lock (this)
            {
                switch (request.SubscriptionRequestType)
                {
                    case DataManager.MARKET_DATA_SUBSCRIBE:
                        if (!_bMdConnected)
                        {
                            EmitError(-1, -1, "行情服务器没有连接,无法订阅行情");
                            mdlog.ErrorFormat("行情服务器没有连接,无法订阅行情");
                            return;
                        }
                        for (int i = 0; i < request.NoRelatedSym; ++i)
                        {
                            FIXRelatedSymGroup group = request.GetRelatedSymGroup(i);

                            //通过订阅的方式,由平台传入合约对象,在行情接收处将要使用到合约
                            CThostFtdcDepthMarketDataField DepthMarket;
                            Instrument inst = InstrumentManager.Instruments[group.Symbol];
                            string altSymbol = inst.GetSymbol(Name);

                            if (!_dictDepthMarketData.TryGetValue(altSymbol, out DepthMarket))
                            {
                                DepthMarket = new CThostFtdcDepthMarketDataField();
                                _dictDepthMarketData.Add(altSymbol, DepthMarket);
                            }

                            _dictAltSymbol2Instrument[altSymbol] = inst;
                            mdlog.InfoFormat("订阅合约 {0}", altSymbol);
                            MdApi.MD_Subscribe(m_pMdApi, altSymbol);

                        }
                        if (!_bTdConnected)
                        {
                            return;
                        }
                        TraderApi.TD_ReqQryInvestorPosition(m_pTdApi, null);
                        timerPonstion.Enabled = false;
                        timerPonstion.Enabled = true;
                        break;
                    case DataManager.MARKET_DATA_UNSUBSCRIBE:
                        if (!_bMdConnected)
                        {
                            mdlog.ErrorFormat("行情服务器没有连接,退订合约无效");
                            return;
                        }
                        for (int i = 0; i < request.NoRelatedSym; ++i)
                        {
                            FIXRelatedSymGroup group = request.GetRelatedSymGroup(i);

                            Instrument inst = InstrumentManager.Instruments[group.Symbol];
                            string altSymbol = inst.GetSymbol(Name);

                            _dictDepthMarketData.Remove(altSymbol);
                            mdlog.InfoFormat("取消订阅 {0}", altSymbol);
                            MdApi.MD_Unsubscribe(m_pMdApi, altSymbol);
                        }
                        break;
                    default:
                        throw new ArgumentException("Unknown subscription type: " + request.SubscriptionRequestType);
                }
            }
        }
Exemplo n.º 10
0
 public OnRtnDepthMarketDataArgs(IntPtr pMdUserApi, ref CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     this.pMdUserApi = pMdUserApi;
     this.pDepthMarketData = pDepthMarketData;
 }
Exemplo n.º 11
0
 public void CopyFrom(CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     InstrumentId = pDepthMarketData.InstrumentID;
     TradingDay = pDepthMarketData.TradingDay;
     LastPrice = pDepthMarketData.LastPrice;
     BidPrice1 = pDepthMarketData.BidPrice1;
     BidVolume1 = pDepthMarketData.BidVolume1;
     AskPrice1 = pDepthMarketData.AskPrice1;
     AskVolume1 = pDepthMarketData.AskVolume1;
     PreSettlementPrice = pDepthMarketData.PreSettlementPrice;
     PreClosePrice = pDepthMarketData.PreClosePrice;
     PreOpenInterest = pDepthMarketData.PreOpenInterest;
     OpenPrice = pDepthMarketData.OpenPrice;
     HighestPrice = pDepthMarketData.HighestPrice;
     LowestPrice = pDepthMarketData.LowestPrice;
     Volume = pDepthMarketData.Volume;
     Turnover = pDepthMarketData.Turnover;
     OpenInterest = pDepthMarketData.OpenInterest;
     ClosePrice = pDepthMarketData.ClosePrice;
     SettlementPrice = pDepthMarketData.SettlementPrice;
     UpperLimitPrice = pDepthMarketData.UpperLimitPrice;
     LowerLimitPrice = pDepthMarketData.LowerLimitPrice;
     UpdateMillisec = pDepthMarketData.UpdateMillisec;
     AveragePrice = pDepthMarketData.AveragePrice;
     //ExchangeID = pDepthMarketData.ExchangeID;
     UpdateTime = pDepthMarketData.UpdateTime;
 }
        private void OnRtnDepthMarketData(IntPtr pApi, ref CThostFtdcDepthMarketDataField pDepthMarketData)
        {
            DataRecord record;
            if (!_dictAltSymbol2Instrument.TryGetValue(pDepthMarketData.InstrumentID, out record))
            {
                mdlog.Warn("合约{0}不在订阅列表中却收到了数据", pDepthMarketData.InstrumentID);
                return;
            }

            Instrument instrument = record.Instrument;

            CThostFtdcDepthMarketDataField DepthMarket;
            _dictDepthMarketData.TryGetValue(pDepthMarketData.InstrumentID, out DepthMarket);

            //将更新字典的功能提前,因为如果一开始就OnTrade中下单,涨跌停没有更新
            _dictDepthMarketData[pDepthMarketData.InstrumentID] = pDepthMarketData;

            if (TimeMode.LocalTime == _TimeMode)
            {
                //为了生成正确的Bar,使用本地时间
                _dateTime = Clock.Now;
            }
            else
            {
                //直接按HH:mm:ss来解析,测试过这种方法目前是效率比较高的方法
                try
                {
                    // 只有使用交易所行情时才需要处理跨天的问题
                    ChangeTradingDay(pDepthMarketData.TradingDay);

                    int HH = int.Parse(pDepthMarketData.UpdateTime.Substring(0, 2));
                    int mm = int.Parse(pDepthMarketData.UpdateTime.Substring(3, 2));
                    int ss = int.Parse(pDepthMarketData.UpdateTime.Substring(6, 2));

                    _dateTime = new DateTime(_yyyy, _MM, _dd, HH, mm, ss, pDepthMarketData.UpdateMillisec);
                }
                catch (Exception)
                {
                    _dateTime = Clock.Now;
                }
            }

            if (record.TradeRequested)
            {
                //通过测试,发现IB的Trade与Quote在行情过来时数量是不同的,在这也做到不同
                if (DepthMarket.LastPrice == pDepthMarketData.LastPrice
                    && DepthMarket.Volume == pDepthMarketData.Volume)
                { }
                else
                {
                    //行情过来时是今天累计成交量,得转换成每个tick中成交量之差
                    int volume = pDepthMarketData.Volume - DepthMarket.Volume;
                    if (0 == DepthMarket.Volume)
                    {
                        //没有接收到最开始的一条,所以这计算每个Bar的数据时肯定超大,强行设置为0
                        volume = 0;
                    }
                    else if (volume < 0)
                    {
                        //如果隔夜运行,会出现今早成交量0-昨收盘成交量,出现负数,所以当发现为负时要修改
                        volume = pDepthMarketData.Volume;
                    }

                    Trade trade = new Trade(_dateTime,
                        pDepthMarketData.LastPrice == double.MaxValue ? 0 : pDepthMarketData.LastPrice,
                        volume);

                    EmitNewTradeEvent(instrument, trade);
                }
            }

            if (record.QuoteRequested)
            {
                //if (
                //DepthMarket.BidVolume1 == pDepthMarketData.BidVolume1
                //&& DepthMarket.AskVolume1 == pDepthMarketData.AskVolume1
                //&& DepthMarket.BidPrice1 == pDepthMarketData.BidPrice1
                //&& DepthMarket.AskPrice1 == pDepthMarketData.AskPrice1
                //)
                //{ }
                //else
                {
                    Quote quote = new Quote(_dateTime,
                        pDepthMarketData.BidPrice1 == double.MaxValue ? 0 : pDepthMarketData.BidPrice1,
                        pDepthMarketData.BidVolume1,
                        pDepthMarketData.AskPrice1 == double.MaxValue ? 0 : pDepthMarketData.AskPrice1,
                        pDepthMarketData.AskVolume1
                    );

                    EmitNewQuoteEvent(instrument, quote);
                }
            }

            if (record.MarketDepthRequested)
            {
                EmitNewMarketDepth(instrument, _dateTime, 0, MDSide.Ask, pDepthMarketData.AskPrice1, pDepthMarketData.AskVolume1);
                EmitNewMarketDepth(instrument, _dateTime, 0, MDSide.Bid, pDepthMarketData.BidPrice1, pDepthMarketData.BidVolume1);

                //EmitNewMarketDepth(instrument, _dateTime, 1, MDSide.Ask, pDepthMarketData.AskPrice2, pDepthMarketData.AskVolume2);
                //EmitNewMarketDepth(instrument, _dateTime, 1, MDSide.Bid, pDepthMarketData.BidPrice2, pDepthMarketData.BidVolume2);

                //EmitNewMarketDepth(instrument, _dateTime, 2, MDSide.Ask, pDepthMarketData.AskPrice3, pDepthMarketData.AskVolume3);
                //EmitNewMarketDepth(instrument, _dateTime, 2, MDSide.Bid, pDepthMarketData.BidPrice3, pDepthMarketData.BidVolume3);

                //EmitNewMarketDepth(instrument, _dateTime, 3, MDSide.Ask, pDepthMarketData.AskPrice4, pDepthMarketData.AskVolume4);
                //EmitNewMarketDepth(instrument, _dateTime, 3, MDSide.Bid, pDepthMarketData.BidPrice4, pDepthMarketData.BidVolume4);

                //EmitNewMarketDepth(instrument, _dateTime, 4, MDSide.Ask, pDepthMarketData.AskPrice5, pDepthMarketData.AskVolume5);
                //EmitNewMarketDepth(instrument, _dateTime, 4, MDSide.Bid, pDepthMarketData.BidPrice5, pDepthMarketData.BidVolume5);
            }

            // 价差生成功能
            do
            {
                if (null == CTPAPI.GetInstance().SpreadMarketData)
                    break;

                ISpreadMarketData SpreadMarketData = CTPAPI.GetInstance().SpreadMarketData;
                var ticks = SpreadMarketData.CalculateSpread(pDepthMarketData);
                if (null == ticks)
                    break;

                foreach (var tick in ticks)
                {
                    Instrument inst = InstrumentManager.Instruments[tick.Symbol];
                    if (null == inst)
                        continue;

                    if (!double.IsNaN(tick.Price))
                    {
                        Trade trade = new Trade(_dateTime, tick.Price, tick.Size);
                        trade.ProviderId = tick.ProviderId;

                        EmitNewTradeEvent(inst, trade);
                    }
                    if (!double.IsNaN(tick.Ask) && !double.IsNaN(tick.Bid))
                    {
                        Quote quote = new Quote(_dateTime,
                            tick.Bid, tick.BidSize,
                            tick.Ask, tick.AskSize);
                        quote.ProviderId = tick.ProviderId;

                        EmitNewQuoteEvent(inst, quote);
                    }
                }
            } while (false);

            // 直接回报CTP的行情信息
            if (EmitOnRtnDepthMarketData)
            {
                CTPAPI.GetInstance().FireOnRtnDepthMarketData(pDepthMarketData);
            }
        }
Exemplo n.º 13
0
 public void AddSimData(CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     marketQueue.Enqueue(pDepthMarketData);
 }
Exemplo n.º 14
0
        private void OnRtnDepthMarketData(IntPtr pApi, ref CThostFtdcDepthMarketDataField pDepthMarketData)
        {
            DataRecord record;
            if (!_dictAltSymbol2Instrument.TryGetValue(pDepthMarketData.InstrumentID, out record))
            {
                mdlog.Warn("合约{0}不在订阅列表中却收到了数据", pDepthMarketData.InstrumentID);
                return;
            }

            Instrument instrument = record.Instrument;

            CThostFtdcDepthMarketDataField DepthMarket;
            _dictDepthMarketData.TryGetValue(pDepthMarketData.InstrumentID, out DepthMarket);

            //将更新字典的功能提前,因为如果一开始就OnTrade中下单,涨跌停没有更新
            _dictDepthMarketData[pDepthMarketData.InstrumentID] = pDepthMarketData;

            if (TimeMode.LocalTime == _TimeMode)
            {
                //为了生成正确的Bar,使用本地时间
                _dateTime = Clock.Now;
            }
            else
            {
                //直接按HH:mm:ss来解析,测试过这种方法目前是效率比较高的方法
                int HH = int.Parse(pDepthMarketData.UpdateTime.Substring(0, 2));
                int mm = int.Parse(pDepthMarketData.UpdateTime.Substring(3, 2));
                int ss = int.Parse(pDepthMarketData.UpdateTime.Substring(6, 2));

                _dateTime = new DateTime(_yyyy, _MM, _dd, HH, mm, ss, pDepthMarketData.UpdateMillisec);
            }

            if (record.TradeRequested)
            {
                //通过测试,发现IB的Trade与Quote在行情过来时数量是不同的,在这也做到不同
                if (DepthMarket.LastPrice == pDepthMarketData.LastPrice
                    && DepthMarket.Volume == pDepthMarketData.Volume)
                { }
                else
                {
                    //行情过来时是今天累计成交量,得转换成每个tick中成交量之差
                    int volume = pDepthMarketData.Volume - DepthMarket.Volume;
                    if (0 == DepthMarket.Volume)
                    {
                        //没有接收到最开始的一条,所以这计算每个Bar的数据时肯定超大,强行设置为0
                        volume = 0;
                    }
                    else if (volume < 0)
                    {
                        //如果隔夜运行,会出现今早成交量0-昨收盘成交量,出现负数,所以当发现为负时要修改
                        volume = pDepthMarketData.Volume;
                    }

                    Trade trade = new Trade(_dateTime,
                        pDepthMarketData.LastPrice == double.MaxValue ? 0 : pDepthMarketData.LastPrice,
                        volume);

                    if (null != MarketDataFilter)
                    {
                        Trade t = MarketDataFilter.FilterTrade(trade, instrument.Symbol);
                        if (null != t)
                        {
                            EmitNewTradeEvent(instrument, t);
                        }
                    }
                    else
                    {
                        EmitNewTradeEvent(instrument, trade);
                    }
                }
            }

            if (record.QuoteRequested)
            {
                //if (
                //DepthMarket.BidVolume1 == pDepthMarketData.BidVolume1
                //&& DepthMarket.AskVolume1 == pDepthMarketData.AskVolume1
                //&& DepthMarket.BidPrice1 == pDepthMarketData.BidPrice1
                //&& DepthMarket.AskPrice1 == pDepthMarketData.AskPrice1
                //)
                //{ }
                //else
                {
                    Quote quote = new Quote(_dateTime,
                        pDepthMarketData.BidPrice1 == double.MaxValue ? 0 : pDepthMarketData.BidPrice1,
                        pDepthMarketData.BidVolume1,
                        pDepthMarketData.AskPrice1 == double.MaxValue ? 0 : pDepthMarketData.AskPrice1,
                        pDepthMarketData.AskVolume1
                    );

                    if (null != MarketDataFilter)
                    {
                        Quote q = MarketDataFilter.FilterQuote(quote, instrument.Symbol);
                        if (null != q)
                        {
                            EmitNewQuoteEvent(instrument, q);
                        }
                    }
                    else
                    {
                        EmitNewQuoteEvent(instrument, quote);
                    }
                }
            }

            if (record.MarketDepthRequested)
            {
                EmitNewMarketDepth(instrument, _dateTime, 0, MDSide.Ask, pDepthMarketData.AskPrice1, pDepthMarketData.AskVolume1);
                EmitNewMarketDepth(instrument, _dateTime, 0, MDSide.Bid, pDepthMarketData.BidPrice1, pDepthMarketData.BidVolume1);

                //EmitNewMarketDepth(instrument, _dateTime, 1, MDSide.Ask, pDepthMarketData.AskPrice2, pDepthMarketData.AskVolume2);
                //EmitNewMarketDepth(instrument, _dateTime, 1, MDSide.Bid, pDepthMarketData.BidPrice2, pDepthMarketData.BidVolume2);

                //EmitNewMarketDepth(instrument, _dateTime, 2, MDSide.Ask, pDepthMarketData.AskPrice3, pDepthMarketData.AskVolume3);
                //EmitNewMarketDepth(instrument, _dateTime, 2, MDSide.Bid, pDepthMarketData.BidPrice3, pDepthMarketData.BidVolume3);

                //EmitNewMarketDepth(instrument, _dateTime, 3, MDSide.Ask, pDepthMarketData.AskPrice4, pDepthMarketData.AskVolume4);
                //EmitNewMarketDepth(instrument, _dateTime, 3, MDSide.Bid, pDepthMarketData.BidPrice4, pDepthMarketData.BidVolume4);

                //EmitNewMarketDepth(instrument, _dateTime, 4, MDSide.Ask, pDepthMarketData.AskPrice5, pDepthMarketData.AskVolume5);
                //EmitNewMarketDepth(instrument, _dateTime, 4, MDSide.Bid, pDepthMarketData.BidPrice5, pDepthMarketData.BidVolume5);
            }
        }
Exemplo n.º 15
0
        private void radMenuItem8_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() != DialogResult.OK) return;

            Task.Factory.StartNew(() =>
            {
                string filename = openFileDialog1.FileName;

                foreach (string line in File.ReadAllLines(filename))
                {
                    string[] datas = line.Split(',');

                    var data = new CThostFtdcDepthMarketDataField();
                    data.InstrumentID = datas[0];
                    data.LastPrice = Double.Parse(datas[1]);
                    data.AveragePrice = Double.Parse(datas[2])*300;
                    data.UpdateTime = datas[3];
                    data.UpdateMillisec = Convert.ToInt32(datas[4]);
                    data.ExchangeID = "CZCE";

                    MarketManager.AddSimData(data);
                    Thread.Sleep(100);
                }
            }
                );
        }
Exemplo n.º 16
0
 //void OnRspQryDepthMarketData(CThostFtdcDepthMarketDataField pDepthMarketData)
 //{
 //    Console.WriteLine("==取深度行情");
 //    Console.WriteLine(pDepthMarketData.InstrumentID);
 //    Console.WriteLine(pDepthMarketData.LastPrice);
 //    Console.WriteLine(pDepthMarketData.UpperLimitPrice);
 //    Console.WriteLine(pDepthMarketData.LowerLimitPrice);
 //}
 void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     // 得打开EmitOnRtnDepthMarketData开关
     Console.WriteLine("++订阅深度行情");
     Console.WriteLine(pDepthMarketData.InstrumentID);
     Console.WriteLine(pDepthMarketData.LastPrice);
     Console.WriteLine(pDepthMarketData.OpenInterest);
 }
        private void OnRtnDepthMarketData(IntPtr pApi, ref CThostFtdcDepthMarketDataField pDepthMarketData)
        {
#if CTP
            string symbol = pDepthMarketData.InstrumentID;
#elif CTPZQ
            string symbol = GetYahooSymbol(pDepthMarketData.InstrumentID, pDepthMarketData.ExchangeID);
#endif
            DataRecord record;
            if (!_dictAltSymbol2Instrument.TryGetValue(symbol, out record))
            {
                mdlog.Warn("合约{0}不在订阅列表中却收到了数据", symbol);
                return;
            }

            Instrument instrument = record.Instrument;

            CThostFtdcDepthMarketDataField DepthMarket;
            _dictDepthMarketData.TryGetValue(symbol, out DepthMarket);

            //将更新字典的功能提前,因为如果一开始就OnTrade中下单,涨跌停没有更新
            _dictDepthMarketData[symbol] = pDepthMarketData;

            if (TimeMode.LocalTime == _TimeMode)
            {
                //为了生成正确的Bar,使用本地时间
                _dateTime = Clock.Now;
            }
            else
            {
                //直接按HH:mm:ss来解析,测试过这种方法目前是效率比较高的方法
                try
                {
                    // 只有使用交易所行情时才需要处理跨天的问题
#if CTP
                    ChangeActionDay(pDepthMarketData.ActionDay);
#else
                    ChangeActionDay(pDepthMarketData.TradingDay);
#endif

                    int HH = int.Parse(pDepthMarketData.UpdateTime.Substring(0, 2));
                    int mm = int.Parse(pDepthMarketData.UpdateTime.Substring(3, 2));
                    int ss = int.Parse(pDepthMarketData.UpdateTime.Substring(6, 2));

                    _dateTime = new DateTime(_yyyy, _MM, _dd, HH, mm, ss, pDepthMarketData.UpdateMillisec);
                }
                catch (Exception)
                {
                    _dateTime = Clock.Now;
                }
            }

            if (record.TradeRequested)
            {
                //通过测试,发现IB的Trade与Quote在行情过来时数量是不同的,在这也做到不同
                if (DepthMarket.LastPrice == pDepthMarketData.LastPrice
                    && DepthMarket.Volume == pDepthMarketData.Volume)
                { }
                else
                {
                    //行情过来时是今天累计成交量,得转换成每个tick中成交量之差
                    int volume = pDepthMarketData.Volume - DepthMarket.Volume;
                    if (0 == DepthMarket.Volume)
                    {
                        //没有接收到最开始的一条,所以这计算每个Bar的数据时肯定超大,强行设置为0
                        volume = 0;
                    }
                    else if (volume < 0)
                    {
                        //如果隔夜运行,会出现今早成交量0-昨收盘成交量,出现负数,所以当发现为负时要修改
                        volume = pDepthMarketData.Volume;
                    }

                    // 使用新的类,保存更多信息
                    CTPTrade trade = new CTPTrade(_dateTime,
                        pDepthMarketData.LastPrice == double.MaxValue ? 0 : pDepthMarketData.LastPrice,
                        volume);

                    // 记录深度数据
                    trade.DepthMarketData = pDepthMarketData;

                    EmitNewTradeEvent(instrument, trade);
                }
            }

            if (record.QuoteRequested)
            {
                //if (
                //DepthMarket.BidVolume1 == pDepthMarketData.BidVolume1
                //&& DepthMarket.AskVolume1 == pDepthMarketData.AskVolume1
                //&& DepthMarket.BidPrice1 == pDepthMarketData.BidPrice1
                //&& DepthMarket.AskPrice1 == pDepthMarketData.AskPrice1
                //)
                //{ }
                //else
                {
                    CTPQuote quote = new CTPQuote(_dateTime,
                        pDepthMarketData.BidPrice1 == double.MaxValue ? 0 : pDepthMarketData.BidPrice1,
                        pDepthMarketData.BidVolume1,
                        pDepthMarketData.AskPrice1 == double.MaxValue ? 0 : pDepthMarketData.AskPrice1,
                        pDepthMarketData.AskVolume1
                    );

                    quote.DepthMarketData = pDepthMarketData;

                    EmitNewQuoteEvent(instrument, quote);
                }
            }

            if (record.MarketDepthRequested)
            {
                bool bAsk = true;
                bool bBid = true;

                if (bAsk)
                    bAsk = EmitNewMarketDepth(instrument, _dateTime, 0, MDSide.Ask, pDepthMarketData.AskPrice1, pDepthMarketData.AskVolume1);
                if (bBid)
                    bBid = EmitNewMarketDepth(instrument, _dateTime, 0, MDSide.Bid, pDepthMarketData.BidPrice1, pDepthMarketData.BidVolume1);
#if CTPZQ
                if(bAsk)
                    bAsk = EmitNewMarketDepth(instrument, _dateTime, 1, MDSide.Ask, pDepthMarketData.AskPrice2, pDepthMarketData.AskVolume2);
                if(bBid)
                    bBid = EmitNewMarketDepth(instrument, _dateTime, 1, MDSide.Bid, pDepthMarketData.BidPrice2, pDepthMarketData.BidVolume2);

                if(bAsk)
                    bAsk = EmitNewMarketDepth(instrument, _dateTime, 2, MDSide.Ask, pDepthMarketData.AskPrice3, pDepthMarketData.AskVolume3);
                if(bBid)
                    bBid = EmitNewMarketDepth(instrument, _dateTime, 2, MDSide.Bid, pDepthMarketData.BidPrice3, pDepthMarketData.BidVolume3);

                if(bAsk)
                    bAsk = EmitNewMarketDepth(instrument, _dateTime, 3, MDSide.Ask, pDepthMarketData.AskPrice4, pDepthMarketData.AskVolume4);
                if(bBid)
                    bBid = EmitNewMarketDepth(instrument, _dateTime, 3, MDSide.Bid, pDepthMarketData.BidPrice4, pDepthMarketData.BidVolume4);

                if(bAsk)
                    bAsk = EmitNewMarketDepth(instrument, _dateTime, 4, MDSide.Ask, pDepthMarketData.AskPrice5, pDepthMarketData.AskVolume5);
                if(bBid)
                    bBid = EmitNewMarketDepth(instrument, _dateTime, 4, MDSide.Bid, pDepthMarketData.BidPrice5, pDepthMarketData.BidVolume5);
#endif
            }
        }
Exemplo n.º 18
0
 public OnRspQryDepthMarketDataArgs(IntPtr pTraderApi, ref CThostFtdcDepthMarketDataField pDepthMarketData, ref CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast)
 {
     this.pTraderApi = pTraderApi;
     this.pDepthMarketData = pDepthMarketData;
     this.pRspInfo = pRspInfo;
     this.nRequestID = nRequestID;
     this.bIsLast = bIsLast;
 }
Exemplo n.º 19
0
 private void OnRspQryDepthMarketData_callback(IntPtr pTraderApi, ref CThostFtdcDepthMarketDataField pDepthMarketData, ref CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast)
 {
     if (null != OnRspQryDepthMarketData)
     {
         OnRspQryDepthMarketData(this, new OnRspQryDepthMarketDataArgs(pTraderApi, ref pDepthMarketData, ref pRspInfo, nRequestID, bIsLast));
     }
 }
Exemplo n.º 20
0
 public MarketData(CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     CopyFrom(pDepthMarketData);
 }