Bonjour,
J’ai utilisé récemment l’indicateur https://www.prorealcode.com/prorealtime-indicators/r-squared-adaptive-exponential-moving-average/
Il crashe dans certains cas. Après avoir essayé de débugger, je suis arrivé à la conclusion qu’il y’avait un bug dans PRT et surement dans la fonction ROUND
Sur la valeur “Chargeurs” (CRI) en 2012, ROUND(Period+Period*(iRsq-0.25)) renvoie 2000 millions. Ce qui n’est pas possible quand iRsq vaut 0.7 et que la période est à 3.
Il est à noter que sans ROUND, exponentialaverage plante quand même. Je soupçonne qu’ils fassent un round en interne qui plante.
Voilà 🙁
J’ai même essayé ce code sans succès non plus :
iRsq = ((Q1 * Q1) / (Q2 * Q3))
iPer = ROUND(Period + Period * (iRsq - 0.25))
IF iPer < 1 THEN
iPer = 1
ENDIF
MA = ExponentialAverage[iPer](Series)
Même bug avec des périodes plus grandes sur pas mal d’actions.
Quel FAIL.
Je sais pas d’où ça vient mais soit c’est ROUND soit c’est ExponentialAverage…
Pourrais-tu stp nous donner des exemples en “image” stp, histoire de reproduire le problème, merci.
Alors je t’envoie quelques screenshots.
Le code est le suivant (c’est le tien sans la fin)
//PRC_r-squared adaptive Exponential Moving Average | indicator
//25.01.2017
//Nicolas @ www.prorealcode.com
//Sharing ProRealTime knowledge
//--- parameters
// Period = 20
// flLookBack = 25 // Floating levels lookback period
// flLevelUp = 90 // Floating levels up level %
// flLevelDown = 10 // Floating levels down level %
//---
Data = customclose
SumX = 0
SumXX = 0
SumXY = 0
SumYY = 0
SumY = 0
if barindex>Period then
// adaptive r-squared periods
for k=0 to period-1 do
tprice = Data[k]
SumX = SumX+(k+1)
SumXX = SumXX+((k+1)*(k+1))
SumXY = SumXY+((k+1)*tprice)
SumYY = SumYY+(tprice*tprice)
SumY = SumY+tprice
next
Q1 = SumXY - SumX*SumY/period
Q2 = SumXX - SumX*SumX/period
Q3 = SumYY - SumY*SumY/period
iRsq=((Q1*Q1)/(Q2*Q3))
//returned moving average
avg = exponentialaverage[Period+Period*(iRsq-0.25)](Data)
endif
RETURN avg
1er screen : mes settings et un exemple d’action
2ème screen : le plantage en période 7 (ça plante sur d’autres)
3ème screen: j’ai fait un ROUND(Period+Period*(iRsq-0.25))
4ème screen: j’affiche juste iRsq= ROUND(((Q1*Q1)/(Q2*Q3)))
On voit que y’a un problème sur le ROUND…
Maintenant même sans ROUND ça plante dans average. A mon avis c’est joli bon gros bug.
Je reproduis le problème en effet chez prorealtime et pas PRT-CFD.
J’ai résolu le problème des valeurs négatives en changeant le calcul de la période dynamique comme ceci: [scode]avg = exponentialaverage[Period+Period*(max(ticksize,iRsq-0.25))](Data)[/scode]
Pour le soucis d’erreur “NULL”, je me demande si ça n’est pas lié à l’historique, tu rencontres la même chose sur d’autres instruments ?
Avec des périodes impaires uniquement ?
Non tout 🙁
Je pense que ça doit être aussi du aux historiques et que c’est un bug.
Mais ça craint un peu je trouve.
Il faudrait peut être contacter les développeurs. Tu sais s’il y’en a qui sont sur le forum?
Oooh il y a beaucoup de gens qui rôdent dans les parages 🙂 Je vais passer le mot à ce sujet, on va essayer de comprendre !
A priori le problème vient du fait que sur certaines bougies, Q2*Q3 vaut NaN (ou 0). Du fait, la division par un nombre nul donne un résultat forcément démesuré. Je n’ai pas encore compris pourquoi, mais voilà 1 solution que l’on vient de me suggérer :
if(q2*q3>0) then
iRsq=round((Q1*Q1)/(Q2*Q3))
endif
A priori le problème vient du fait que sur certaines bougies, Q2*Q3 vaut NaN (ou 0). Du fait, la division par un nombre nul donne un résultat forcément démesuré. Je n’ai pas encore compris pourquoi, mais voilà 1 solution que l’on vient de me suggérer :
En fait Q2*Q3 ne peut pas être nul, ni NaN car on aurait directement un plantage sur la division. Ce qui n’est pas le cas.
Si tu affiches juste iRsq = (Q1*Q1) / (Q2*Q3) sans aller plus loin, tu n’auras pas de plantage alors qu’avec 0 ou NaN ça devrait planter. Tu auras juste du démesuré.
Donc ça reste super bizarre pour moi. La seule explication que je vois c’est que Q2*Q3 = 0.000000001 un truc du genre. Sauf que je vois pas du tout comment c’est possible car c’est une somme de prix sur une période donnée et le prix n’est jamais à 0.0000 et des brouettes 🙂
Je suis d’accord une division par zéro donnerai un autre type d’erreur. La boucle qui calcul Q2 et Q3 ne peut donner des valeurs nulles. Pourrais-tu me donner les autres exemples que tu as trouvé ? Merci.