///深度行情通知 private void NativeOnRtnDepthMarketData(CtpDepthMarketData depthMarketData) { var rsp = new CtpResponse(); rsp.TypeId = CtpResponseType.OnRtnDepthMarketData; rsp.Item1 = new CtpAny(depthMarketData); ProcessResponse(ref rsp); }
public static DateTime GetExchangeTime(CtpDepthMarketData data) { //直接按HH:mm:ss来解析,测试过这种方法目前是效率比较高的方法 try { // 模拟时TradingDay周五晚上收的日期是周一,ActionDay为空 // 20140310 想来想去,时间的确定还是使用TradingDay,使用实际日期 // 20140315 TradingDay在夜盘时是第二天的时间,在行情去重Block会出错,使0点后的行情全无法传出 var span = GetSpan(data.UpdateTime); // 夜盘时间,从TradingDay中取的交易时间与日历不对,特别是周五晚到周六早上 // 本想取ActionDay,但模拟中目前为空 DateTime date; var dayText = data.ActionDay; // 除了有取出为“”的情况,还有取去为“$4”的情况,好吧,只能这样了 if (dayText.Length != 8) { // 如何证明慢了一天或快了一天呢? date = DateTime.Today; if (span.Hours >= 23) { if (date.Hour <= 1) { // 表示行情时间慢了,系统日期减一天即可 date = date.AddDays(-1); } } else if (span.Hours <= 1) { if (date.Hour >= 23) { // 表示本地时间慢了,本地时间加一天即可 date = date.AddDays(1); } } // !!!! 这种处理方法的后果是,如果你周日登录了 // 行情本是周六凌晨的最后一笔,变成了周日凌晨有一笔了 // 无所谓,这个错误数据由用户自己来过滤 } else { // 取的是ActionDay,这是最简单的结果 date = GetDate(dayText); } return(date.Add(span).AddMilliseconds(data.UpdateMillisec)); } catch (Exception) { // 这个地方到底是用哪个时间比较好, //return framework.Clock.DateTime; return(DateTime.Now); } }
public static void SetExchangeTime(CtpDepthMarketData data, DepthMarketDataField market) { market.TradingDay = GetDate(data.TradingDay); market.UpdateTime = GetTime(data.UpdateTime); market.UpdateMillisec = data.UpdateMillisec; if (market.UpdateTime < 60000) { market.ActionDay = market.TradingDay; } else { var now = DateTime.Today; market.ActionDay = now.Year * 10000 + now.Month * 100 + now.Day; } }
public static void SetExchangeTime(CtpDepthMarketData data, DepthMarketDataField market) { market.TradingDay = GetDate(data.TradingDay); market.UpdateTime = GetTime(data.UpdateTime); market.UpdateMillisec = data.UpdateMillisec; if (!string.IsNullOrEmpty(data.ActionDay) && data.ActionDay.Length == 8) { market.ActionDay = GetDate(data.ActionDay); } else { market.ActionDay = GetActionDay(market.UpdateTime); } }
private void OnRtnDepthMarketData(object sender, CtpDepthMarketData data) { var market = new DepthMarketDataField(); market.InstrumentID = data.InstrumentID; market.ExchangeID = data.ExchangeID; market.Exchange = CtpConvert.GetExchangeType(data.ExchangeID); switch (market.Exchange) { case ExchangeType.CZCE: CtpConvert.SetCzceExchangeTime(data, market); break; case ExchangeType.DCE: CtpConvert.SetDceExchangeTime(data, market); break; default: CtpConvert.SetExchangeTime(data, market); break; } market.LastPrice = CtpConvert.IsMax(data.LastPrice) ? 0 : data.LastPrice; market.Volume = data.Volume; market.OpenInterest = data.OpenInterest; market.Turnover = data.Turnover; market.AveragePrice = data.AveragePrice; if (CtpConvert.IsMax(data.OpenPrice)) { market.OpenPrice = 0; market.HighestPrice = 0; market.LowestPrice = 0; market.TradingPhase = TradingPhaseType.BeforeTrading; } else { market.OpenPrice = data.OpenPrice; market.HighestPrice = data.HighestPrice; market.LowestPrice = data.LowestPrice; market.TradingPhase = TradingPhaseType.Continuous; } if (CtpConvert.IsMax(data.ClosePrice)) { market.ClosePrice = 0; } else { market.ClosePrice = data.ClosePrice; market.TradingPhase = TradingPhaseType.Closed; } market.SettlementPrice = CtpConvert.IsMax(data.SettlementPrice) ? 0 : data.SettlementPrice; market.UpperLimitPrice = data.UpperLimitPrice; market.LowerLimitPrice = data.LowerLimitPrice; market.PreClosePrice = data.PreClosePrice; market.PreSettlementPrice = data.PreSettlementPrice; market.PreOpenInterest = data.PreOpenInterest; if (!CtpConvert.IsMax(data.AskPrice1)) { market.Asks = new[] { new DepthField { Price = data.AskPrice1, Size = data.AskVolume1 } }; } else { market.Asks = new DepthField[0]; } if (!CtpConvert.IsMax(data.BidPrice1)) { market.Bids = new[] { new DepthField { Price = data.BidPrice1, Size = data.BidVolume1 } }; } else { market.Bids = new DepthField[0]; } _spi.ProcessDepthMarketData(market); }
public static void SetCzceExchangeTime(CtpDepthMarketData data, DepthMarketDataField market) { SetExchangeTime(data, market); }
private void OnRtnDepthMarketData(object sender, CtpDepthMarketData data) { //Thread.Sleep(5000); var market = new DepthMarketDataField(); market.InstrumentID = data.InstrumentID; market.ExchangeID = data.ExchangeID; //market.Exchange = CtpConvert.GetExchangeType(data.ExchangeID); CtpConvert.SetExchangeTime(data, market); market.LastPrice = CtpConvert.IsInvalid(data.LastPrice) ? 0 : data.LastPrice; market.Volume = data.Volume; market.OpenInterest = data.OpenInterest; market.Turnover = data.Turnover; market.AveragePrice = data.AveragePrice; if (CtpConvert.IsInvalid(data.OpenPrice)) { market.OpenPrice = 0; market.HighestPrice = 0; market.LowestPrice = 0; //market.TradingPhase = TradingPhaseType.BeforeTrading; } else { market.OpenPrice = data.OpenPrice; market.HighestPrice = data.HighestPrice; market.LowestPrice = data.LowestPrice; //market.TradingPhase = TradingPhaseType.Continuous; } if (CtpConvert.IsInvalid(data.ClosePrice)) { market.ClosePrice = 0; } else { market.ClosePrice = data.ClosePrice; //market.TradingPhase = TradingPhaseType.Closed; } market.SettlementPrice = CtpConvert.IsInvalid(data.SettlementPrice) ? 0 : data.SettlementPrice; market.UpperLimitPrice = data.UpperLimitPrice; market.LowerLimitPrice = data.LowerLimitPrice; market.PreClosePrice = data.PreClosePrice; market.PreSettlementPrice = data.PreSettlementPrice; market.PreOpenInterest = data.PreOpenInterest; market.Asks = new DepthField[5]; market.Bids = new DepthField[5]; if (!CtpConvert.IsInvalid(data.AskPrice1)) { market.Asks[0].Price = data.AskPrice1; market.Asks[0].Size = data.AskVolume1; if (!CtpConvert.IsInvalid(data.AskPrice2)) { market.Asks[1].Price = data.AskPrice2; market.Asks[1].Size = data.AskVolume2; if (!CtpConvert.IsInvalid(data.AskPrice3)) { market.Asks[2].Price = data.AskPrice3; market.Asks[2].Size = data.AskVolume3; if (!CtpConvert.IsInvalid(data.AskPrice4)) { market.Asks[3].Price = data.AskPrice4; market.Asks[3].Size = data.AskVolume4; if (!CtpConvert.IsInvalid(data.AskPrice5)) { market.Asks[4].Price = data.AskPrice5; market.Asks[4].Size = data.AskVolume5; } } } } } if (!CtpConvert.IsInvalid(data.BidPrice1)) { market.Bids[0].Price = data.BidPrice1; market.Bids[0].Size = data.BidVolume1; if (!CtpConvert.IsInvalid(data.BidPrice2)) { market.Bids[1].Price = data.BidPrice2; market.Bids[1].Size = data.BidVolume2; if (!CtpConvert.IsInvalid(data.BidPrice3)) { market.Bids[2].Price = data.BidPrice3; market.Bids[2].Size = data.BidVolume3; if (!CtpConvert.IsInvalid(data.BidPrice4)) { market.Bids[3].Price = data.BidPrice4; market.Bids[3].Size = data.BidVolume4; if (!CtpConvert.IsInvalid(data.BidPrice5)) { market.Bids[4].Price = data.BidPrice5; market.Bids[4].Size = data.BidVolume5; } } } } } _spi.ProcessDepthMarketData(market); }