syntaxe de FOR TO DO et THEN
Forums › ProRealTime forum Français › Support ProBuilder › syntaxe de FOR TO DO et THEN
- This topic has 10 replies, 3 voices, and was last updated 1 year ago by JC_Bywan.
-
-
11/17/2023 at 11:08 AM #223863
Bonjour,
j’essaie de programmer un indicateur repérant les franchissements de DonInf en les conditionnant à un franchissement de DonSup antérieur. Je l’ai écrit ainsi:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263REM : franchissement du doninf par les bougies [0] ou [1] en configuration de retournement haussierIF open[1]>=close[1]+close/5000 AND close>=open+close/5000 AND close>=open[1]+close/5000 AND ((low[1]-close/10000<=min(low[2],min(low[3],min(low[4],min(low[5],min(low[6],min (low[7],min(low[8],low[9]))))))) AND high[1]>=min(low[2],min(low[3],min(low[4],min(low[5],min(low[6],min (low[7],min(low[8],low[9])))))))) OR (low-close/10000<=DonchianChannelDown[8] AND high>=DonchianChannelDown[8])) AND low[16]-close/10000<=low[8] AND low[15]-close/10000<=low[7] AND low[14]-close/10000<=low[6] AND low[13]-close/10000<=low[5] AND low[12]-close/10000<=low[4] AND low[11]-close/10000<=low[3] AND low[10]-close/10000<=low[2] AND min(low[2],min(low[3],min(low[4],min(low[5],min(low[6],min(low[7],min(low[8],low[9])))))))+close/10000>=min(low[9],min(low[10],min(low[11],min(low[12],min(low[13],min(low[14],min(low[15],low[16]))))))) THENREM on teste à partir de la bougie [2]FOR n=2 to n=30 DOREM cas1: si on est en franchissement du doninf on passe à la bougie précédenteIF low[n]-close/5000<=min(low[n-1],min(low[n-2],min(low[n-3],min(low[n-4],min(low[n-5],min(low[n-6],min(low[n-7],low[n-8]))))))) THENCONTINUEREM cas2: si on est strictement dans le canal…ELSIFlow[n]>min(low[n-1],min(low[n-2],min(low[n-3],min(low[n-4],min(low[n-5],min(low[n-6],min(low[n-7],low[n-8]))))))) AND high[n]+close/5000<max(high[n-1],max(high[n-2],max(high[n-3],max(high[n-4],max(high[n-5],max(high[n-6],max(high[n-7],high[n-8]))))))) THENREM cas 2a: alors si la bougie précédente est en franchissement du doninf on s’arrête et result=0IF low[n-1]-close/5000<=min(low[n-2],min(low[n-3],min(low[n-4],min(low[n-5],min(low[n-6],min(low[n-7],min(low[n-8],low[n-9]))))))) THENresult=0BREAKREM cas 2b: sinon on continueELSIF low[n-1]-close/5000>min(low[n-2],min(low[n-3],min(low[n-4],min(low[n-5],min(low[n-6],min(low[n-7],min(low[n-8],low[n-9]))))))) THENCONTINUEENDIFREM cas3: si on est sous le doninf result=0 et on s’arrêteELSIFhigh[n]<=min(low[n-1],min(low[n-2],min(low[n-3],min(low[n-4],min(low[n-5],min(low[n-6],min(low[n-7],low[n-8]))))))) THENRESULT=0BREAKREM cas 4: si on touche le donsup result=5 et on s’arrêteELSIFhigh[n]+close/5000>=max(high[n-1],max(high[n-2],max(high[n-3],max(high[n-4],max(high[n-5],max(high[n-6],max(high[n-7],high[n-8]))))))) THENRESULT=5BREAKENDIFNEXTENDIFRETURN result COLOURED ("orange")La plateforme l’accepte mais ne me donne aucun résultat positif (codé ici 5) alors que si je teste sur un cas précis de manière simple (franchissement de DonInf en [1] et franchissement de DonSup en [9] par ex.) ça marche. J’avoue que j’ai du mal avec la syntaxe des IF emboîtés et surtout des FOR TO DO CONTINUE BREAK NEXT.
Une âme charitable pour m’aider à repérer le problème ? Merci !
11/19/2023 at 10:00 AM #22390811/19/2023 at 9:22 PM #223935Bonjour Bernard13,
voici un exemple de l’indicateur (ligne orange dans la première fenêtre en bas, codé comme ci-dessus), et un exemple du “test” codé ainsi :
IF open[1]>=close[1]+close/5000 AND close>=open+close/5000 AND close>=open[1]+close/5000 AND ((low[1]-close/10000<=min(low[2],min(low[3],min(low[4],min(low[5],min(low[6],min (low[7],min(low[8],low[9]))))))) AND high[1]>=min(low[2],min(low[3],min(low[4],min(low[5],min(low[6],min (low[7],min(low[8],low[9])))))))) OR (low-close/10000<=DonchianChannelDown[8] AND high>=DonchianChannelDown[8])) AND low[16]-close/10000<=low[8] AND low[15]-close/10000<=low[7] AND low[14]-close/10000<=low[6] AND low[13]-close/10000<=low[5] AND low[12]-close/10000<=low[4] AND low[11]-close/10000<=low[3] AND low[10]-close/10000<=low[2] AND min(low[2],min(low[3],min(low[4],min(low[5],min(low[6],min(low[7],min(low[8],low[9])))))))+close/10000>=min(low[9],min(low[10],min(low[11],min(low[12],min(low[13],min(low[14],min(low[15],low[16]))))))) AND high[9]+close/5000>=max(high[10],max(high[11],max(high[12],max(high[13],max(high[14],max(high[15],max(high[16],high[17]))))))) THEN
RESULT=5
ELSE
RESULT=0ENDIF
RETURN result COLOURED (“orange”)
Destiné à vérifier que cela donne bien le signal pour un retournement avec franchissement de DonInf en bougies [1] et [0], à 16h30-16h45, précédé d’un franchissement de DonSup sur la bougie [9].
Merci de votre aide !
11/20/2023 at 10:24 AM #22394911/21/2023 at 5:27 PM #224079Bonjour
Je suppose que l’indicateur que tu appelles Donchian est en rouge. Or un Donchian de période p est caractérisé par les 2 équations simples:
plusHaut= Highest[p](Close)
plusBas= Lowest[p](Close)
Il est donc impossible que le prix casse un canal Donchian. Pour moi, cet indicateur rouge n’est pas un Donchian standard. Quelles sont ses équations ?
J’ai regardé aussi du coté d’ Ichimoku (une sorte de Donchian) mais je n’ai rien trouvé.
Le code fonctionne mais les signaux sont extrêmement rares.
🙂
11/22/2023 at 9:31 AM #224101Bonjour,
merci de ta réponse. Quand je veux dire que ça casse le Donchian, c’est qu’il passe en-dessous de la limite inférieure du canal (ou au-dessus de la limite supérieure). C’est bien
plusHaut= Highest[p](Close)
plusBas= Lowest[p](Close)
mais calculé à partir de la bougie précédente, sinon effectivement ça ne pourrait par définition pas franchir son propre plusBas. Ici c’est défini comme le lowest des bougies [1] à [8]. Mais ProBuilder ne permet pas, en tout cas pas à ma connaissance, de demander le DonchianChannelDown[8] ou un Lowest pour autre chose que la bougie [0], ni même de demander un min sur plus de deux valeurs, d’où la nécessité d’emboîter les min. Je croyais jusqu’à hier que le code ne donnait que des 0, mais apparemment il donne de très rares signaux positifs, je vais donc analyser ceux-ci, qui me donneront peut-être la clé! Un code qui marche, même complètement à contresens, est plus utile qu’un code qui ne marche pas…
11/22/2023 at 10:17 AM #224103Bonjour, juste 2 remarques sur ces 2 derniers posts:
Or un Donchian de période p est caractérisé par les 2 équations simples: plusHaut= Highest[p](Close) plusBas= Lowest[p](Close)
Le canal de Donchian est basé sur les low et high pas sur les close, d’où plutôt:
plusHaut= Highest[p]( HIGH )
plusBas= Lowest[p]( LOW )
Mais ProBuilder ne permet pas, en tout cas pas à ma connaissance, de demander le DonchianChannelDown[8] ou un Lowest pour autre chose que la bougie [0]
Il suffit d’utiliser plusHaut[1] et plusBas[1] pour faire appel à l’état de ces variables en bougie précédente (et par extension plusHaut[N] renverrait aussi l’état de la variable plusHaut en Nème bougie précédente).
En fait, puisque les crochets pour lowest/highest et les crochets pour une variable ne sont pas de même nature (p est une plage de bougies, un nombre d’éléments dans un intervalle, alors que dans plusHaut[N], N est un rang précédent de bougies), on pourrait même écrire les 2 types de crochets à la fois avec:
plusHautprecedent=highest[10](high)[1]
et ça passerait sans erreur de syntaxe pour obtenir le highest[10](high) en bougie précédente.
Personnellement je trouve plus lisible dans un code de ne pas utiliser les 2 types de crochets d’un seul coup, mais de définir d’abord plusHaut, puis d’utiliser plusHaut[N] ensuite… c’était juste pour montrer le champ des possibles…
Edit PS: je n’ai pas illustré avec les commandes donchianchanneldown et donchianchannelup , car je crois que donchianchanneldown est légèrement bugguée (décalée d’une bougie) alors que donchianchannelup est ok. C’est signalé.
1 user thanked author for this post.
11/22/2023 at 10:59 AM #22410811/22/2023 at 4:13 PM #224145J’ai donc simplifié le code ainsi :
123456789101112131415161718192021222324252627282930313233343536373839IF open[1]>=close[1]+close/5000 AND close>=open+close/5000 AND close>=open[1]+close/5000 AND ((low[1]-close/10000<=lowest[8](low[2]) AND high[1]>=lowest[8](low[2])) OR (low-close/10000<=DonchianChannelDown[8] AND high>=DonchianChannelDown[8])) AND low[16]-close/10000<=low[8] AND low[15]-close/10000<=low[7] AND low[14]-close/10000<=low[6] AND low[13]-close/10000<=low[5] AND low[12]-close/10000<=low[4] AND low[11]-close/10000<=low[3] AND low[10]-close/10000<=low[2] AND lowest[8](low[2])+close/10000>=lowest[8](low[9]) THENFOR n=2 to n=30 DOIF low[n]-close/5000<=lowest[8](low[n-1]) AND high[n]>lowest[8](low[n-1]) AND high[n]+close/5000<highest[8](high[n-1]) THENCONTINUEELSIF low[n]-close/5000>lowest[8](low[n-1]) AND high[n]+close/5000<highest[8](high[n-1]) THENIF low[n-1]-close/5000<=lowest[8](low[n-2]) THENresult=0BREAKELSIF low[n-1]-close/5000>lowest[8](low[n-2]) THENCONTINUEENDIFREM cas3: si on est sous le doninf result=0 et on s’arrêteELSIF high[n]<=lowest[8](low[n-1]) THENRESULT=0BREAKELSIF high[n]+close/5000>=highest[8](high[n-1]) THENRESULT=5BREAKENDIFNEXTENDIFRETURN result COLOURED ("orange")Ca passe ; en fait quand le manuel parle d’une syntaxe de type Lowest[p](low) ça marche sur des bougies précédentes en écrivant Lowest[p](low[n]) – avec le [n] dans la parenthèse.
Mais ça ne me donne toujours pas le résultat escompté… Est-ce que c’est ma syntaxe de récurrence qui est fautive ?
11/26/2023 at 8:41 PM #22432811/28/2023 at 9:41 AM #224435Bonjour, nous avons un retour de PRT sur les Donchian:
En fait il n’y a aucun problème avec les instructions donchianchannelup et donchianchanneldown, c’est moi qui me suis enmêlé les pinceaux en testant trop vite entre 2 posts de forum. J’avais un écart ou pas entre donchian sur prix et les commandes selon que j’étais sur compte réel ou compte démo, mais c’était parce que pour le Donchian sur prix il y a dans les propriétés de l’indicateur une petite case “inclure le jour actuel” à laquelle je n’avais pas fait attention, et dans un compte elle était cochée alors que dans l’autre elle ne l’était pas. Je me suis donc trompé dans mes comparaisons entre indic sur prix et les instructions donchianchannelup et donchianchanneldown.
Si l’indic prédéfini sur prix a l’option d’inclure le jour actuel ou pas, en revanche afin de préciser leur fonctionnement, les instructions donchianchannelup et donchianchanneldown n’incluent pas le jour actuel dans leur plage de N bougies, les N partent de la précédente. Ces commandes sont donc exploitables directement plutôt que de passer par leur état en bougie précédente [1] pour détecter des dépassements de bandes lors de la bougie actuelle.
-
AuthorPosts