Bug sur ROUND dans Prorealtime?
Forums › ProRealTime forum Français › Support ProBuilder › Bug sur ROUND dans Prorealtime?
- This topic has 14 replies, 2 voices, and was last updated 7 years ago by Nicolas.
-
-
05/17/2017 at 4:08 PM #35858
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à 🙁
05/17/2017 at 4:13 PM #3586105/17/2017 at 8:32 PM #3589905/17/2017 at 8:50 PM #3590005/17/2017 at 9:53 PM #3590305/17/2017 at 10:54 PM #35907Alors je t’envoie quelques screenshots.
Le code est le suivant (c’est le tien sans la fin)
12345678910111213141516171819202122232425262728293031323334353637383940414243//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 = customcloseSumX = 0SumXX = 0SumXY = 0SumYY = 0SumY = 0if barindex>Period then// adaptive r-squared periodsfor k=0 to period-1 dotprice = Data[k]SumX = SumX+(k+1)SumXX = SumXX+((k+1)*(k+1))SumXY = SumXY+((k+1)*tprice)SumYY = SumYY+(tprice*tprice)SumY = SumY+tpricenextQ1 = SumXY - SumX*SumY/periodQ2 = SumXX - SumX*SumX/periodQ3 = SumYY - SumY*SumY/periodiRsq=((Q1*Q1)/(Q2*Q3))//returned moving averageavg = exponentialaverage[Period+Period*(iRsq-0.25)](Data)endifRETURN avg1er 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.
05/18/2017 at 8:35 AM #35936Je 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:
1avg = exponentialaverage[Period+Period*(max(ticksize,iRsq-0.25))](Data)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 ?
05/18/2017 at 9:11 AM #3594505/18/2017 at 9:28 AM #3594705/18/2017 at 10:26 AM #3595805/18/2017 at 11:48 AM #3597805/18/2017 at 2:42 PM #3599505/18/2017 at 4:34 PM #36004A 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 :
123if(q2*q3>0) theniRsq=round((Q1*Q1)/(Q2*Q3))endif05/18/2017 at 8:27 PM #36031A 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 🙂
05/18/2017 at 9:26 PM #36035 -
AuthorPosts