Автор |
Сообщение |
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Понадобился мне тут точный аналог Велсовской функции GaussianSeries для Ами.
В сети не нашел.
Пришлось внимательно разобраться с работой John Ehlers "Gaussian and Other Low Lag Filters"
Написал сам. Вдруг кому еще понадобится....
Код: |
PI = 3.1415926;
function GSMA( input, Period, poles )
{
an = 2*PI/Period;
beta = (1 - cos( an ))/(1.414^(2/poles)-1);
alpha = -beta + sqrt( beta^2 + 2*beta );
result[ 0 ] = input[ 0 ];
result[ 1 ] = input[ 1 ];
result[ 2 ] = input[ 2 ];
result[ 3 ] = input[ 3 ];
for( i = poles; i < BarCount; i++ )
{
if(poles == 1)
result[i] = alpha*input[i] + (1-alpha)*result[i-1];
else if(poles == 2)
result[i] = alpha^2*input[i] + 2*(1-alpha)*result[i-1] - (1-alpha)^2*result[i-2];
else if(poles == 3)
result[i] = alpha^3*input[i] + 3*(1-alpha)*result[i-1] - 3*(1-alpha)^2*result[i-2] + (1-alpha)^3*result[i-3];
else if(poles == 4)
result[i] = alpha^4*input[i] + 4*(1-alpha)*result[i-1] - 6*(1-alpha)^2*result[i-2] + 4*(1-alpha)^3*result[i-3] - (1-alpha)^4*result[i-4];
}
return result;
}
poles = 1; // 2 или 3 или 4
Plot(GSMA( C, 9, poles), "GSMA", ColorRed);
|
Ничего особенного. Просто типа еще один мувинг. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег.
Последний раз редактировалось: 000 (Вт Июл 14, 2015 6:14 pm), всего редактировалось 1 раз |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
spitfire
Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow
|
У меня такой вариант есть этого мувинга:
Код: |
_SECTION_BEGIN("GSMA");
SetBarsRequired(100000,0);
PI = 3.1415926;
function jIIR2( input, f0, f1, f2 )
{
result[ 0 ] = input[ 0 ];
result[ 1 ] = input[ 1 ];
for( i = 2; i < BarCount; i++ )
{
result[ i ] = f0 * input[ i ] +
f1 * result[ i - 1 ] +
f2 * result[ i - 2 ];
}
return result;
}
function GSMA( input, Period )
{
N = 0;
an = 2 * PI / Period;
c0 = b0 = 1;
c1 = b1 = b2 = a1 = a2 = gamma1 = 0;
beta1 = 2.415 * ( 1- cos( an ) );
alpha = -beta1 + sqrt( beta1 ^ 2 + 2 * beta1 );
alpha1 = ( cos( an ) + sin( an ) - 1 )/cos( an );
{
fo = alpha ^ 2;
f1 = 2 * ( 1- alpha ); f2 = -( 1 - alpha )*( 1 - alpha );
}
return jIIR2( input, fo,f1,f2);
}
period=Param("period",13,1,40,1);
//Plot( Close, "Price", colorBlack, styleCandle );
Plot( GSMA( C,period), "GSMA", colorLime );
|
|
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Такого варианта в сети полно. Но в оригинале 3 параметра. (дата, период и poles). А твой вариант только 2 параметра. Там poles == 2. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Enhema
Зарегистрирован: 25.12.2014
Сообщения: 36
|
Олег, ругается.
Error 29. Variable 'poles' used without having been initialized. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Угу. Конечно ругается. Исправил Вместо poles там надо 1 или 2 или 3 или 4 |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDzenLi
Зарегистрирован: 20.04.2015
Сообщения: 383
Откуда: VRN
|
Олег, с вашего позволения:
period = Param("period",13,1,40,1);
poles = Param("poles",1,1,4,1);
Plot(GSMA( C, period, poles), "GSMA", colorRed); |
_________________ Нам не дано знать всего. |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number |
|
spitfire
Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow
|
Хм, действительно. Олег, расскажи вкратце в чем физический смысл параметра poles? |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Точность возрастает. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|