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


Ошибка деления на 0 при добавлении в индикатор RSquared (линейная регрессия)
Atom Reply
3/26/2012


Добрый день!

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

В основном работает, но ВНЕЗАПНО при добавлении в индикатор через стратегию очередного среднего значения свечи ругается на эксепшн деления на 0.
Код
_strategy.LR_R3.Process((DecimalIndicatorValue)(candle.OpenPrice / 2 + candle.ClosePrice / 2));

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

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

Tags:


Thanks:




5 Answers
Alexander

Avatar
Date: 3/26/2012
Reply


Spiritschaser Перейти
Что это может быть?


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

Spiritschaser

Avatar
Date: 3/26/2012
Reply


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

Spiritschaser

Avatar
Date: 3/27/2012
Reply


Вот сообщение об ошибке - я его не понимаю... Я посмотрел - цены открытия и закрытия свечки были в порядке.
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.BaseIndicator`1.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, IEnumerable`1 candles) в C:\Users\HP Pavilion\Desktop\Trading\StockSharp_4.0.21\Samples\Quik\MySMA2\MainWindow.xaml.cs:строка 297
в Ecng.Common.DelegateHelper.SafeInvoke[T1,T2](Action`2 handler, T1 arg1, T2 arg2)
в StockSharp.Algo.Candles.CandleManager.RaiseCandlesStarted(CandleToken token, IEnumerable`1 candles)
в Ecng.Common.DelegateHelper.SafeInvoke[T1,T2](Action`2 handler, T1 arg1, T2 arg2)
в StockSharp.Algo.Candles.CandleBuilder.RaiseNewCandles(CandleToken token, IEnumerable`1 candles)
в StockSharp.Algo.Candles.CandleBuilder.#=qrC1BYTEit9X4JvpiAE7mfA==(IEnumerable`1 #=qnVyGvAOu6RvhPx2ecTcacg==)
InnerException:
Topic starter
Thanks:

Alexander

Avatar
Date: 3/27/2012
Reply


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

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

Spiritschaser

Avatar
Date: 3/27/2012
Reply


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

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


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

loading
clippy