/// <summary> /// To send data request. /// </summary> /// <param name="series">The candles series for which data receiving should be started.</param> /// <param name="from">The initial date from which you need to get data.</param> /// <param name="to">The final date by which you need to get data.</param> public void Start(CandleSeries series, DateTimeOffset from, DateTimeOffset to) { if (series == null) { throw new ArgumentNullException(nameof(series)); } CandleSeriesInfo info; lock (_info.SyncRoot) { info = _info.TryGetValue(series); if (info != null) { throw new ArgumentException(LocalizedStrings.Str636Params.Put(series), nameof(series)); } info = new CandleSeriesInfo(series, from, to, Sources, OnNewValues, s => { _info.Remove(s); OnStopped(s); }); //Container.Start(series, from, to); _info.Add(series, info); } info.Start(); }
private DateTimeOffset OnNewValues(CandleSeriesInfo info, IEnumerable <ICandleBuilderSourceValue> values) { ICandleBuilderSourceValue lastValue = null; foreach (var value in values) { var messages = _builder.Process(info.Message, info.CurrentCandleMessage, value); foreach (var candleMsg in messages) { info.CurrentCandleMessage = candleMsg; if (info.CurrentCandle != null && info.CurrentCandle.OpenTime == candleMsg.OpenTime) { if (info.CurrentCandle.State == CandleStates.Finished) { continue; } info.CurrentCandle.Update(candleMsg); } else { info.CurrentCandle = candleMsg.ToCandle(info.Series); } Processing?.Invoke(info.Series, info.CurrentCandle); //if (candleMsg.IsFinished) // OnStopped(info.Series); } lastValue = value; } return(lastValue?.Time ?? default(DateTimeOffset)); }