Exemple #1
0
		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;
					}
				}
			}
		}
Exemple #2
0
		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 的時間)
					}
				}
			}
		}
Exemple #3
0
		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;
			}
		}
Exemple #4
0
		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);  //合併資料
			}
		}