/// <summary> /// Unregister candles builder. /// </summary> /// <param name="builder">Candles builder.</param> public void UnRegister(ICandleBuilder builder) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); } _builders.Remove(builder.CandleType); }
/// <summary> /// Register candles builder. /// </summary> /// <param name="builder">Candles builder.</param> public void Register(ICandleBuilder builder) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); } _builders.Add(builder.CandleType, builder); }
public CandleMessageEnumerator(MarketDataMessage mdMsg, bool onlyFormed, IEnumerable <Message> messages, ICandleBuilderValueTransform transform) { _mdMsg = mdMsg; _onlyFormed = onlyFormed; _transform = transform; _messages = messages; _messagesEnumerator = _messages.GetEnumerator(); _candleBuilder = mdMsg.DataType.CreateCandleBuilder(); }
public CandleMessageEnumerator(MarketDataMessage mdMsg, bool onlyFormed, IEnumerable <Message> messages, ICandleBuilderValueTransform transform) { _mdMsg = mdMsg; _onlyFormed = onlyFormed; _transform = transform; _messages = messages; _messagesEnumerator = _messages.GetEnumerator(); switch (mdMsg.DataType) { case MarketDataTypes.CandleTimeFrame: _candleBuilder = new TimeFrameCandleBuilder(); break; case MarketDataTypes.CandleTick: _candleBuilder = new TickCandleBuilder(); break; case MarketDataTypes.CandleVolume: _candleBuilder = new VolumeCandleBuilder(); break; case MarketDataTypes.CandleRange: _candleBuilder = new RangeCandleBuilder(); break; case MarketDataTypes.CandlePnF: _candleBuilder = new PnFCandleBuilder(); break; case MarketDataTypes.CandleRenko: _candleBuilder = new RenkoCandleBuilder(); break; default: throw new ArgumentOutOfRangeException(); } }
private void LoadData(CandleSeries series) { var msgType = series.CandleType.ToCandleMessageType(); _transactionId = _transactionIdGenerator.GetNextId(); _holder.Clear(); _holder.CreateCandleSeries(_transactionId, series); _candleTransform.Process(new ResetMessage()); _candleBuilder = _builderProvider.Get(msgType.ToCandleMarketDataType()); var storage = new StorageRegistry(); BusyIndicator.IsBusy = true; var path = HistoryPath.Folder; var isBuild = BuildFromTicks.IsChecked == true; var format = Format.SelectedFormat; var maxDays = (isBuild || series.CandleType != typeof(TimeFrameCandle)) ? 2 : 30 * (int)((TimeSpan)series.Arg).TotalMinutes; _mdMsg = series.ToMarketDataMessage(true); Task.Factory.StartNew(() => { var date = DateTime.MinValue; if (isBuild) { foreach (var tick in storage.GetTickMessageStorage(series.Security, new LocalMarketDataDrive(path), format).Load()) { _tradeGenerator.Process(tick); if (_candleTransform.Process(tick)) { var candles = _candleBuilder.Process(_mdMsg, _currCandle, _candleTransform); foreach (var candle in candles) { _currCandle = candle; _updatedCandles.Add((CandleMessage)candle.Clone()); } } _lastTime = tick.ServerTime; if (date != tick.ServerTime.Date) { date = tick.ServerTime.Date; var str = date.To <string>(); this.GuiAsync(() => BusyIndicator.BusyContent = str); maxDays--; if (maxDays == 0) { break; } } } } else { foreach (var candleMsg in storage.GetCandleMessageStorage(msgType, series.Security, series.Arg, new LocalMarketDataDrive(path), format).Load()) { if (candleMsg.State != CandleStates.Finished) { candleMsg.State = CandleStates.Finished; } _currCandle = candleMsg; _updatedCandles.Add(candleMsg); _lastTime = candleMsg.OpenTime; if (candleMsg is TimeFrameCandleMessage) { _lastTime += (TimeSpan)series.Arg; } _tradeGenerator.Process(new ExecutionMessage { ExecutionType = ExecutionTypes.Tick, SecurityId = series.Security.ToSecurityId(), ServerTime = _lastTime, TradePrice = candleMsg.ClosePrice, }); if (date != candleMsg.OpenTime.Date) { date = candleMsg.OpenTime.Date; var str = date.To <string>(); this.GuiAsync(() => BusyIndicator.BusyContent = str); maxDays--; if (maxDays == 0) { break; } } } } _historyLoaded = true; }) .ContinueWith(t => { if (t.Exception != null) { Error(t.Exception.Message); } BusyIndicator.IsBusy = false; Chart.IsAutoRange = false; ModifyAnnotationBtn.IsEnabled = true; NewAnnotationBtn.IsEnabled = true; }, TaskScheduler.FromCurrentSynchronizationContext()); }
/// <summary> /// Initializes a new instance of the <see cref="BiggerTimeFrameCandleCompressor"/>. /// </summary> /// <param name="message">Market-data message (uses as a subscribe/unsubscribe in outgoing case, confirmation event in incoming case).</param> /// <param name="builder">The builder of candles of <see cref="TimeFrameCandleMessage"/> type.</param> public BiggerTimeFrameCandleCompressor(MarketDataMessage message, ICandleBuilder builder) { Message = message ?? throw new ArgumentNullException(nameof(message)); _transform = new PartCandleBuilderValueTransform(); _builder = builder ?? throw new ArgumentNullException(nameof(builder)); }
/// <summary> /// Initializes a new instance of the <see cref="BiggerTimeFrameCandleCompressor"/>. /// </summary> /// <param name="subscription">Market-data message (uses as a subscribe/unsubscribe in outgoing case, confirmation event in incoming case).</param> /// <param name="builder">The builder of candles of <see cref="TimeFrameCandleMessage"/> type.</param> public BiggerTimeFrameCandleCompressor(MarketDataMessage subscription, ICandleBuilder builder) { _subscription = subscription ?? throw new ArgumentNullException(nameof(subscription)); _transform = new PartCandleBuilderValueTransform(); _builder = builder ?? throw new ArgumentNullException(nameof(builder)); }
private void LoadData(CandleSeries series) { _currCandle = null; _historyLoaded = false; _allCandles.Clear(); _candleTransform.Process(new ResetMessage()); _candleBuilder = series.CandleType.ToCandleMessageType().ToCandleMarketDataType().CreateCandleBuilder(); Chart.Reset(new IChartElement[] { _candleElement }); var storage = new StorageRegistry(); BusyIndicator.IsBusy = true; var path = HistoryPath.Folder; var isBuild = BuildFromTicks.IsChecked == true; var format = Format.SelectedFormat; var maxDays = (isBuild || series.CandleType != typeof(TimeFrameCandle)) ? 5 : 30 * (int)((TimeSpan)series.Arg).TotalMinutes; _mdMsg = series.ToMarketDataMessage(true); Task.Factory.StartNew(() => { var date = DateTime.MinValue; if (isBuild) { foreach (var tick in storage.GetTickMessageStorage(series.Security, new LocalMarketDataDrive(path), format).Load()) { _tradeGenerator.Process(tick); if (_candleTransform.Process(tick)) { var candles = _candleBuilder.Process(_mdMsg, _currCandle, _candleTransform); lock (_lock) { foreach (var candle in candles) { _currCandle = candle; _updatedCandles[candle.OpenTime] = Tuple.Create(candle, candle.State == CandleStates.Finished); } } } _lastTime = tick.ServerTime; if (date != tick.ServerTime.Date) { date = tick.ServerTime.Date; var str = date.To <string>(); this.GuiAsync(() => BusyIndicator.BusyContent = str); maxDays--; if (maxDays == 0) { break; } } } } else { foreach (var candleMsg in storage.GetCandleMessageStorage(series.CandleType.ToCandleMessageType(), series.Security, series.Arg, new LocalMarketDataDrive(path), format).Load()) { lock (_updatedCandles.SyncRoot) { _currCandle = candleMsg; _updatedCandles[candleMsg.OpenTime] = Tuple.Create(candleMsg, true); } _lastTime = candleMsg.OpenTime; if (candleMsg is TimeFrameCandleMessage) { _lastTime += (TimeSpan)series.Arg; } _tradeGenerator.Process(new ExecutionMessage { ExecutionType = ExecutionTypes.Tick, SecurityId = series.Security.ToSecurityId(), ServerTime = _lastTime, TradePrice = candleMsg.ClosePrice, }); if (date != candleMsg.OpenTime.Date) { date = candleMsg.OpenTime.Date; var str = date.To <string>(); this.GuiAsync(() => BusyIndicator.BusyContent = str); maxDays--; if (maxDays == 0) { break; } } } } _historyLoaded = true; }) .ContinueWith(t => { if (t.Exception != null) { Error(t.Exception.Message); } this.GuiAsync(() => { BusyIndicator.IsBusy = false; Chart.IsAutoRange = false; //_areaComb.YAxises.First().AutoRange = false; }); }, TaskScheduler.FromCurrentSynchronizationContext()); }