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


Решил дополнить пример SampleSmartSMA индикатором RSI
Вызвал конструктор
public RelativeStrengthIndex rsi = new RelativeStrengthIndex() { Length = 10 };
Предал цену закрытия свечи
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 };

    }
}
й13.PNG 43 KB (0) й12.PNG 18 KB (0)

Теги:


Спасибо:




2 Ответов
Иван З.

Фотография
Курсы Автор статей Благотворитель
Дата: 25.05.2016
Ответить


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

Спасибо:

kusko

Фотография
Дата: 25.05.2016
Ответить


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


Нет, это все в цикле.

Цитата:
Возможно вам помогут исходники индикатора https://github.com/Stock...RelativeStrengthIndex.cs

Спасибо! Именно они и помогли!

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

Как всегда, все просто)))
Автор топика
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy