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)); } }
public void FireOnRspQryDepthMarketData(CThostFtdcDepthMarketDataField pDepthMarketData) { if (null != OnRspQryDepthMarketData) { OnRspQryDepthMarketData(pDepthMarketData); } }
private void OnRtnDepthMarketData_callback(IntPtr pMdUserApi, ref CThostFtdcDepthMarketDataField pDepthMarketData) { if (null != OnRtnDepthMarketData) { OnRtnDepthMarketData(this, new OnRtnDepthMarketDataArgs(pMdUserApi, ref pDepthMarketData)); } }
/// <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)); }
void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField pDepthMarketData) { // 得打开EmitOnRtnDepthMarketData开关 Console.WriteLine("++订阅深度行情"); Console.WriteLine(pDepthMarketData.InstrumentID); Console.WriteLine(pDepthMarketData.LastPrice); Console.WriteLine(pDepthMarketData.OpenInterest); }
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; }
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)); }
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)); } }
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"); } }
/// <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); } }
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); } }
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; }
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 } }
public OnRtnDepthMarketDataArgs(IntPtr pMdUserApi, ref CThostFtdcDepthMarketDataField pDepthMarketData) { this.pMdUserApi = pMdUserApi; this.pDepthMarketData = pDepthMarketData; }
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); }
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; } }
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)); } }
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()); } } }
private void OnRspQryDepthMarketData_3(ref CThostFtdcDepthMarketDataField pDepthMarketData, ref CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast) { OnRspQryDepthMarketData_1(this, ref pDepthMarketData, ref pRspInfo, nRequestID, bIsLast); }
//构造函数 public DepthMarketData(CThostFtdcDepthMarketDataField dmdf) { this.CThostFtdcMarketDepthDataFieldInstance = dmdf; this._futureCode = GetFutureCode(_dmdf.InstrumentID); Notify(""); }
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); }
/// <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); }
/// <summary> /// 行情回报 /// </summary> /// <param name="pDepthMarketData"></param> public virtual void OnRtnDepthMarketData(ref CThostFtdcDepthMarketDataField pDepthMarketData) { }
public OnRtnDepthMarketDataArgs(ref CThostFtdcDepthMarketDataField pDepthMarketData) { this.pDepthMarketData = pDepthMarketData; }