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); } }); } }
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); //合併資料 } } } }