Ошибка деления на 0 при добавлении в индикатор RSquared (линейная регрессия)

Ошибка деления на 0 при добавлении в индикатор RSquared (линейная регрессия)
Atom
26.03.2012
Spiritschaser


Добрый день!

Наконец-то написал себе робота (альфа-версию), основанного на регрессионном анализе.

В основном работает, но ВНЕЗАПНО при добавлении в индикатор через стратегию очередного среднего значения свечи ругается на эксепшн деления на 0.

_strategy.LR_R3.Process((DecimalIndicatorValue)(candle.OpenPrice / 2 + candle.ClosePrice / 2));

(здесь LR_3 - R квадрат на 3 периода - характеризует "мгновенную" волатильность)

Что это может быть? Добавить обработку делений на 0 в самом индикаторе???


Теги:


Спасибо:


Alexander

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


Spiritschaser: Что это может быть?

посмотрите на stacktrace. по вашим словам у вас получается closeprice и openprice у свечки = 0.

Спасибо:

Spiritschaser

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


Спасибо! О "нулевой" цене я и не подумал.

Спасибо:

Spiritschaser

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


Вот сообщение об ошибке - я его не понимаю... Я посмотрел - цены открытия и закрытия свечки были в порядке. System.DivideByZeroException не обработано пользовательским кодом

Message=Попытка деления на нуль. Source=mscorlib StackTrace: в System.Decimal.FCallDivide(Decimal& d1, Decimal& d2) в System.Decimal.op_Division(Decimal d1, Decimal d2) в StockSharp.Algo.Indicators.Misc.RSquared.OnProcess(IIndicatorValue input) в StockSharp.Algo.Indicators.BaseIndicator1.Process(IIndicatorValue input) в SampleSMA.MainWindow.DrawSma() в C:\Users\HP Pavilion\Desktop\Trading\StockSharp_4.0.21\Samples\Quik\MySMA2\MainWindow.xaml.cs:строка 394 в SampleSMA.MainWindow.<Connect_Click>b__a(CandleToken token, IEnumerable1 candles) в C:\Users\HP Pavilion\Desktop\Trading\StockSharp_4.0.21\Samples\Quik\MySMA2\MainWindow.xaml.cs:строка 297 в Ecng.Common.DelegateHelper.SafeInvoke[T1,T2](Action2 handler, T1 arg1, T2 arg2) в StockSharp.Algo.Candles.CandleManager.RaiseCandlesStarted(CandleToken token, IEnumerable1 candles) в Ecng.Common.DelegateHelper.SafeInvoke[T1,T2](Action2 handler, T1 arg1, T2 arg2) в StockSharp.Algo.Candles.CandleBuilder.RaiseNewCandles(CandleToken token, IEnumerable1 candles) в StockSharp.Algo.Candles.CandleBuilder.#=qrC1BYTEit9X4JvpiAE7mfA==(IEnumerable`1 #=qnVyGvAOu6RvhPx2ecTcacg==) InnerException:

Спасибо:

Alexander

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


на какой строчке exception возникает?

Update: посмотрел код, у вас видимо Length = 0. посмотрите сами дебагером по индикатору

Спасибо:

Spiritschaser

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


Так, разобрался. Ошибка возникает в индикаторе - если подряд 3 одинаковых входных значения (горизонтальная на графике), то по алгоритму R Squared получается деление на ноль. В Excel, что характерно, то же самое.

Length = 3, у меня среднее от y равно любому y - сигма равна нулю, поэтому все проблемы. Идеологический вопрос - имеет ли смысл переделывать индикатор, делать проверку в индикаторе и в случае деления на ноль ставить значение "1" (что по смыслу верно, но не верно по формулам), или выдумывать проверку при заполнении индикатора?

Спасибо:


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

loading
clippy