Problème de boucles
Forums › ProRealTime forum Français › Support ProBuilder › Problème de boucles
- This topic has 5 replies, 2 voices, and was last updated 1 year ago by
BenCD.
-
-
08/10/2023 at 8:17 AM #218884
Bonjour à tous,
Cela fait maintenant trop longtemps que je bloque sur un code, et j’aimerai avoir vos avis / idées.
Je cherche à avoir ‘graphiquement’ et en ‘valeurs utilisables’ les obliques resistance et support.
J’aimerai qu’à chaque début d’heure (je travaille en chandelle 1 minute, sur le MES0923) mon code, prenne comme premier point le point le plus haut de la journée, et test chaque high (après le point haut) comme deuxième point pour tirer une droite et vérifier que cette dernière n’est pas coupée.
Cela fonctionne très bien pour ma résistance, c’est parfait…
Quand je transpose mon code vers le support… J’ai un message d’erreur comme quoi une boucle est sans fin ou à trop d’itérations.
Pourtant c’est le même principe que pour la résistance, qui fonctionne très bien.Après des milliers d’essais, si je “commente / dé-commente” les lignes 161 à 189 de mon code, la cela fonctionne, donc j’imagine que c’est la 2ème boucle que le code n’apprécie pas, mais je ne comprends pas pourquoi, ni comment surmonter ce problème.
Des idées?
N’hésitez pas à me dire s’il faut des explications plus précises,
Merci beaucoup d’avance,Benjamin
Mon code juste en dessous, je n’arrive toujours pas à l’intégrer dans un post de forum.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212Defparam DrawOnLastBarOnly = trueDefparam CalculateOnLastBars = 1500//_________________________________________________________ TIMINGHeures = HourMiinutes = MinuteSecondes = SecondHeureDebutChandelle = HeureFinChandelle[1]HeureFinChandelle = Hour * 10000 + Miinutes * 100 + Secondesif HeureFinChandelle < HeureFinChandelle[1] thenHeureDebutChandelle = 0endif//______________________________________________ NOMBRE CHANDELLESNombreChandelles = 1if HeureDebutChandelle > HeureDebutChandelle[1] thenNombreChandelles = NombreChandelles[1] + 1endif//__________________________________________________ INFOS JOURNEEif NombreChandelles < NombreChandelles[1] thenDebutJournee = barindexOuvertureJournee = openPlusBasJournee = min(Open,Close)PlusHautJournee = max(Open,Close)endif//__________________________________________________ REMISE A 0if NombreChandelles < NombreChandelles[1] thenColonneArrayxArriveeRO = 0ColonneArrayyArriveeRO = 0ColonneArrayxArriveeSO = 0ColonneArrayyArriveeSO = 0endif//__________________________________________________ BLOCKSBlock = 60BlockPerDay = (60 / Block) * 24for i = 1 to BlockPerDay dodrawvline (DebutJournee + (i * Block)) style (dottedline) coloured (180,180,180,100)next//__________________________________________________ COORDONEES PLUS HAUTif High >= PlusHautJournee thenPlusHautJournee = HighxPH = BarindexyPH = Highendif//__________________________________________________ COORDONEES PLUS BASif Low <= PlusBasJournee thenPlusBasJournee = LowxPB = BarindexyPB = Lowendif//__________________________________________________ LOOKBACKBlockLine = (NombreChandelles / Block) - ceil((NombreChandelles / Block))if BlockLine < BlockLine[1] thenxFinScanOblique = barindex[1]SignalBlock = 1elseSignalBlock = 0endifDrawvline (xFinScanOblique) coloured ("blue")//__________________________________________________ RESISTANCE OBLIQUEif SignalBlock = 1 and xFinScanOblique >= xDepartRO thenxDepartRO = xPHyDepartRO = yPHfor i = xDepartRO + 1 to xFinScanOblique doxArriveeRO = iyArriveeRO = high[Barindex - xArriveeRO]for j = xDepartRO + 1 to xFinScanOblique doRO = (((yArriveeRO - yDepartRO) / (xArriveeRO - xDepartRO)) * j) + (yDepartRO - ((((yArriveeRO - yDepartRO ) / (xArriveeRO - xDepartRO)) * xDepartRO)))if RO < high[Barindex - j] thenbreakendifif RO >= high[Barindex - j] thenif j = xFinScanOblique thenxArriveeRO = i$ArrayxArriveeRO[ColonneArrayxArriveeRO] = xArriveeROColonneArrayxArriveeRO = ColonneArrayxArriveeRO + 1yArriveeRO = high[Barindex - xArriveeRO]$ArrayyArriveeRO[ColonneArrayyArriveeRO] = yArriveeROColonneArrayyArriveeRO = ColonneArrayyArriveeRO + 1breakendifendifnextnextendifif ColonneArrayxArriveeRO > 0 and xFinScanOblique > xDepartRO thenxArriveeRO = $ArrayxArriveeRO[ColonneArrayxArriveeRO-1]yArriveeRO = $ArrayyArriveeRO[ColonneArrayyArriveeRO-1]drawpoint (xDepartRO, yDepartRO, 1) coloured ("red")drawpoint (xArriveeRO, yArriveeRO, 1) coloured ("red")drawline(xDepartRO, yDepartRO, xArriveeRO, yArriveeRO) coloured ("red")aRO = ((yArriveeRO - yDepartRO) / (xArriveeRO - xDepartRO))bRO = (yDepartRO - ((((yArriveeRO - yDepartRO ) / (xArriveeRO - xDepartRO)) * xDepartRO)))RO = (aRO * Barindex) + bROendif//__________________________________________________ SUPPORT OBLIQUEif SignalBlock = 1 and xFinScanOblique >= xDepartSO thenxDepartSO = xPByDepartSO = yPBfor i = xDepartSO + 1 to xFinScanOblique doxArriveeSO = iyArriveeSO = Low[Barindex - xArriveeSO]//for j = xDepartSO + 1 to xFinScanOblique do////SO = (((yArriveeSO - yDepartSO) / (xArriveeSO - xDepartSO)) * j) + (yDepartSO - ((((yArriveeSO - yDepartSO ) / (xArriveeSO - xDepartSO)) * xDepartSO)))////if SO > Low[Barindex - j] then////break////endif////if SO <= Low[Barindex - j] then////if j = xFinScanOblique then////xArriveeSO = i////$ArrayxArriveeSO[ColonneArrayxArriveeSO] = xArriveeSO////ColonneArrayxArriveeSO = ColonneArrayxArriveeSO + 1////yArriveeSO = Low[Barindex - xArriveeSO]////$ArrayyArriveeSO[ColonneArrayyArriveeSO] = yArriveeSO////ColonneArrayyArriveeSO = ColonneArrayyArriveeSO + 1//break//endif//endif//nextnextendifdrawvline(xDepartSO)if ColonneArrayxArriveeSO > 0 and xFinScanOblique > xDepartSO thenxArriveeSO = $ArrayxArriveeSO[ColonneArrayxArriveeSO-1]yArriveeSO = $ArrayyArriveeSO[ColonneArrayyArriveeSO-1]drawpoint (xDepartSO, yDepartSO, 1) coloured ("green")drawpoint (xArriveeSO, yArriveeSO, 1) coloured ("green")drawline(xDepartSO, yDepartSO, xArriveeSO, yArriveeSO) coloured ("green")aSO = ((yArriveeSO - yDepartSO) / (xArriveeSO - xDepartSO))bSO = (yDepartSO - ((((yArriveeSO - yDepartSO ) / (xArriveeSO - xDepartSO)) * xDepartSO)))SO = (aSO * Barindex) + bSOendifreturn08/10/2023 at 3:37 PM #218905Bonjour,
à propos du bouton “insert PRT code” tu peux faire un CTRL+F5 (et si les touches fonctions sont accessibles via un bouton Fn, alors CTRL+Fn+F5), s’il n’apparait pas, possible que ce soit à cause du navigateur web (pour moi ça marche avec mozilla firefox), je vais t’éditer le post pour rajouter le formatage.
A propos de ton problème de boucles, j’ai jeté un oeil, je pense que c’est parce que tes boucles seront lues même si xPB et xPH sont égales à 0 (impact sur tes xDepart SO et RO), en l’occurence une journée où ton xPH est défini mais pas encore ton xPB, alors peu d’itérations pour trouver oblique sup de xdepartRO+1 (proche de xFinScanOblique) à xFinScanOblique , mais beaucoup trop d’itérations de 0 à xFinScanOblique pour trouver oblique inf.
Le plus simple est sans doute de vérifier juste avant la boucle que tu as commentée lignes 161-189 que xPB n’est pas nul, en rajoutant un “if xPB<>0 then” et bien sûr un “endif” juste après les lignes commentées, puis de décommenter ta boucle,
et si ça fonctionne d’adapter aussi l’équivalent “if xPH<>0 then” avant le “for j = xDepartRO + 1 to xFinScanOblique do” (et “endif” après le next correspondant).
1 user thanked author for this post.
08/10/2023 at 3:54 PM #21890608/10/2023 at 4:08 PM #218910Merveilleux!
Cela fonctionne!
Merci beaucoup !Je profite de ta gentillesse et de ton aide pour essayer de bien comprendre ce que tu me dis et ne pas rester bloquer dans mon raisonnement, car pour être honnête avec toi, pour moi, xPB (ou xPH) correspond au Barindex du PH ou PB, et dans mon esprit, il ne peut pas être nul, vu qu’au minimum il corresponds au barindex de la première chandelle de ma journée (le plus bas du jour est à ‘l’ouverture’ sur la chandelle de 00h00 à 00h00s59).
C’est vrai que si c’est le xPB est sur la première chandelle et que le code lance une “étude” à 23h00, il y a un paquet de chandelle à tester (au maximum, 1380, cela est il un nombre suffisant pour que la plateforme estime qu’il y a trop d’itérations?).Une nouvelle fois, merci de ton aide! 🙂
08/10/2023 at 4:15 PM #218911Rajoute xPB et xPH à ta ligne return, et mets ton indicateur en fenêtre sous le prix, tu pourras les voir évoluer, et probablement constater en refaisant le test sur actif et UT où tu as dû commenter la boucle, que xPB n’a pas eu le comportement auquel tu t’attendais sur le début de l’historique. Ensuite, il a peut-être été défini pour le jour en cours, mais le code aura refusé de faire les itérations avant d’arriver jusque là.
1 user thanked author for this post.
08/10/2023 at 4:16 PM #218912 -
AuthorPosts