Пример #1
0
		internal void MergeTick(ITick tick) {
			lock (__cIndexs) {
				int iCount = __cSeries.Count;
				
				Parallel.For(0, iCount, (i) => {
					SeriesSymbolData cSeries = __cSeries[i];
					if (cSeries.Initialized) {
						cSeries.Merge(tick);
					}
				});
			}
		}
Пример #2
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 {
					DataRequestEvent cRequestEvent = null;
					lock (__oLock) {  //需要鎖定資源(因為有可能多個策略同時請求基礎序列類別資料, 如果不鎖定會重複請求資料)
						if (e.Totals == 0) {  //檢查是否資料總個數為0(0=使用 InstrumentDataRequest 請求歷史資料)
							cRequestEvent = e.Clone();  //直接複製
						} else {  //如果不為0(表示使用者取得資料時超過目前已下載歷史資料的區間, 經過基礎週期比率計算之後再向伺服器請求歷史資料)
							int iTotals = e.Totals * e.Rate;  //資料總個數 * 縮放比率 = 基礎週期需要請求的資料總個數
							int iRequestCount = iTotals - cBaseSeries.DataRequest.Range.Count;  //計算後的資料總個數 - 基礎週期目前已下載後的資料個數 = 欲請求的的個數
							cRequestEvent = new DataRequestEvent(iRequestCount, iTotals, 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();
				}

				lock (__oLock) {  //須鎖定資源(將基礎序列資料合併至目標序列時需要鎖定, 避免合併的時候多執行緒導致合併資料產生問題)
					int iTargetCount = cTargetSeries.Indexer.Count;
					int iAllocSize = e.Count - cTargetSeries.DataRequest.Range.Count;
					if (iTargetCount == 0 || iAllocSize > 0) {
						if (iAllocSize > 0) {
							++iAllocSize;  //多預留一個空間(避免陣列空間不足)
							cTargetSeries.AdjustSize(iAllocSize, true);
						}
						cBaseSeries.Merge(cTargetSeries);  //合併資料
					}
				}
			}
		}