Exemplo n.º 1
0
        ///深度行情通知
        private void NativeOnRtnDepthMarketData(CtpDepthMarketData depthMarketData)
        {
            var rsp = new CtpResponse();

            rsp.TypeId = CtpResponseType.OnRtnDepthMarketData;
            rsp.Item1  = new CtpAny(depthMarketData);
            ProcessResponse(ref rsp);
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
 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;
     }
 }
Exemplo n.º 4
0
 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);
     }
 }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
 public static void SetCzceExchangeTime(CtpDepthMarketData data, DepthMarketDataField market)
 {
     SetExchangeTime(data, market);
 }
Exemplo n.º 7
0
        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);
        }