Exemple #1
0
 public OnRspQryDepthMarketDataArgs(ref CThostFtdcDepthMarketDataField pDepthMarketData, ref CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast)
 {
     this.pDepthMarketData = pDepthMarketData;
     this.pRspInfo         = pRspInfo;
     this.nRequestID       = nRequestID;
     this.bIsLast          = bIsLast;
 }
 private void OnRspQryDepthMarketData_callback(object sender, ref CThostFtdcDepthMarketDataField pDepthMarketData, ref CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast)
 {
     if (null != OnRspQryDepthMarketData)
     {
         OnRspQryDepthMarketData(this, new OnRspQryDepthMarketDataArgs(ref pDepthMarketData, ref pRspInfo, nRequestID, bIsLast));
     }
 }
Exemple #3
0
 public void FireOnRspQryDepthMarketData(CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     if (null != OnRspQryDepthMarketData)
     {
         OnRspQryDepthMarketData(pDepthMarketData);
     }
 }
Exemple #4
0
 private void OnRtnDepthMarketData_callback(IntPtr pMdUserApi, ref CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     if (null != OnRtnDepthMarketData)
     {
         OnRtnDepthMarketData(this, new OnRtnDepthMarketDataArgs(pMdUserApi, ref pDepthMarketData));
     }
 }
Exemple #5
0
        /// <summary>
        /// 行情数据回调函数,同时引发_OnTick多播事件。
        /// </summary>
        /// <param name="pDepthMarketData"></param>
        private void CMdApi_OnRtnDepthMarketData(ref CThostFtdcDepthMarketDataField pDepthMarketData)
        {
            //添加到字典中
            string          instrumentIDKey = pDepthMarketData.InstrumentID;
            DepthMarketData dmd             = this._DictDepthMarketData[instrumentIDKey];

            dmd.CThostFtdcMarketDepthDataFieldInstance = pDepthMarketData;
            this._OnRtnDMD?.Invoke(dmd);

            //后台线程调用OnTick多播委托
            //Task.Run(() =>
            //{
            Tick tick = new Tick();

            tick.AskPrice       = dmd.AskPrice1;
            tick.BidPrice       = dmd.BidPrice1;
            tick.AskVolume      = dmd.AskVolume1;
            tick.BidVolume      = dmd.BidVolume1;
            tick.InstrumentID   = dmd.InstrumentID;
            tick.LastPrice      = dmd.LastPrice;
            tick.OpenInt        = dmd.OpenInterest;
            tick.UpdateTime     = dmd.TradingDay + " " + dmd.UpdateTime;
            tick.UpdateMillisec = dmd.UpdateMillisec;
            tick.Volume         = dmd.Volume;
            _OnRtnTick?.Invoke(tick);
            //}
            //);

            //引发更新事件
            //this._queueDepthMarketDataField.Enqueue(pDepthMarketData);
            //Task.Run(() => TaskProcessor(this._queueDepthMarketDataField, _cts.Token));
        }
Exemple #6
0
 void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     // 得打开EmitOnRtnDepthMarketData开关
     Console.WriteLine("++订阅深度行情");
     Console.WriteLine(pDepthMarketData.InstrumentID);
     Console.WriteLine(pDepthMarketData.LastPrice);
     Console.WriteLine(pDepthMarketData.OpenInterest);
 }
Exemple #7
0
 void OnRspQryDepthMarketData(CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     Console.WriteLine("==取深度行情");
     Console.WriteLine(pDepthMarketData.InstrumentID);
     Console.WriteLine(pDepthMarketData.LastPrice);
     Console.WriteLine(pDepthMarketData.UpperLimitPrice);
     Console.WriteLine(pDepthMarketData.LowerLimitPrice);
 }
        static void onRtnDepthMarketDataCallback(ref CThostFtdcDepthMarketDataField pDepthMarketData)
        {
            //if (!string.IsNullOrWhiteSpace(pDepthMarketData.InstrumentID) && !pDepthMarketData.InstrumentID.StartsWith("SP"))

            strMarketData += pDepthMarketData.LastPrice.ToString() + "\t" + pDepthMarketData.Volume.ToString() + "\r";
            Console.WriteLine(pDepthMarketData.LastPrice.ToString() + "\t" + pDepthMarketData.Volume.ToString() + "\r");
            theCount += 1;
        }
Exemple #9
0
        private void CMdApi_OnRtnDepthMarketData(ref CThostFtdcDepthMarketDataField pDepthMarketData)
        {
            CThostFtdcDepthMarketDataField dmdf = pDepthMarketData;

            this._dicDepthMarketData[dmdf.InstrumentID].CThostFtdcMarketDepthDataFieldInstance = dmdf;
            Task.Run(() => _OnTick?.Invoke(this._dicDepthMarketData[dmdf.InstrumentID]));
            //引发更新事件
            //this._queueDepthMarketDataField.Enqueue(pDepthMarketData);
            //Task.Run(() => TaskProcessor(this._queueDepthMarketDataField, _cts.Token));
        }
Exemple #10
0
 public virtual void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     if (SwigDerivedClassHasMethod("OnRtnDepthMarketData", swigMethodTypes10))
     {
         thostmdapiPINVOKE.CThostFtdcMdSpi_OnRtnDepthMarketDataSwigExplicitCThostFtdcMdSpi(swigCPtr, CThostFtdcDepthMarketDataField.getCPtr(pDepthMarketData));
     }
     else
     {
         thostmdapiPINVOKE.CThostFtdcMdSpi_OnRtnDepthMarketData(swigCPtr, CThostFtdcDepthMarketDataField.getCPtr(pDepthMarketData));
     }
 }
Exemple #11
0
 public override void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     if (pDepthMarketData != null)
     {
         Console.WriteLine("OnRtnDepthMarketData {0} {1} {2}", pDepthMarketData.InstrumentID,
                           pDepthMarketData.UpdateTime, pDepthMarketData.LastPrice);
     }
     else
     {
         Console.WriteLine("Empty market data");
     }
 }
Exemple #12
0
        /// <summary>
        /// 行情数据回调
        /// </summary>
        /// <param name="pDepthMarketData">深度行情</param>
        private void OnRtnDepthMarketData(ref CThostFtdcDepthMarketDataField pDepthMarketData)
        {
            CTPMarketData marketData = new CTPMarketData()
            {
                InstrmentID        = pDepthMarketData.InstrumentID,
                ExchangeID         = pDepthMarketData.ExchangeInstID,
                LastPrice          = ConvertToDecimal(pDepthMarketData.LastPrice),
                PreSettlementPrice = ConvertToDecimal(pDepthMarketData.PreSettlementPrice),
                PreClosePrice      = ConvertToDecimal(pDepthMarketData.PreClosePrice),
                PreOpenInterest    = ConvertToDecimal(pDepthMarketData.PreOpenInterest),
                OpenPrice          = ConvertToDecimal(pDepthMarketData.OpenPrice),
                HighestPrice       = ConvertToDecimal(pDepthMarketData.HighestPrice),
                LowestPrice        = ConvertToDecimal(pDepthMarketData.LowestPrice),
                Volume             = pDepthMarketData.Volume,
                Turnover           = ConvertToDecimal(pDepthMarketData.Turnover),
                OpenInterest       = ConvertToDecimal(pDepthMarketData.OpenInterest),
                ClosePrice         = ConvertToDecimal(pDepthMarketData.ClosePrice),
                SettlementPrice    = ConvertToDecimal(pDepthMarketData.SettlementPrice),
                UpperLimitPrice    = ConvertToDecimal(pDepthMarketData.UpperLimitPrice),
                LowerLimitPrice    = ConvertToDecimal(pDepthMarketData.LowerLimitPrice),
                BidPrice1          = ConvertToDecimal(pDepthMarketData.BidPrice1),
                BidPrice2          = ConvertToDecimal(pDepthMarketData.BidPrice2),
                BidPrice3          = ConvertToDecimal(pDepthMarketData.BidPrice3),
                BidPrice4          = ConvertToDecimal(pDepthMarketData.BidPrice4),
                BidPrice5          = ConvertToDecimal(pDepthMarketData.BidPrice5),
                BidVolume1         = pDepthMarketData.BidVolume1,
                BidVolume2         = pDepthMarketData.BidVolume2,
                BidVolume3         = pDepthMarketData.BidVolume3,
                BidVolume4         = pDepthMarketData.BidVolume4,
                BidVolume5         = pDepthMarketData.BidVolume5,
                AskPrice1          = ConvertToDecimal(pDepthMarketData.AskPrice1),
                AskPrice2          = ConvertToDecimal(pDepthMarketData.AskPrice2),
                AskPrice3          = ConvertToDecimal(pDepthMarketData.AskPrice3),
                AskPrice4          = ConvertToDecimal(pDepthMarketData.AskPrice4),
                AskPrice5          = ConvertToDecimal(pDepthMarketData.AskPrice5),
                AskVolume1         = pDepthMarketData.AskVolume1,
                AskVolume2         = pDepthMarketData.AskVolume2,
                AskVolume3         = pDepthMarketData.AskVolume3,
                AskVolume4         = pDepthMarketData.AskVolume4,
                AskVolume5         = pDepthMarketData.AskVolume5,
            };

            if (marketData.LastPrice > 0 && marketData.PreClosePrice > 0)
            {
                marketData.AdvanceDeclineAmount = marketData.LastPrice - marketData.PreClosePrice;
                marketData.AdvanceDecline       = Math.Round(marketData.AdvanceDeclineAmount / marketData.PreClosePrice, 4,
                                                             MidpointRounding.AwayFromZero);
            }
            if (OnMarketDataChanged != null)
            {
                OnMarketDataChanged.Invoke(marketData);
            }
        }
Exemple #13
0
        void quote_DepthMarketDataResponse(object sender, CTPEventArgs <CThostFtdcDepthMarketDataField> e)
        {
            CThostFtdcDepthMarketDataField newValue = e.Value;

            UpdateBindTable(this.idQuoteDataGridView, e.Value,
                            (DataRow row, Object obj) =>
            {
                CThostFtdcDepthMarketDataField data = (CThostFtdcDepthMarketDataField)obj;

                return(row["InstrumentID"].ToString() == data.InstrumentID);
            });


            //this.idQuoteDataGridView.InvalidateRow(index);
        }
 public override void OnRtnQuote(TapAPIQuoteWhole info)
 {
     if (info != null)
     {
         var field = new CThostFtdcDepthMarketDataField()
         {
             TradingDay     = "",
             InstrumentID   = info.Contract.Commodity.CommodityNo + info.Contract.ContractNo1,
             ExchangeID     = info.Contract.Commodity.ExchangeNo,
             ExchangeInstID = "",
             LastPrice      = info.QLastPrice,
             Volume         = (int)info.QLastQty
         };
         _callbackApi.OnRtnDepthMarketData(field);
     }
 }
        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);
        }
        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);
            }
        }
Exemple #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;
 }
Exemple #19
0
 private void OnRtnDepthMarketData_callback(IntPtr pMdUserApi, ref CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     if (null != OnRtnDepthMarketData)
     {
         OnRtnDepthMarketData(this, new OnRtnDepthMarketDataArgs(pMdUserApi, ref pDepthMarketData));
     }
 }
        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
            }
        }
Exemple #21
0
 public OnRtnDepthMarketDataArgs(IntPtr pMdUserApi, ref CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     this.pMdUserApi = pMdUserApi;
     this.pDepthMarketData = pDepthMarketData;
 }
Exemple #22
0
 private void OnRtnDepthMarketData_3(IntPtr pMdUserApi, ref CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     OnRtnDepthMarketData_1(this, pMdUserApi, ref pDepthMarketData);
 }
 ///请求查询行情响应
 public void OnRspQryDepthMarketData(CThostFtdcDepthMarketDataField pDepthMarketData,
                                     CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast)
 {
     Console.WriteLine("OnRspQryDepthMarketData");
 }
 internal static global::System.Runtime.InteropServices.HandleRef getCPtr(CThostFtdcDepthMarketDataField obj)
 {
     return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr);
 }
Exemple #25
0
        private void OnRtnDepthMarketData(IntPtr pApi, ref CThostFtdcDepthMarketDataField pDepthMarketData)
        {
            CThostFtdcDepthMarketDataField DepthMarket;

            if (_dictDepthMarketData.TryGetValue(pDepthMarketData.InstrumentID, out DepthMarket))
            {
                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);
                }

                //通过测试,发现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;
                    }

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

                    EmitNewTradeEvent(_dictAltSymbol2Instrument[pDepthMarketData.InstrumentID], 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
                                            );

                    EmitNewQuoteEvent(_dictAltSymbol2Instrument[pDepthMarketData.InstrumentID], quote);
                }

                _dictDepthMarketData[pDepthMarketData.InstrumentID] = pDepthMarketData;
            }
        }
Exemple #26
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));
     }
 }
Exemple #27
0
        public void SendMarketDataRequest(FIXMarketDataRequest request)
        {
            lock (this)
            {
                switch (request.SubscriptionRequestType)
                {
                case DataManager.MARKET_DATA_SUBSCRIBE:
                    if (!_bMdConnected)
                    {
                        EmitError(-1, -1, "行情服务器没有连接,无法订阅行情");
                        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(this.Name);

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

                        _dictAltSymbol2Instrument[altSymbol] = inst;

                        MdApi.MD_Subscribe(m_pMdApi, altSymbol);
                    }
                    if (!_bTdConnected)
                    {
                        EmitError(-1, -1, "交易服务器没有连接,无法保证持仓真实");
                        return;
                    }
                    TraderApi.TD_ReqQryInvestorPosition(m_pTdApi, null);
                    timerPonstion.Enabled = false;
                    timerPonstion.Enabled = true;
                    break;

                case DataManager.MARKET_DATA_UNSUBSCRIBE:
                    if (!_bMdConnected)
                    {
                        EmitError(-1, -1, "行情服务器没有连接,退订合约无效");
                        return;
                    }
                    for (int i = 0; i < request.NoRelatedSym; ++i)
                    {
                        FIXRelatedSymGroup group = request.GetRelatedSymGroup(i);

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

                        _dictDepthMarketData.Remove(altSymbol);

                        MdApi.MD_Unsubscribe(m_pMdApi, altSymbol);
                    }
                    break;

                default:
                    throw new ArgumentException("Unknown subscription type: " + request.SubscriptionRequestType.ToString());
                }
            }
        }
Exemple #28
0
 private void OnRtnDepthMarketData_3(IntPtr pMdUserApi, ref CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     OnRtnDepthMarketData_1(this, pMdUserApi, ref pDepthMarketData);
 }
Exemple #29
0
 public OnRtnDepthMarketDataArgs(IntPtr pMdUserApi, ref CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     this.pMdUserApi       = pMdUserApi;
     this.pDepthMarketData = pDepthMarketData;
 }
Exemple #30
0
 private void OnRspQryDepthMarketData_3(ref CThostFtdcDepthMarketDataField pDepthMarketData, ref CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast)
 {
     OnRspQryDepthMarketData_1(this, ref pDepthMarketData, ref pRspInfo, nRequestID, bIsLast);
 }
Exemple #31
0
 //构造函数
 public DepthMarketData(CThostFtdcDepthMarketDataField dmdf)
 {
     this.CThostFtdcMarketDepthDataFieldInstance = dmdf;
     this._futureCode = GetFutureCode(_dmdf.InstrumentID);
     Notify("");
 }
Exemple #32
0
 private void OnRspQryDepthMarketData_3(IntPtr pTraderApi, ref CThostFtdcDepthMarketDataField pDepthMarketData, ref CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast)
 {
     OnRspQryDepthMarketData_1(this, pTraderApi, ref pDepthMarketData, ref pRspInfo, nRequestID, bIsLast);
 }
Exemple #33
0
        /// <summary>
        /// 深度行情通知,当SubscribeMarketData订阅行情后,行情通知由此推送
        /// </summary>
        /// <param name="pDepthMarketData"></param>
        private void CTPOnRtnDepthMarketData(ref CThostFtdcDepthMarketDataField pDepthMarketData)
        {
            CThostFtdcDepthMarketDataField f = pDepthMarketData;

            if (string.IsNullOrEmpty(f.InstrumentID) || string.IsNullOrEmpty(f.UpdateTime) || double.IsInfinity(f.UpperLimitPrice))            //过滤无穷大/小
            {
                return;
            }
            //修正last=double.max
            if (Math.Abs(f.LastPrice - double.MaxValue) < double.Epsilon)
            {
                if (Math.Abs(f.AskPrice1 - double.MaxValue) > double.Epsilon)
                {
                    f.LastPrice = f.AskPrice1;
                }
                else if (Math.Abs(f.BidPrice1 - double.MaxValue) > double.Epsilon)
                {
                    f.LastPrice = f.BidPrice1;
                }
                else
                {
                    return;
                }
            }

            //去掉tradingday字段
            //if (string.IsNullOrEmpty(f.TradingDay))
            //{
            //	f.TradingDay = this.TradingDay; //日期:实盘中某些交易所,此字段为空
            //}
            //if (string.IsNullOrEmpty(f.ActionDay)) //此字段可能为空
            //{
            //	f.ActionDay = this.TradingDay;
            //}
            //f.ExchangeID = instrument.ExchangeID;
            //处理,单边有挂边的情况
            if (f.AskPrice1 > f.UpperLimitPrice)             //未赋值的数据
            {
                f.AskPrice1 = f.LastPrice;
            }
            if (f.BidPrice1 > f.UpperLimitPrice)
            {
                f.BidPrice1 = f.LastPrice;
            }
            //修最高/最低
            if (Math.Abs(f.HighestPrice - double.MaxValue) < double.Epsilon)
            {
                f.HighestPrice = f.AskPrice1;
            }
            if (Math.Abs(f.LowestPrice - double.MaxValue) < double.Epsilon)
            {
                f.LowestPrice = f.BidPrice1;
            }

            HaiFeng.MarketData tick = DicTick.GetOrAdd(f.InstrumentID, new HaiFeng.MarketData
            {
                InstrumentID = f.InstrumentID,
            });


            if (f.UpdateMillisec == 0 && f.UpdateTime == tick.UpdateTime && tick.UpdateMillisec < 990)              //某些交易所(如郑商所)相同秒数的ms均为0
            {
                f.UpdateMillisec = tick.UpdateMillisec + 10;
            }

            tick.AskPrice        = f.AskPrice1;
            tick.AskVolume       = f.AskVolume1;
            tick.AveragePrice    = f.AveragePrice;
            tick.BidPrice        = f.BidPrice1;
            tick.BidVolume       = f.BidVolume1;
            tick.LastPrice       = f.LastPrice;
            tick.OpenInterest    = f.OpenInterest;
            tick.UpdateMillisec  = f.UpdateMillisec;
            tick.UpdateTime      = f.UpdateTime;
            tick.Volume          = f.Volume;
            tick.UpperLimitPrice = f.UpperLimitPrice;
            tick.LowerLimitPrice = f.LowerLimitPrice;

            //避免突然的波动
            bool crack = false;

            if (tick.LastPrice != 0)            //非首tick
            {
                crack = Math.Abs(this.DicTick[tick.InstrumentID].LastPrice - tick.LastPrice) > 100 * (f.AskPrice1 - f.BidPrice1);
            }
            this.DicTick[tick.InstrumentID] = tick;

            if (_OnRtnTick == null || crack)
            {
                return;                                         //剧烈波动过滤掉
            }
            _OnRtnTick(this, new TickEventArgs
            {
                Tick = tick
            });
        }
 public override void OnRspQryDepthMarketData(CThostFtdcDepthMarketDataField pDepthMarketData, CThostFtdcRspInfoField pRspInfo,
                                              int nRequestID, bool bIsLast)
 {
     _callbackApi.OnRspQryDepthMarketData(pDepthMarketData, pRspInfo, nRequestID, bIsLast);
 }
Exemple #35
0
 /// <summary>
 /// 行情回报
 /// </summary>
 /// <param name="pDepthMarketData"></param>
 public virtual void OnRtnDepthMarketData(ref CThostFtdcDepthMarketDataField pDepthMarketData)
 {
 }
Exemple #36
0
 public OnRtnDepthMarketDataArgs(ref CThostFtdcDepthMarketDataField pDepthMarketData)
 {
     this.pDepthMarketData = pDepthMarketData;
 }