private void OnRspHistoryQuot(IntPtr pQuotApi, IntPtr pBuffer, ref STKHISDATA pHisData) { ehlog.Info("<--OnRspHistoryQuot:{0},{1},{2},{3}条", pHisData.Market, pHisData.Code, (PeriodType)pHisData.nPeriod, pHisData.nCount); string key = GetKeyFromSTKHISDATA(ref pHisData); DataRecord dr; if (historicalDataRecords_key.TryGetValue(key, out dr)) { HistoricalDataRequest request = dr.request; IntPtr ptrHead = (IntPtr)((int)pBuffer + Marshal.SizeOf(typeof(STKHISDATA))); for (int i = 0; i < pHisData.nCount; ++i) { IntPtr ptr = (IntPtr)((int)ptrHead + Marshal.SizeOf(typeof(HISTORYDATA)) * i); HISTORYDATA hd = (HISTORYDATA)Marshal.PtrToStructure(ptr, typeof(HISTORYDATA)); if (request.DataType == HistoricalDataType.Daily) { DateTime datetime = Convert.ToDateTime(hd.time.Substring(0, 10)); if (!EnableDateFilter || (datetime >= request.BeginDate && datetime < request.EndDate)) { Daily daily = new Daily(datetime, hd.fOpen, hd.fHigh, hd.fLow, hd.fClose, (long)hd.fVolume, (long)hd.fAmount); NewHistoricalBar(this, new HistoricalBarEventArgs(daily, request.RequestId, request.Instrument, this, -1)); } } else { DateTime datetime = Convert.ToDateTime(hd.time); if (!EnableDateFilter || (datetime >= request.BeginDate && datetime < request.EndDate)) { Bar bar = new Bar(BarType.Time, request.BarSize, datetime.AddSeconds(-request.BarSize), datetime, hd.fOpen, hd.fHigh, hd.fLow, hd.fClose, (long)hd.fVolume, (long)hd.fAmount); NewHistoricalBar(this, new HistoricalBarEventArgs(bar, request.RequestId, request.Instrument, this, -1)); } } } RemoveRequest(key); } }
// 生成历史数据的请求Key string GetKeyFromSTKHISDATA(ref STKHISDATA pHisData) { return(string.Format("{0}:{1}:{2}", pHisData.Market, pHisData.Code, pHisData.nPeriod)); }