private void Request(DataRequestEvent e) { InstrumentDataRequest cDataRequest = __cSeries.DataRequest; DataRequest cRange = cDataRequest.Range; ZRequest cRequest = new ZRequest(); cRequest.Method = "POST"; cRequest.Url = __sHttpUrl; cRequest.Parameters = string.Format("exchange={0}&symbolId={1}&timeFrame={2}&position={3}&startDate={4}&endDate={5}&count={6}", cDataRequest.Exchange, cDataRequest.Symbol, cDataRequest.Resolution.TotalSeconds, __lPosition, cRange.From.ToString("yyyy-MM-dd"), cRange.To.ToString("yyyy-MM-dd"), (cRange.RequestType == DataRequestType.BarsBack || __lPosition != -1) ? e.Count : cRange.Count); cRequest.CookieContainer = __cCookies; int iRet = cRequest.Request(); if (iRet == 0) { ZReader cReader = new ZReader(cRequest.Response); e.Result = cReader.Result; if (cReader.Result == 0) { int iCount = e.Count = cReader.Count; __cSeries.AdjustSize(iCount, true); ZBuffer cBuffer = cReader.Read(); while (--iCount >= 0) { cBuffer.Position = iCount * DATA_BLOCK_SIZE; DateTime cDate = cBuffer.GetDateTime(); double dOpen = cBuffer.GetDouble(); double dHigh = cBuffer.GetDouble(); double dLow = cBuffer.GetDouble(); double dClose = cBuffer.GetDouble(); double dVolume = cBuffer.GetDouble(); __cSeries.AddSeries(cDate, dOpen, dHigh, dLow, dClose, dVolume, false); } __lPosition = cReader.Position; e.Ranges[0] = cReader.BeginDate; e.Ranges[1] = cReader.EndDate; if (__lPosition == 0) { e.IsAlreadyRequestAllData = true; } } } }
internal void OnRequest(DataRequestEvent e) { if (onRequest != null) { onRequest(this, e); if (e.Result == 0) { __cDataRequest.Range.Count = e.Count; __cDataRequest.Range.From = e.Ranges[0]; __cDataRequest.Range.IsAlreadyRequestAllData = e.IsAlreadyRequestAllData; if (!this.Initialized) { //尚未初始化之前才需要更新(初始化之後已經併入即時報價資訊, 更新時間會是目前最新的報價時間) __cUpdateTime = __cTimes[this.Indexer.RealtimeIndex]; //更新最後的更新時間(如果沒有即時報價資訊, 這個就是最後一根 Bars 的時間) } } } }
private void SeriesSymbolData_onRequest(object sender, DataRequestEvent e) { int iCount = e.Count; int iBaseCount = __cSeries.DataRequest.Range.Count; if (e.Position > iBaseCount) { Request(e); if (e.Result == 0) { e.Count += iBaseCount; if (e.IsAlreadyRequestAllData) { __cSeries.RemoveRequest(); ////如果已經全部讀取完畢就取消事件 if (onCompleted != null) { InstrumentDataRequest cDataRequest = __cSeries.DataRequest; onCompleted(this, new DataAdapterCompleteEvent(cDataRequest.Symbol, cDataRequest.Resolution.TotalSeconds)); } } } } else { DataRequest cDataRequest = __cSeries.DataRequest.Range; e.Result = 0; e.Count = iBaseCount; e.Ranges = new DateTime[] { cDataRequest.From, cDataRequest.To }; e.IsAlreadyRequestAllData = cDataRequest.IsAlreadyRequestAllData; } }
private void SeriesSymbolData_onRequest(object sender, DataRequestEvent e) { SeriesSymbolData cTargetSeries = sender as SeriesSymbolData; if (!cTargetSeries.DataRequest.Range.IsAlreadyRequestAllData) { int iTotalSeconds = cTargetSeries.DataRequest.Resolution.TotalSeconds; SeriesSymbolData cBaseSeries = GetSeries(((iTotalSeconds < Resolution.MAX_BASE_TOTALSECONDS) ? Resolution.MIN_BASE_TOTALSECONDS : Resolution.MAX_BASE_TOTALSECONDS)); if (cBaseSeries.DataRequest.Range.IsAlreadyRequestAllData) { e.IsAlreadyRequestAllData = true; e.Count = cBaseSeries.DataRequest.Range.Count / e.Rate; } else { int iPosition = e.Position * e.Rate; int iRequestCount = iPosition - cBaseSeries.DataRequest.Range.Count; DataRequestEvent cRequestEvent = new DataRequestEvent(iPosition, iRequestCount, cBaseSeries.DataRequest.Resolution.Rate); cBaseSeries.OnRequest(cRequestEvent); //回補歷史資訊 if (cRequestEvent.Result == 0) { e.Result = cRequestEvent.Result; e.Ranges = cRequestEvent.Ranges; e.Count = cRequestEvent.Count / e.Rate; e.IsAlreadyRequestAllData = cRequestEvent.IsAlreadyRequestAllData; } } if (e.IsAlreadyRequestAllData) { //如果已經全部讀取完畢就取消事件 cTargetSeries.RemoveRequest(); } int iAllocSize = e.Count - cTargetSeries.DataRequest.Range.Count + 1; cTargetSeries.AdjustSize(iAllocSize, true); cBaseSeries.Merge(cTargetSeries); //合併資料 } }