syntaxe de FOR TO DO et THEN

Viewing 11 posts - 1 through 11 (of 11 total)
  • Author
    Posts
  • #223863 quote
    juld63
    Participant
    New

    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:

    REM : franchissement du doninf par les bougies [0] ou [1] en configuration de retournement haussier
    
    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]))))))) THEN
    
    REM on teste à partir de la bougie [2]
    
    FOR n=2 to n=30 DO
    
    REM cas1: si on est en franchissement du doninf on passe à la bougie précédente
    
    IF 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]))))))) THEN
    
    CONTINUE
    
    REM cas2: si on est strictement dans le canal…
    
    ELSIF
    
    low[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]))))))) THEN
    
    REM cas 2a: alors si la bougie précédente est en franchissement du doninf on s’arrête et result=0
    
    IF 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]))))))) THEN
    
    result=0
    
    BREAK
    
    REM cas 2b: sinon on continue
    
    ELSIF 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]))))))) THEN 
    
    CONTINUE
    
    ENDIF
    
    REM cas3: si on est sous le doninf result=0 et on s’arrête
    
    ELSIF
    
    high[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]))))))) THEN
    
    RESULT=0
    
    BREAK
    
    REM cas 4: si on touche le donsup result=5 et on s’arrête
    
    ELSIF 
    
    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]))))))) THEN
    
    RESULT=5
    
    BREAK
    
    ENDIF
    
    NEXT
    
    ENDIF
    
    RETURN 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 !

    #223908 quote
    Bernard13
    Participant
    Average

    Bonjour juld63,

    Peux-tu publier un graph de ce qui fonctionne ?

    Cordialement.

    #223935 quote
    juld63
    Participant
    New

    Bonjour 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=0

    ENDIF

    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 !

    donchian.png donchian.png
    #223949 quote
    juld63
    Participant
    New

    D’ailleurs si vous avez une idée pour coder la valeur des Donchian à telle bougie [n] plutôt qu’une concaténation de min (x, min (y, z)) je suis preneur !

    #224079 quote
    Bernard13
    Participant
    Average

    Bonjour

    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.

    🙂

    #224101 quote
    juld63
    Participant
    New

    Bonjour,

    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…

    #224103 quote
    JC_Bywan
    Moderator
    Master

    Bonjour, 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é.

    plbourse thanked this post
    #224108 quote
    juld63
    Participant
    New

    Merci JC. Effectivement, le Donchian est calculé sur les low et high, pas sur le close, évidemment.

    Je vais tenter de reformuler suivant ta proposition, on va voir si ça marche mieux

    #224145 quote
    juld63
    Participant
    New

    J’ai donc simplifié le code ainsi :

    IF 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]) THEN
    
    
    FOR n=2 to n=30 DO
    
    IF 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]) THEN
    CONTINUE
    
    ELSIF low[n]-close/5000>lowest[8](low[n-1]) AND high[n]+close/5000<highest[8](high[n-1]) THEN
    
    IF low[n-1]-close/5000<=lowest[8](low[n-2]) THEN
    result=0
    BREAK
    
    ELSIF low[n-1]-close/5000>lowest[8](low[n-2]) THEN
    CONTINUE
    ENDIF
    
    
    REM cas3: si on est sous le doninf result=0 et on s’arrête
    
    
    ELSIF high[n]<=lowest[8](low[n-1]) THEN
    RESULT=0
    BREAK
    
    ELSIF high[n]+close/5000>=highest[8](high[n-1]) THEN
    RESULT=5
    BREAK
    ENDIF
    
    
    
    
    NEXT
    ENDIF
    
    
    RETURN 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 ?

    #224328 quote
    juld63
    Participant
    New

    J’AI TROUVE ! C’était tout bête : il faut écrire FOR n=a TO b DO et j’avais écris FOR n=a TO n=b DO”… Là ça marche. Merci encore de votre aide

    #224435 quote
    JC_Bywan
    Moderator
    Master

    Bonjour, 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.

Viewing 11 posts - 1 through 11 (of 11 total)
  • You must be logged in to reply to this topic.

syntaxe de FOR TO DO et THEN


ProBuilder : Indicateurs & Outils Personnalisés

New Reply
Author
author-avatar
juld63 @juld63 Participant
Summary

This topic contains 10 replies,
has 3 voices, and was last updated by JC_Bywan
2 years, 3 months ago.

Topic Details
Forum: ProBuilder : Indicateurs & Outils Personnalisés
Language: French
Started: 11/17/2023
Status: Active
Attachments: 1 files
Logo Logo
Loading...