Je sèche sur la Parabolic weighted MA avec la boucle qui contient r 🙂
Pas mal de petites fautes que je corrige dans les indicateurs que j’ai publié.
Zero Lag Exponential Moving Average by John Ehlers
// --- parameters
Series = CustomClose
// Period = 20
// ---
Period = MAX(Period, 1)
alpha = 2 / (1 + Period)
per = ROUND((Period - 1) / 2)
IF BarIndex <= per THEN
ZLEMA = Series
ELSE
ZLEMA = ZLEMA[1] + alpha * (2 * Series - Series[per] - ZLEMA[1])
ENDIF
RETURN ZLEMA
Ahrens Moving Average
//-----------------------//
// Ahrens Moving Average //
//-----------------------//
// --- parameters
Series = CustomClose
// Period = 20
// ---
IF BarIndex < Period THEN
AHMA = Series
ELSE
AHMA = AHMA[1] + ((Series - ((AHMA[1] + AHMA[Period]) / 2)) / Period)
ENDIF
RETURN AHMA
Toujours du mal avec la Parabolic weighted MA! 🙂
Du mal avec la boucle for et le r-k. C’est du repaint? Ou je rate un truc!
Aujourd’hui tentative de convertir http://unicorn.us.com/trading/src/_filter2pole.txt
J’ai tout bon sauf la fin… c’est balot 🙂
for m = 1 to Fs begin {Fs=1 usually, except for small length}
j = cascades-1;
sig2 = sig1; {prior previous value of input signal}
sig1 = sig0; {previous value of input signal}
sig0 = p; {current input value}
{this is the 1-pass filter}
bw2[j] = bw1[j]; {prior previous filter value}
bw1[j] = bw0[j]; {previous filter value}
bw0[j] = a0*sig0 + a1*sig1 + a2*sig2 + b1*bw1[j] + b2*bw2[j];
{cascade additional filters if needed}
while j > 0 begin
k = j; j = j - 1;
bw2[j] = bw1[j]; {shift current filter values to prior values}
bw1[j] = bw0[j];
bw0[j] = a0*bw0[k] + a1*bw1[k] + a2*bw2[k] + b1*bw1[j] + b2*bw2[j];
end;
end;
Converti en :
// actual filtering starts here
FOR m = 1 TO Fs DO
j = cascades - 1
sig2 = sig1
sig1 = sig0
sig0 = Series
bw2[j] = bw1[j]
bw1[j] = bw0[j]
bw0[j] = a0 * sig0 + a1 * sig1 + a2 * sig2 + b1 * bw1[j] + b2 * bw2[j]
WHILE j > 0 DO
k = j
j = j - 1
bw2[j] = bw1[j]
bw1[j] = bw0[j]
bw0[j] = a0 * bw0[k] + a1 * bw1[k] + a2 * bw2[k] + b1 * bw1[j] + b2 * bw2[j]
WEND
NEXT
Forcément ça me plante aux tableaux. Personne verrait une astuce pour convertir ça correctement? Je suis preneur 🙂
Les variables qui s’incrementent en tableau dynamique, tu peux essayer de les renommer en leur donnant un nom distinct pour chacune d’elles.
Les variables qui s’incrementent en tableau dynamique, tu peux essayer de les renommer en leur donnant un nom distinct pour chacune d’elles.
Salut Nicolas!
Je comprends pas trop comment faire. 🙁
Tu pourrais me donner un exemple avec un bw pour voir?
J’ai bien regardé et ça ne fonctionne pas ici, car tes variables bw0, bw1 et bw2 doivent toutes bien s’incrémenter avec j qui est dynamique … 🙁
One More Average
// OMA - One More Average
// --- parameters
Series = CustomClose
// Period = 20
Adaptive = 1
Sensibility = 1
//--------
Period = MAX(Period, 1)
Sensibility = MAX(Sensibility, -1.5)
Data = Average[1](Series)
averagePeriod = Period
IF BarIndex < Period THEN
OMA = Series
ELSE
IF Adaptive = 1 AND averagePeriod > 1 THEN
minPeriod = averagePeriod / 2.0
maxPeriod = minPeriod * 5.0
endPeriod = ROUND(maxPeriod)
signal = ABS((Data - Data[endPeriod]))
noise = 0.00000000001
FOR k = 1 TO endPeriod DO
noise = noise + ABS(Data - Data[k])
averagePeriod = ROUND(((signal / noise) * (maxPeriod - minPeriod)) + minPeriod)
NEXT
ENDIF
alpha = (2.0 + Sensibility) / (1.0 + Sensibility + averagePeriod)
e1 = e1 + alpha * (Data - e1)
e2 = e2 + alpha * (e1 - e2)
v1 = 1.5 * e1 - 0.5 * e2
e3 = e3 + alpha * (v1 - e3)
e4 = e4 + alpha * (e3 - e4)
v2 = 1.5 * e3 - 0.5 * e4
e5 = e5 + alpha * (v2 - e5)
e6 = e6 + alpha * (e5 - e6)
OMA = 1.5 * e5 - 0.5 * e6
ENDIF
RETURN OMA
Voici mon code,
Vous auriez une idée de comment faire pour filtrer les valeurs proches de BarIndex = 0?
Cela fait du méga bruit, c’est même pas la valeur du cours et c’est moche.
J’attache un screen pour vous donner une idée!
Merci Nicolas,
En fait l’idée c’était de savoir si quelqu’un avait une idée pour virer le bruit du début sur l’indicateur. 🙂
Parabolic weighted MA
// --- parameters
Series = CustomClose
// Period = 20
//--------
Period = MAX(Period, 1)
SumW = Period * Period
Sum = SumW * Series
FOR i = 0 TO Period DO
Weight = (Period - i) * (Period - i)
SumW = SumW + Weight
Sum = Sum + Weight * Series[i]
NEXT
RETURN Sum / SumW
ça doit être sûrement ça!
Le bruit que tu observes est à la ligne 18 de ton code. En général j’attends qu’il y est assez de barindex pour commencer à tracer les résultats des calculs, voir le code des indicateurs que je t’indique dans mon post précédent.