/// <inheritdoc /> protected override HeikinAshiCandleMessage CreateCandle(ICandleBuilderSubscription subscription, ICandleBuilderValueTransform transform) { var timeFrame = subscription.Message.GetTimeFrame(); var board = subscription.Message.IsRegularTradingHours ? ExchangeInfoProvider.GetOrCreateBoard(subscription.Message.SecurityId.BoardCode) : ExchangeBoard.Associated; var bounds = timeFrame.GetCandleBounds(transform.Time, board, board.WorkingTime); if (transform.Time < bounds.Min) { return(null); } var openTime = bounds.Min; var candle = FirstInitCandle(subscription, new HeikinAshiCandleMessage { TimeFrame = timeFrame, OpenTime = openTime, HighTime = openTime, LowTime = openTime, CloseTime = openTime, }, transform); var currentCandle = subscription.CurrentCandle; if (currentCandle != null) { candle.OpenPrice = (currentCandle.OpenPrice + currentCandle.ClosePrice) / 2M; } return(candle); }
/// <inheritdoc /> protected override HeikinAshiCandleMessage CreateCandle(MarketDataMessage message, HeikinAshiCandleMessage currentCandle, ICandleBuilderValueTransform transform) { var timeFrame = message.GetTimeFrame(); var board = ExchangeInfoProvider.GetOrCreateBoard(message.SecurityId.BoardCode); var bounds = timeFrame.GetCandleBounds(transform.Time, board, board.WorkingTime); if (transform.Time < bounds.Min) { return(null); } var openTime = bounds.Min; var candle = FirstInitCandle(message, new HeikinAshiCandleMessage { TimeFrame = timeFrame, OpenTime = openTime, HighTime = openTime, LowTime = openTime, CloseTime = openTime, }, transform); if (currentCandle != null) { candle.OpenPrice = (currentCandle.OpenPrice + currentCandle.ClosePrice) / 2M; } return(candle); }
public Tuple <News, bool> ProcessNewsMessage(Security security, NewsMessage message) { if (message == null) { throw new ArgumentNullException(nameof(message)); } var isNew = false; News news; if (!message.Id.IsEmpty()) { news = _newsById.SafeAdd(message.Id, key => { isNew = true; var n = EntityFactory.CreateNews(); n.Id = key; return(n); }); } else { isNew = true; news = EntityFactory.CreateNews(); _newsWithoutId.Add(news); } if (isNew) { news.ServerTime = message.ServerTime; news.LocalTime = message.LocalTime; } if (!message.Source.IsEmpty()) { news.Source = message.Source; } if (!message.Headline.IsEmpty()) { news.Headline = message.Headline; } if (security != null) { news.Security = security; } if (!message.Story.IsEmpty()) { news.Story = message.Story; } if (!message.BoardCode.IsEmpty()) { news.Board = ExchangeInfoProvider.GetOrCreateBoard(message.BoardCode); } if (message.Url != null) { news.Url = message.Url; } message.CopyExtensionInfo(news); return(Tuple.Create(news, isNew)); }