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; }
public void FireOnRspQryDepthMarketData(CThostFtdcDepthMarketDataField pDepthMarketData) { if (null != OnRspQryDepthMarketData) { OnRspQryDepthMarketData(pDepthMarketData); } }
void OnRspQryDepthMarketData(CThostFtdcDepthMarketDataField pDepthMarketData) { Console.WriteLine("==取深度行情"); Console.WriteLine(pDepthMarketData.InstrumentID); Console.WriteLine(pDepthMarketData.LastPrice); Console.WriteLine(pDepthMarketData.UpperLimitPrice); Console.WriteLine(pDepthMarketData.LowerLimitPrice); }
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); } }
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) { 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); } } }
public OnRtnDepthMarketDataArgs(IntPtr pMdUserApi, ref CThostFtdcDepthMarketDataField pDepthMarketData) { this.pMdUserApi = pMdUserApi; this.pDepthMarketData = pDepthMarketData; }
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); } }
public void AddSimData(CThostFtdcDepthMarketDataField pDepthMarketData) { marketQueue.Enqueue(pDepthMarketData); }
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); } }
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); } } ); }
//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 } }
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 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 MarketData(CThostFtdcDepthMarketDataField pDepthMarketData) { CopyFrom(pDepthMarketData); }