Диалог автора. Александр Смирнов. - страница 37

 
Вот эта формула СКО^2 = M[X^2] - (M[X])^2, она на самом деле для дисперсии, то есть для идеальной характеристики. Скорее всего при её выводе явно или неявно обнулялись "перекрёстные" суммы. Для больших выборок это достаточно корректно. Но для выборок небольших реальное СКО может отличаться. Вот правда до проверки руки пока не дошли.
 
Mathemat:

Юра, хочется считать СКО быстрее, чем стандартная функция. А вдруг получится? При одиночном вызове она должна быть быстрее любого кода, написанного на языке, но вот при массовом (обсчет всего чарта) вполне можно сэкономить на издержках.


Если речь идет об ско ошибки для линейной регрессии, то она считается аналитически в одно действие по формуле

СКО^2=D[Y] - D[X]*A^2,

где D[Y]=M[Y^2]-M[Y]^2, D[X]=M[X^2]-M[X]^2, и A - линейный коэффициент регрессии Y=A*X+B

Так что рекуррентность тут не нужна.

PS А перекрестные суммы обнуляются явно и чисто аналитически. Размер выборки тут не при чем.

 
Prival:

Все равно ошибка 2008.02.15 17:07:22 2007.01.11 12:15 OTF_1 EURUSD,M1: negative argument for MathSqrt function

Исходя из содержания ошиби собака порылась где-то сдесь MathSqrt(lambda*lambda*lambda*lambda+16.0*lambda*lambda) . Но lambda=MathAbs(Value1[i]/Value2[i]) ;не может быть отрицательной.
Поэтому, единственное что приходит в голову на всякий пожарный вначеле выполнить lambda=0.0;
и/или MathSqrt(MathAbs(lambda*lambda*lambda*lambda+16.0*lambda*lambda)) чтобы навсегда избавиться от этой ошибки.
//---- main loop
double alpha, lambda=0.0 ;
//********************************************************************************************
for (i = limit; i >= 0; i--)
{
Price[i]=(High[i]+Low[i])/2.0;
}
for (i = limit; i >= 0; i--)
{
Value1[i]=SC*(Price[i]-Price[i+1])+4*SC*Value1[i+1];
Value2[i]=SC*(High[i]-Low[i])+4*SC*Value2[i+1];
}
for (i = limit; i >= 0; i--)
{
if(Value2[i]< Point)Value2[i]= Point;else lambda=MathAbs(Value1[i]/Value2[i]);

alpha=(-lambda*lambda+ MathSqrt(lambda*lambda*lambda*lambda+16.0*lambda*lambda) )/8.0;

Value3[i]=alpha*Price[i]+(1.0-alpha)*Value3[i+1];
}
//********************************************************************************************

P.S. Вооообще бред. Эта ошибка у вас наверное в тестере выскакивает?
P.P.S. Скорее всего инициализация переменной double lambda; по умолчанию производилась очень маленьким отрицательным мусором. Тогда выражение double lambda=0.0; должно помочь.
Учит нас, Слава учит - не работать никогда по умолчанию, а мы не учимся!
 
VBAG:
Prival:

Все равно ошибка 2008.02.15 17:07:22 2007.01.11 12:15 OTF_1 EURUSD,M1: negative argument for MathSqrt function


P.S. Вооообще бред. Эта ошибка у вас наверное в тестере выскакивает?
P.P.S. Скорее всего инициализация переменной double lambda; по умолчанию производилась очень маленьким отрицательным мусором. Тогда выражение double lambda=0.0; должно помочь.
Учит нас, Слава учит - не работать никогда по умолчанию, а мы не учимся!

Здешние ботники вечно хотят какой-то велосипед изобрести.

Не парьтесь понапрасну. Среди пользовательских индюков есть Bands.mq4 - там приведен алгоритм расчета СКО
 

СКО^2=D[Y] - D[X]*A^2,

где D[Y]=M[Y^2]-M[Y]^2, D[X]=M[X^2]-M[X]^2, и A - линейный коэффициент регрессии Y=A*X+B

Так что рекуррентность тут не нужна.

В этих формулах много лишнего.
И что значит рекуррентность не нужна, суммы-то как предполагается рассчитывать? Или есть идея как обойтись без замены матожидания на среднее?

P.S. Кстати, перекрёстные суммы сами не уходят. По крайней мере у меня не уходили. Попробуйте поработать не с дисперсиями а с "реальным" выражением
 
СКО для любой функции

sq = 0.0;
for (int n=0; n<period; n++)
{
   dc = Close[n] - fx[n];
   sq += dc * dc;
}
sq = MathSqrt(sq/period);
Следовательно для линейной регрессии будет

sq = 0.0;
for (n=0; n<p; n++)
{
   lr = b + a * n;  
   dc = Close[n] - lr;
   sq += dc * dc;
}
sq = MathSqrt( sq / p );
 
ANG3110:
Следовательно для линейной регрессии будет

sq = 0.0;
for (n=0; n<p; n++)
{
   lr = b + a * n;  
   dc = Close[n] - lr;
   sq += dc * dc;
}
sq = MathSqrt( sq / p );

Это по определению. Если ЛР не совсем короткая, можно рассчитывать СКО быстрее, без дополнитнльного цикла. Код для расчёта СКО есть в исходном MovingLR.mq4, только он закомментирован и СКО называется rmsY.
 
lna01:

СКО^2=D[Y] - D[X]*A^2,

где D[Y]=M[Y^2]-M[Y]^2, D[X]=M[X^2]-M[X]^2, и A - линейный коэффициент регрессии Y=A*X+B

Так что рекуррентность тут не нужна.

В этих формулах много лишнего.
И что значит рекуррентность не нужна, суммы-то как предполагается рассчитывать? Или есть идея как обойтись без замены матожидания на среднее?

P.S. Кстати, перекрёстные суммы сами не уходят. По крайней мере у меня не уходили. Попробуйте поработать не с дисперсиями а с "реальным" выражением


Очень хочу узнать, что может быть лишнее в этих формулах ? :-)

МО, естественно, заменяется на среднее и суммы рассчитывать надо. Однако, для этого не нужна ни рекуррентность, ни даже цикл. Достаточно воспользоваться формулой

S(X)[i+1]=S(X)[i] - X[i-N+1] + X[i+1], где S(X)[i]=Сумма(X[k]; k=i-N+1, i-N+2, ...,i-1,i )

Впрочем, может вы именно это выражение и имеете в виду, когда говорите о рекуррентности ? Тогда, конечно, вы правы.

Что касается "реального выражения", то как вы думаете, откуда все эти формулы берутся ? Вот если подставить в это "реальное выражение" конечные формулы, полученные с помощью МНК для А и В, то как раз и получится приведенное выражение для СКО. Могу привести соответствующие аналитические рассчеты.

 
Yurixx:
lna01:


Могу привести соответствующие аналитические рассчеты.


вот отсюда если не затруднит подробнее. с приходом новых данных коэфициенты А и В могут поменяться, вродебы, хотя я могу и ошибаться :-). Для ЛР вроде решили, а вот для параболической регресии как ?
 
lna01:
Это по определению. Если ЛР не совсем короткая, можно рассчитывать СКО быстрее, без дополнитнльного цикла. Код для расчёта СКО есть в исходном MovingLR.mq4, только он закомментирован и СКО называется rmsY.
Да, можно посчитать сумму вначале один раз и просто вычетать последний элемент, и прибавлять новый первый. Тогда получается без цикла. Я такие вещи делал еще на mql2, в МТ3. Да и сейчас где нужно вставляю, и не только для линейной регрессии.
Причина обращения: