← Zurück

Проблема с использованием RelativeStrengthIndex

Решил дополнить пример SampleSmartSMA индикатором RSI Вызвал конструктор public RelativeStrengthIndex rsi = new RelativeStrengthIndex() ; Предал цену закрытия свечи rsi.Process(candle.ClosePrice); Записываю результат var RSI = rsi.GetCurrentValue(); Но при запуске пишет что Значение индикатора не содержит данных Отслеживал значение переменной RSI - всегда 0 Скрин ошибки Создал тестовую переменную RSII что бы увидеть что значение candle не пустое. Точка останова

Подскажите, в чем ошибка может быть? Может ему еще какие-то значения нужно передавать?

Привожу код SmaStrategy.cs


namespace SampleSmartSMA
{
    using Ecng.Common;

    using StockSharp.Algo;
    using StockSharp.Algo.Candles;
    using StockSharp.Algo.Indicators;
    using StockSharp.Algo.Strategies;
    using StockSharp.Algo.Strategies.Quoting;
    using StockSharp.Messages;

    class SmaStrategy : Strategy
    {
        private readonly CandleSeries _series;
        private bool _isShortLessThenLong;


        public SmaStrategy(CandleSeries series, SimpleMovingAverage longSma, SimpleMovingAverage shortSma)
        {
            _series = series;

            LongSma = longSma;
            ShortSma = shortSma;
        }

        public SimpleMovingAverage LongSma { get; private set; }
        public SimpleMovingAverage ShortSma { get; private set; }

        protected override void OnStarted()
        {
            _series
                .WhenCandlesFinished()
                .Do(ProcessCandle)
                .Apply(this);

            // запоминаем текущее положение относительно друг друга
            _isShortLessThenLong = ShortSma.GetCurrentValue() < LongSma.GetCurrentValue();
           // var RSI = ShortSma.GetCurrentValue();
            base.OnStarted();
        }

        private void ProcessCandle(Candle candle)
        {
            // если наша стратегия в процессе остановки
            if (ProcessState == ProcessStates.Stopping)
            {
                // отменяем активные заявки
                CancelActiveOrders();
                return;
            }
            
            // добавляем новую свечу
            LongSma.Process(candle);
            ShortSma.Process(candle);
            
            // вычисляем новое положение относительно друг друга
            var isShortLessThenLong = ShortSma.GetCurrentValue() < LongSma.GetCurrentValue();

            // если произошло пересечение
            if (_isShortLessThenLong != isShortLessThenLong)
            {

                // если короткая меньше чем длинная, то индикатор "продажа", иначе, "покупка".
                Options.Item = isShortLessThenLong ? 1 : 2;
                // если короткая меньше чем длинная, то продажа, иначе, покупка.
//                var direction = isShortLessThenLong ? Sides.Sell : Sides.Buy;

                // вычисляем размер для открытия или переворота позы
                var volume = Position == 0 ? Volume : Position.Abs() * 2;

                // регистрируем заявку (обычным способом - лимитированной заявкой)
                //RegisterOrder(this.CreateOrder(direction, (decimal)Security.GetCurrentPrice(direction), volume));

                // переворачиваем позицию через котирование
//				var strategy = new MarketQuotingStrategy(direction, volume);
//				ChildStrategies.Add(strategy);
                
                // запоминаем текущее положение относительно друг друга
                _isShortLessThenLong = isShortLessThenLong;
            }

            var RSII = candle.ClosePrice;

            rsi.Process(candle.ClosePrice);
            var RSI = rsi.GetCurrentValue();
            
        }

        public RelativeStrengthIndex rsi = new RelativeStrengthIndex() { Length = 10 };

    }
}

War dieses Thema hilfreich?

Thema teilen

Kommentare (2)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Иван З.
Иван З.

Может проблема в том что индикатор составляться из 10 свечей, а вы ему дали только 1. Возможно вам помогут исходники индикатора https://github.com/StockSharp/StockSharp/blob/master/Algo/Indicators/RelativeStrengthIndex.cs

kusko
kusko Autor

Иван З.: Может проблема в том что индикатор составляться из 10 свечей, а вы ему дали только 1. Нет, это все в цикле.

Возможно вам помогут исходники индикатора https://github.com/StockSharp/StockSharp/blob/master/Algo/Indicators/RelativeStrengthIndex.cs Спасибо! Именно они и помогли!

Проблема решена. Как оказалось индикатор работал. А получить выходное значение удалось таким способом: вместо rsi.Process(candle.ClosePrice); var RSI = rsi.GetCurrentValue(); написал var RSI = rsi.Process(candle.ClosePrice); Переменная RSI = 0 до тех пор пока индикатор не наберет нужное количество свечей для расчета.

Как всегда, все просто)))