Beispiel #1
0
        private void OnRspQryHistoricalTicks_callback(object sender, IntPtr pTicks, int size1, ref HistoricalDataRequestField request, int size2, bool bIsLast)
        {
            int size = Marshal.SizeOf(typeof(TickField));

            (sender as XApi).GetLog().Info("<--OnRspQryHistoricalTicks:{0},{1},{2},{3}条", request.CurrentDate, request.InstrumentID, request.ExchangeID, size1 / size);
            HistoricalDataRecord record;

            if (!historicalDataRecords.TryGetValue(request.RequestId, out record))
            {
                return;
            }

            int      day        = -1;
            double   volume     = 0;
            DateTime datetime   = DateTime.MinValue;
            DateTime updatetime = DateTime.MinValue;

            List <DataObject> list = new List <DataObject>();

            for (int i = 0; i < size1 / size; ++i)
            {
                IntPtr    ptr = (IntPtr)(pTicks + size * i);
                TickField obj = Marshal.PtrToStructure <TickField>(ptr);

                DateTime dt = GetDateTime(obj.Date, obj.Time, obj.Millisecond);
                if (datetime == dt)
                {
                    updatetime = updatetime.AddMilliseconds(100);
                }
                else
                {
                    updatetime = dt;
                }
                if (day != updatetime.Day)
                {
                    volume = 0;
                }
                day    = updatetime.Day;
                volume = obj.Volume - volume;


                // 这地方应当加历史数据另存的地方才好
                if (SaveToCsv)
                {
                    LogEventInfo logEvent = new LogEventInfo(NLog.LogLevel.Trace, tickLog.Name, TickFieldToString(obj, updatetime, volume));

                    // 用户可能需要按收到数据的合约与时间分目录或文件
                    logEvent.Properties[Symbol] = record.Request.Instrument.Symbol;
                    logEvent.Properties[Date]   = request.CurrentDate;

                    tickLog.Log(logEvent);
                }


                if (FilterDateTime)
                {
                    if (FilterDateTime_(record.Request, updatetime))
                    {
                        DataObject o = null;

                        if (EmitAllTickType)
                        {
                            // 全面保存数据
                            o = new Trade(updatetime, this.id, record.Request.Instrument.Id, obj.LastPrice, (int)volume);
                            list.Add(o);
                            o = new Quote(updatetime, this.id, record.Request.Instrument.Id, obj.BidPrice1, obj.BidSize1, obj.AskPrice1, obj.AskSize1);
                            list.Add(o);
                        }
                        else
                        {
                            // 分别保存
                            switch (record.Request.DataType)
                            {
                            case DataObjectType.Tick:
                            case DataObjectType.Bid:
                                o = new Bid(updatetime, this.id, record.Request.Instrument.Id, obj.BidPrice1, obj.BidSize1);
                                break;

                            case DataObjectType.Ask:
                                o = new Ask(updatetime, this.id, record.Request.Instrument.Id, obj.AskPrice1, obj.AskSize1);
                                break;

                            case DataObjectType.Trade:
                                o = new Trade(updatetime, this.id, record.Request.Instrument.Id, obj.LastPrice, (int)volume);
                                break;

                            case DataObjectType.Quote:
                                o = new Quote(updatetime, this.id, record.Request.Instrument.Id, obj.BidPrice1, obj.BidSize1, obj.AskPrice1, obj.AskSize1);
                                break;
                            }

                            list.Add(o);
                        }
                    }
                }

                datetime = dt;
                volume   = obj.Volume;
            }

            if (EmitHistoricalData)
            {
                HistoricalData data = new HistoricalData
                {
                    RequestId = record.Request.RequestId,
                    Objects   = list.ToArray(),
                    TotalNum  = list.Count,
                };

                //Console.WriteLine("============");
                //Console.WriteLine(list.Count);

                base.EmitHistoricalData(data);
            }

            if (bIsLast)
            {
                EmitHistoricalDataEnd(record.Request.RequestId, RequestResult.Completed, "");
            }
        }
Beispiel #2
0
 private string TickFieldToString(TickField field, DateTime dt, double volume)
 {
     return(string.Format("{0},{1},{2},{3},{4},{5},{6},{7}",
                          dt.ToString("yyyy-MM-dd HH:mm:ss.fff"), field.LastPrice, volume, field.OpenInterest,
                          field.BidPrice1, field.BidSize1, field.AskPrice1, field.AskSize1));
 }