// Keltner Channel
periodMA=20
periodATR=10
k=2
a = close
MA = ExponentialAverage[periodMA](close)
// Upper Keltner Band
UpperBand = MA + k*AverageTrueRange[periodATR](close)
// Lower Keltner Band
LowerBand = MA - k*AverageTrueRange[periodATR](close)
rangeKeltner = upperband - lowerband
//////////////////////////////// Trend Envelopppes
timePeriod=14
Deviation=0.1
price=customclose
dsma = WeightedAverage[timePeriod](price)
valuesHigh = (1 + deviation / 100) * dsma
valuesLow = (1 - deviation / 100) * dsma
inputs=price
if (inputs > valuesHigh)then
trend = 1
elsif (inputs < valuesLow) then
trend = -1
endif
if (inputs > valuesHigh) then
ecartup = inputs - lowerband
elsif (inputs < valuesHigh) then
ecartup = 0
endif
if (trend > 0) then
alpha1 = 0
if ( valuesLow < valuesLow[1]) then
valuesLow = valuesLow[1]
endif
if trend[1]>0 then
outputs0 = valuesLow
outputs1 = valueshigh
alpha0 = 255
endif
else
alpha0=0
if (valuesHigh > valuesHigh[1]) then
valuesHigh = valuesHigh[1]
endif
if trend[1]<0 then
outputs1 = valuesHigh
outputs0 = valueslow
alpha1 = 255
endif
endif
if trend = 1 then
posUp = ((outputs0 - lowerband) / rangekeltner)*100
elsif trend = -1 then
posUp = 0
endif
if trend = -1 then
posDn = ((outputs1 - upperband) / rangekeltner)*100
elsif trend = 1 then
posDn = 0
endif
ll = highest[50] (posdn > -5)
return posUp as "posup", posDn as "posdn", ll as "ll"
bonjour,
je reviens sur une demande que j’ai vu à de multiples reprises sur ce forum aves les solutions apportées mais que je n’arrive pas à adapter à mon cas. J’ai joint mon indicateur construit à partir de la formule de Keltner et d’un autre indicateur dont j’avais demandé la traduction pour être adapté à IG.
Je voudrais pouvoir identifier le plus bas des “posUp” et le plus haut des “PosDn” sur par exemple les 50 dernières périodes. J’ai tenté (pour identifier le plus haut du “posDn”) avec la formule “ll = highest[50] (posdn > -5)” en mettant posdn > -5 pour qu’il ne prenne pas la valeur “0”. Mais l’indicateur me ressort une donnée à 0.
Quelqu’un peut il m’aider à solutionner ce problème?
Merci et bon week-end.
Ok, si j’ai bien compris, tu veux le plus bas de l’un et le plus haut de l’autre sauf quand égal à zéro, c’est ça? Si oui, alors on peut remplacer toute la fin du code ci-dessus à partir de la ligne 66 par:
if trend = 1 then
posUp = ((outputs0 - lowerband) / rangekeltner)*100
posUpfiltre=posUp
elsif trend = -1 then
posUp = 0
posUpfiltre=close*1000000
endif
if trend = -1 then
posDn = ((outputs1 - upperband) / rangekeltner)*100
posDnfiltre=posDn
elsif trend = 1 then
posDn = 0
posDnfiltre=-close*1000000
endif
ll = highest[50](posDnfiltre)
hh = lowest[50](posUpfiltre)
return posUp as "posup", posDn as "posdn", ll as "ll", hh as "hh"
NB: j’ai repris la notation ll que tu avais commencé, mais même si on nomme les variables comme on veut, juste une remarque en général sur le site on prend ll pour “lower low”, ce qui n’est pas le cas du type de calcul recherché ici puisque même si ça se passe vers le bas, on cherche en fait un plus haut d’une série basse (resp hh et higher high, alors que recherche de plus bas d’une série haute)
C’est parfait. Merci pour votre aide. Et je prends bonne note de votre remarque.
Bonsoir,
je vous fait un retour sur l’indicateur : les paramètres LL et HH fonctionnent pour les paires cotées contre yen mais pas pour le reste. Il me semble qu’il s’agit d’un problème d’échelle, les LL et HH étant autour (et c’est un exemple) à 1,24 et – 1,24 pour la paire GBP/CHF alors que le PosUp et le PosDn dépassent les 350. Donc les LL et HH sont écrasés.
Merci.
Oui mais ça ce serait dû à la formule de ces posDn et PosUp en amont, pas à la recherche de leurs plus haut et plus bas 0 exclu, ou est-ce qu’il y a un doute sur l’identification des plus haut et plus bas?
Bonsoir, oui c’est possible. Je reverrai ce week-end les constituants de mon indicateur. Si je n’aboutis pas, je posterai de l’aide dans le forum dédié. Mais dans les faits, il n’est pas très compliqué.