Comparer valeur précedente dans boucle
Forums › ProRealTime forum Français › Support ProBuilder › Comparer valeur précedente dans boucle
- This topic has 10 replies, 3 voices, and was last updated 4 years ago by Nicolas.
-
-
10/05/2020 at 12:32 AM #146425
Bien le bonjour !
Je me permets de solliciter votre attention concernant une problèmatique qui a déjà été soulevée me semble-t-il. J’insiste néanmoins afin de trouver auprès de vous une solution et/ou alternative. La prog a cela de captivant : contourner les obstacles. Pour ma part, j’ai usé ma logique sur cette difficulté……
Je m’explique donc :
Je souhaite réaliser une boucle et retenir le resultat ($x) le plus intéressant. L’ennui est que je n’arrive pas à “mémoriser” le résultat précédent afin de pouvoir comparer mes valeurs entre elles ($resultat et $resultatPrecedent) comprises entre i et i+1… J’ai écumé un peu le forum où il est question d’utiliser les array (disponibles à partir de la version 11). Est-il possible en attendant de passer outre ?
Dans mon exemple, je souhaite comparer différents niveaux de fractales et retenir le niveau le plus près de mon seuil ($seuil) sans que ce niveau soit supérieur à $seuil.
Voici mon code :
123456789101112131415161718192021222324252627282930seuil=1.17178resultat=0FOR i=1 TO 5 DOIF (low[0] <= lowest[((i)*2+1)+0](low[0])[0]) THENniveau=low[0]ENDIFresultatPrecedent=resultat //Ne fonctionne pas : resultatPrecedent=resultatPostScriptumPrecedent=PostScriptum //Fonctionne : PostScriptumPrecedent<>PostScriptumIF niveau<seuil THENresultat=seuil-niveauELSEresultat=resultatPrecedentCONTINUEENDIFPostScriptum=PostScriptum+1IF ((resultat<resultatPrecedent) AND (resultatPrecedent>0)) OR (resultatPrecedent=0 AND i=1) THENx=niveauboucle=iELSEx=xboucle=boucleENDIFNEXTCe que j’attendrais dans le meilleur des mondes si $seuil=1.17178 :
+ i ++ $niveau ++ x ++ boucle ++ resultat ++ resultatPrecedent +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 ++ 1.17078 ++ 1.17078 ++ 1 ++ 0.00100 ++ 0 +
+ 2 ++ 1.17120 ++ 1.17120 ++ 2 ++ 0.00058 ++ 0.00100 +
+ 3 ++ 1.16500 ++ 1.17120 ++ 2 ++ 0.00058 ++ 0.00058 +
+ 4 ++ 1.17110 ++ 1.17120 ++ 2 ++ 0.00058 ++ 0.00058 +
+ 5 ++ 1.17160 ++ 1.17160 ++ 5 ++ 0.00018 ++ 0.00058 +
++ 0.00018 +
Là où le bât blesse :
$resultatPrecedent me renvoie la même valeur que $resultat[i] au lieu de me renvoyer la valeur de la boucle précédente c-a-d resultat[i-1]…
De ce fait, je n’ai aucun moyen de comparer $resultat et $resultatPrecedent dans la mesure où $resultat est systématiquement et strictement égale à $resultatPrecedent
PS : Je me suis “amusé” à incrémenter une variable ($PostScriptum) et dans ce cas, ça fonctionne : $PostScriptum est différent de $PostScriptumPrecedent et ces valeurs peuvent être comparées…
Merci d’avance de votre aide la communauté ! A u plaisir de vous lire 😉
10/05/2020 at 9:40 AM #146436Bjr,
Pour info et dans un souci de clarté dans le cadre de la modération du forum, étant donné que les tableaux(arrays) en v11 utilisent le symbole $ il vaudra mieux dans les prochains messages ne pas utiliser $ pour dénommer des variables simples afin d’éviter toute confusion entre une variable et un tableau(array) pour les lecteurs.
J’imagine que tes data sont sur eurusd, mais n’ayant ni timeframe ni dates et heures de l’exemple je ne peux pas tester sur exactement le même échantillon, essayer avec ceci?
12345678910111213141516171819202122232425seuil=1.17178resultat=0resultatPrecedent=0niveau=seuilFOR i=1 TO 5 DOIF (low<=lowest[2*i+1](low)) THENniveau=lowENDIFif resultat<>0 thenresultatPrecedent=resultatendifIF niveau<seuil THENresultat=seuil-niveauif resultat<resultatPrecedent or resultatPrecedent=0 thenx=niveauENDIFENDIFNEXTreturn x as "x"1 user thanked author for this post.
10/06/2020 at 2:03 PM #146579Bonjour Noobywan, merci de ta réponse ! C’est noté pour les $ 😉
J’ai essayé ton code mais les résultats sont assez erratiques. J’ai d’ailleurs un peu de mal à comprendre et interpréter ceux-ci. Quelque chose m’échappe…
J’ai modifié mes conditions afin de retenir – cette fois – l’écart le plus grand entre ma limite=close*1.10 et mon niveau de fractale le plus bas selon [2*i+1]. Ceci afin que les résultats soient (davantage) différents selon la timeframe et la devise.
En effet, lors de mon précédent exemple (où l’on cherchait l’écart le plus petit), l’écart minimum était obtenu dès la première boucle (bien souvent)… donc pas facile pour tirer des conclusions lors des tests…
Voilà mon code (modifié précedemment par Noobywan) :
123456789101112131415161718192021222324252627282930313233limite=close*1.10resultat=0resultatPrecedent=0niveau=limiteFOR i=1 TO 5 DO //J'ai également essayé avec i=5 DOWNTO 1 mais là les résultats sont complètement étranges......IF (low<=lowest[2*i+1](low)) THENniveau=lowENDIFif resultat<>0 thenresultatPrecedent=resultatendifIF niveau<limite THENresultat=limite-niveauIF resultat>resultatPrecedent OR resultatPrecedent=0 THEN //Dans cette exemple, je cherche l'écart le plus grand où resultat>resultatPrecedentx=niveau //Niveau de fractale le plus bas afin d'obtenir l'écart le plus grand par rapport à ma limite=close*1.10boucle=i //boucle dans laquelle je me trouveENDIFENDIFNEXTGRAPH limiteGRAPH resultatGRAPH resultatPrecedentGRAPH xGRAPH bouclePour information, j’effectue mon backtest sur l’EURUSD sur la timeframe 1H en temps réel mais les tests peuvent s’effectuer sur toutes les paires et/ou timeframes
Merci d’avance de vos retours ! 😉
10/06/2020 at 3:05 PM #146583Je ne suis pas tombé sur des cas erratiques. Mais si tu changes la recherche pour passer de l’écart mini au maxi, j’ai l’impression que ta question n’était peut être pas tant de trouver le mini, que de voir ce qu’il se passe dans la boucle? Si c’est ça, alors il faut garder à l’esprit une chose: l’indicateur ne t’affichera qu’un seul jeu de valeurs par bougie, donc tu ne pourras pas voir toutes les itérations de la boucle en stockant une seule fois “résultatprécédent” qui parfois n’enclenchera pas, parfois sera écrasé une ou plusieurs fois par un successeur pour n’afficher que le dernier resultatprecédent en clôture… Si tel est le cas, vu que la boucle est petite, tu peux facilement avec un if sur le i stocker resu1, resu2, resu3, resu4, resu5 et retourner ces 5 valeurs dans la ligne return, pour mieux décortiquer ce qu’il se passe dans la boucle.
10/06/2020 at 5:33 PM #146589Re Noobywan ! Merci de ton retour,
Mais si tu changes la recherche pour passer de l’écart mini au maxi, j’ai l’impression que ta question n’était peut être pas tant de trouver le mini, que de voir ce qu’il se passe dans la boucle?
Effectivement, j’essaye de comprendre concrètement ce qui se passe au sein de cette boucle. Logiquement, je m’attendrais à trouver certains résultats , ce qui n’est pas le cas malheureusement…
A partir du code ci-dessous sur l’EURUSD 4H (afin que l’on parle des mêmes choses 😉 ), je m’attendrais donc à trouver les valeurs suivantes :
limite = 1.29704
boucle = 5 //itération qui correspond à la condition (resultat>resultatPrecedent OR resultatPrecedent=0)
x = 1.16959 /niveau de fractale le plus bas
resultat = 0.13557 //écart maxi en cours
resultatPrecedent = 0.12745 //écart maxi précédent en cours…
Or, je trouve depuis le backtest :
limite = 1.29704
boucle = 1
x = 0
resultat = 0
resultatPrecedent = 0
………………….. :'(
1234567891011121314151617181920212223242526272829303132limite=close*1.10resultat=0resultatPrecedent=0niveau=limiteFOR i=1 TO 5 DOIF (low<=lowest[2*i+1](low)) THENniveau=lowENDIFIF resultat<>0 THENresultatPrecedent=resultatENDIFIF niveau<limite THENresultat=limite-niveauIF resultat>resultatPrecedent OR resultatPrecedent=0 THEN //Dans cette exemple, je cherche l'écart le plus grand où resultat>resultatPrecedentx=niveau //Niveau de fractale le plus bas afin d'obtenir l'écart le plus grand par rapport à ma limite=close*1.10boucle=iENDIFENDIFNEXTGRAPH limiteGRAPH resultatGRAPH resultatPrecedentGRAPH xGRAPH boucleMerci d’avance !
10/06/2020 at 6:15 PM #146595Je recommande un indicateur à mettre en dessous de la fenêtre prix plutôt qu’un backtest, on peut voir plus de variables, et mieux customiser style et couleurs de lignes (et on est dans le forum probuilder)
Voici pour voir chacun des 5 pas de la boucle:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455limite=close*1.10resultat=0resultatPrecedent=0niveau=limiteFOR i=1 TO 5 DOIF (low<=lowest[2*i+1](low)) THENniveau=lowENDIFIF resultat<>0 THENresultatPrecedent=resultatENDIFIF niveau<limite THENresultat=limite-niveauIF resultat>resultatPrecedent OR resultatPrecedent=0 THEN //Dans cette exemple, je cherche l'écart le plus grand où resultat>resultatPrecedentx=niveau //Niveau de fractale le plus bas afin d'obtenir l'écart le plus grand par rapport à ma limite=close*1.10boucle=iENDIFENDIFif i=1 thenresultat1=resultatresultatPrecedent1=resultatPrecedentx1=xboucle1=boucleelsif i=2 thenresultat2=resultatresultatPrecedent2=resultatPrecedentx2=xboucle2=boucleelsif i=3 thenresultat3=resultatresultatPrecedent3=resultatPrecedentx3=xboucle3=boucleelsif i=4 thenresultat4=resultatresultatPrecedent4=resultatPrecedentx4=xboucle4=boucleelsif i=5 thenresultat5=resultatresultatPrecedent5=resultatPrecedentx5=xboucle5=boucleendifNEXTreturn limite as "limite", resultat1 as "resultat1", resultat2 as "resultat2", resultat3 as "resultat3", resultat4 as "resultat4", resultat5 as "resultat5", resultatPrecedent1 as "resultatPrecedent1", resultatPrecedent2 as "resultatPrecedent2", resultatPrecedent3 as "resultatPrecedent3", resultatPrecedent4 as "resultatPrecedent4", resultatPrecedent5 as "resultatPrecedent5", x1 as "x1", x2 as "x2", x3 as "x3", x4 as "x4", x5 as "x5", boucle1 as "boucle1", boucle2 as "boucle2", boucle3 as "boucle3", boucle4 as "boucle4", boucle5 as "boucle5"10/07/2020 at 9:36 AM #14662810/07/2020 at 10:09 AM #146636Pour bien comprendre, faut-il trouver un fractal du passé qui est le plus près du prix actuel ?
Effectivement, l’idée serait de trouver un fractal du passé qui est le plus près (ou le plus éloigné) du prix actuel par exemple. J’ai pris l’exemple des fractals pour illustrer mon problème au sein de cette boucle d’itération. A l’issu de cette boucle, j’aimerais obtenir chaque résultat au sein d’une seule et même variable si possible. Par exemple, à l’itération n°5 (sortie boucle = 5), mon fractal le plus éloigné du prix (sortie resultat) est situé à tel prix (sortie x)…
Si oui tu es certain de la définition de ces fractals avec ta formule: low<=lowest[2*i+1](low) ??
Cette formule “agrandie” à chaque itération l’échantillon de bougie à étudier, soit le niveau/prix le plus bas pour 3 bougies, 5, 7, 9 …
10/07/2020 at 3:04 PM #146673Si je remplace :
123IF (low<=lowest[2*i+1](low)) THENniveau=lowENDIFpar :
1niveau=low[i]… afin de trouver le plus bas (sur i périodes) par rapport au prix actuel, alors dans ce cas, j’obtiens parfaitement les réponses que je souhaite pour x, boucle, resultat et resultatPrecedent
Cf. image en pj avec à gauche les résultats pour niveau=low[i]
10/07/2020 at 7:05 PM #146690Si oui tu es certain de la définition de ces fractals avec ta formule: low<=lowest[2*i+1](low) ??
Je viens de comprendre le sens de ta question Nicolas… désolé 🥴
Dans cette itération, la formule ci-dessus ne compare que mon dernier low[0] au plus bas des … 3, 5, 7, 9, 11 plus bas précédents et si ce low[0] n’est jamais inférieur, mes résultats sont “bloqués” à la première itération……….. alors que je cherche effectivement à “trouver un fractal du passé qui est le plus près du prix actuel” …. 🤯
Dans ce cas, comment m’y prendre ? 🤔🥺
10/08/2020 at 8:28 AM #146706Ce serait nettement plus facile avec les tableaux en v11, voir par exemple cette détection de supports et résistances avec des fractals du passé justement (ils sont tous placés dans un tableau que l’on “scanne” dans une boucle à chaque nouvelle bougie) https://www.prorealcode.com/topic/array-variables-availability-in-prorealtime/#post-118817
En v10.3, voilà la solution ce que je te propose, bien entendu on doit limiter la boucle dans l’historique sinon les calculs seront très long !
1234567891011121314151617181920212223242526272829303132333435363738394041// settingspriceLevel = 1.17178FractalPeriod = 3barLimit = 200// ----------------// ------------------//defining low fractalscp=FractalPeriodif low[cp] <= lowest[2*cp+1](low) thenLL= -1elseLL=0endifif LL = -1 thenLOL = low[cp]DRAWTEXT("▲",barindex[cp],lol,Dialog,Bold,12) //coloured(100,100,100,100)fractal=lolendif// -----------------//looking for the nearest fractal to priceLeveldiff=priceLevel*10lastfractal=0lastdiff=0for i = 0 to barLimit-1 doif fractal[i]>0 and lastFractal<>fractal[i] thendiff=min(diff,abs(fractal[i]-priceLevel))if diff<>lastdiff thennearestFractal=fractal[i]endiflastFractal=fractal[i]lastdiff=diffendifnextreturn nearestFractal,pricelevel coloured(200,200,0)La ligne orange est ton seuil de prix et la ligne blanche le niveau du fractal bas le plus proche de celle-ci dans les 200 dernières bougies en arrière, depuis chaque bougie.
1 user thanked author for this post.
-
AuthorPosts
Find exclusive trading pro-tools on