Exception при попытке расчитать ATR

Exception при попытке расчитать ATR
Atom
11/7/2011
kenota


Привет,

осваиваю Stocksharp, очень нравится :)

Нужно использовать индикатор ATR, нигде примеров не нашел, только на кодеплексе в тест кейсе.

Соответственно, пытаюсь его рассчитать:
Code

            var atr = new AverageTrueRange { Length = 15 };
            ...
         
            TimeFrameCandle cdl = _candleManager.GetTimeFrameCandle(_candleToken, 1);

            try {
                atr.Process((CandleIndicatorValue)cdl);
            } catch (Exception ex) {
                Error(ex.Message + " stacktrace: " + ex.StackTrace);
            }


В результате на строке atr.Process происходит следующее исключение:
Code

Invalid cast from 'System.Decimal' to 'StockSharp.Algo.Candles.Candle'.
 stacktrace:    at System.Convert.DefaultToType(IConvertible value, Type targetType, IFormatProvider provider)
   at System.Decimal.System.IConvertible.ToType(Type type, IFormatProvider provider)
   at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
   at Ecng.Common.Converter.To(Object value, Type destinationType)
   at Ecng.Common.Converter.To[T](Object value)
   at StockSharp.Algo.Indicators.CandleIndicatorValue.SetValue[T](T value)
   at StockSharp.Algo.Indicators.BaseIndicator`1.Process(IIndicatorValue input)
   at StockSharp.Algo.Indicators.Oscillator.AverageTrueRange.OnProcess(IIndicatorValue input)
   at StockSharp.Algo.Indicators.BaseIndicator`1.Process(IIndicatorValue input)
   at test.stocksharp.IndicatorTest.newCandle()


Версия стокшарпа: 4.0.3.

Подскажите куда копать, как побороть? В тесте вроде тоже производится просто каст свечи к CandleIndicatorValue

Tags:


Thanks:


< 1 2 
Alexander

Avatar
Date: 11/13/2011
Reply


russ
Alexander Mukhanchikov
russ
Аналогичная проблема, борюсь с фракталами
Code
[left]try
                    {
                        _strategy.FractalsValues.Process((CandleIndicatorValue)candle);
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }[/left]



Выдает ошибку

Недопустимое приведение "System.Int32" к "StockSharp.Algo.Candles.Candle".

Что не так делаю?

Посмотрел дебагом индиктор фракталов, падает в
Code
public override ComplexIndicatorValue OnProcess(IIndicatorValue input)

в
Code
return base.OnProcess(new ShiftedIndicatorValue(0, input.SetValue(0)));



Ну видимо candle у вас Int32, а вы пытаетесь не к тому типу привести.


Да, ошибку я понял, но я пользуюсь индикаторами, которые идут в S#, получается они могут не работать?



Quote:
_strategy.FractalsValues.Process((CandleIndicatorValue)candle);


Это ваш код, следовательно, ошибка у вас, а не в S#.
Вы приводите Int32 к CandleIndicatorValue, а не S#, разве нет?
Thanks:

russ

Avatar
Date: 11/13/2011
Reply


Alexander Mukhanchikov

Quote:
_strategy.FractalsValues.Process((CandleIndicatorValue)candle);


Это ваш код, следовательно, ошибка у вас, а не в S#.
Вы приводите Int32 к CandleIndicatorValue, а не S#, разве нет?


Да, это мой код, но candle у меня это объект типа TimeFrameCandle.
Если посмотреть OnProcess индикатора фракталов, который идет в библиотеке индикаторов, то:

Code
public override ComplexIndicatorValue OnProcess(IIndicatorValue input)
{
    var candle = input.GetValue<Candle>();
    ....
}


Насколько я понял, на вход он получает свечу
Code
input.GetValue<Candle>();

поэтому свечу я ему и подал
Code
_strategy.FractalsValues.Process((CandleIndicatorValue)candle);


а ошибка происходит в том же OnProcess в строке
Code
return base.OnProcess(new ShiftedIndicatorValue(0, input.SetValue(0)));


и ошибка понятна, потому-что input у нас типа Candle а мы задаем ему Int32.
Поэтому тут два варианта, либо на вход нужно подавать не свечу, а что-то другое, либо в input.SetValue(0) задавать не 0, а какую-то свечу.
Я только начал разбираться, поэтому еще не до конца понял логику этих индикаторов, подскажите плз.
Thanks:

Sergey Masyura

Avatar
Date: 11/13/2011
Reply


russ
Alexander Mukhanchikov

Quote:
_strategy.FractalsValues.Process((CandleIndicatorValue)candle);


Это ваш код, следовательно, ошибка у вас, а не в S#.
Вы приводите Int32 к CandleIndicatorValue, а не S#, разве нет?


Да, это мой код, но candle у меня это объект типа TimeFrameCandle.
Если посмотреть OnProcess индикатора фракталов, который идет в библиотеке индикаторов, то:

Code
public override ComplexIndicatorValue OnProcess(IIndicatorValue input)
{
    var candle = input.GetValue<Candle>();
    ....
}


Насколько я понял, на вход он получает свечу
Code
input.GetValue<Candle>();

поэтому свечу я ему и подал
Code
_strategy.FractalsValues.Process((CandleIndicatorValue)candle);


а ошибка происходит в том же OnProcess в строке
Code
return base.OnProcess(new ShiftedIndicatorValue(0, input.SetValue(0)));


и ошибка понятна, потому-что input у нас типа Candle а мы задаем ему Int32.
Поэтому тут два варианта, либо на вход нужно подавать не свечу, а что-то другое, либо в input.SetValue(0) задавать не 0, а какую-то свечу.
Я только начал разбираться, поэтому еще не до конца понял логику этих индикаторов, подскажите плз.


Если на входе свеча, а на выходе число, то там используется CandlePartIndicatorValue, а не CandleIndicatorValue. Весь исходный код индикаторов открыт, так что если есть возможность посмотреть самому - вполне логично этой возможностью воспользоваться.
Thanks:

russ

Avatar
Date: 11/14/2011
Reply


sergey.masyura

Если на входе свеча, а на выходе число, то там используется CandlePartIndicatorValue, а не CandleIndicatorValue. Весь исходный код индикаторов открыт, так что если есть возможность посмотреть самому - вполне логично этой возможностью воспользоваться.

Я честно уже долго сижу разбираюсь, не получается [confused]
И как CandlePartIndicatorValue на вход подать вместо CandleIndicatorValue ума не приложу.
Thanks:

Sergey Masyura

Avatar
Date: 11/14/2011
Reply


russ
sergey.masyura

Если на входе свеча, а на выходе число, то там используется CandlePartIndicatorValue, а не CandleIndicatorValue. Весь исходный код индикаторов открыт, так что если есть возможность посмотреть самому - вполне логично этой возможностью воспользоваться.

Я честно уже долго сижу разбираюсь, не получается [confused]
И как CandlePartIndicatorValue на вход подать вместо CandleIndicatorValue ума не приложу.


Никак. Но если возникла такая необходимость, то можно отнаследоваться от BaseCandleIndicatorSource и вызывать у него NewCandles(candles)

Code

    internal class MyIndicatorSource : BaseCandleIndicatorSource
    {
        public MyIndicatorSource () : base(BaseCandleIndicatorSource.ByClose)
        {
            
        }
    }


Thanks:

Mikhail Sukhov

Avatar
Date: 11/15/2011
Reply


danl
Наверное это не очень красиво, но работает. По поводу правильного решения, может следует сделать реализацию IIndicatorValue подобную той, которая в тесте, что бы она могла содержать любые значения и обучить текущие реализации содавать такие классы? Тогда выходные значения полностью развяжутся с входными, что, как мне кажется, логично. На эту тему нужно еще подумать.


Я так понял был еще и коммит. Не плохо бы отписывать в таких случаях. Я сделал небольшой фикс на коммит. Но не могу понять следующую ситуацию. Почему в SetValue null не является ошибочной ситуацией? Мне кажется это всегда ошибка. Нельзя передавать Candle == null.
Thanks:

danl

Avatar
Date: 11/16/2011
Reply


Mikhail Sukhov

Я так понял был еще и коммит. Не плохо бы отписывать в таких случаях.

Ок.


Mikhail Sukhov

Почему в SetValue null не является ошибочной ситуацией? Мне кажется это всегда ошибка. Нельзя передавать Candle == null.

В данный момент получается, что SetValue, по сути, является методом, который создает, а не устанавливает значение. Так как были введены пустые значения (свойство IsEmpty), то нужен способ создавать и пустые значения, вот SetValue(null) и создает пустое значение. Можно сделать отдельный метод, который бедт создавать пустое значение, но тогда придется править индикаторы, что бы они null туда никогда не передавали, в принципе большой сложности не предстваляет. Кроме того, нужно что бы в тестовом проекте, то же происходило падение, при вызове SetValue(null), а то в тесте работает, а жизни нет (я в основном из-за этого сделал, что бы индикаторы не падали).
Thanks:

Dmitriy Klimov

Avatar
Date: 11/25/2011
Reply


danl
По поводу ATR, он работает без фиксов, если его инициализировать вот так:
Code
IndicatorManager.RegisterIndicator(new AverageTrueRange(), new CandleTokenIndicatorSource(candleToken, BaseCandleIndicatorSource.ByClose));


То что там используется BaseCandleIndicatorSource.ByClose реального значения не имеет, так как исходный индикатор будет получать свечу целиком, но источник будет передавать в индикатор класс CandlePartIndicatorValue, который поддерживает тип decimal.

Наверное это не очень красиво, но работает. По поводу правильного решения, может следует сделать реализацию IIndicatorValue подобную той, которая в тесте, что бы она могла содержать любые значения и обучить текущие реализации содавать такие классы? Тогда выходные значения полностью развяжутся с входными, что, как мне кажется, логично. На эту тему нужно еще подумать.


Добрый день.

Создаю индикатор на базе ATR. Столкнулся с описанной выше проблемой: генерируется исключение при отправке свечки в индикатор. Я так понимаю, рекомендуется использовать IndicatorManager для наполнения индикаторов данными. Но тогда, получается, мне придется при создании индикатора отправлять ему данные об IndicatorManager и CandleTokenIndicatorSource. Получается сильная зависимость индикаторов от других классов, хотя, вроде бы, особой необходимости в этом нет.

Как коллеги решают данную проблему? Или проблемы нет, я просто не там ищу?
Thanks:
< 1 2 

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy