Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        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));
        }