CONGESTION JOE ROSS

Viewing 15 posts - 1 through 15 (of 20 total)
  • Author
    Posts
  • #221357 quote
    christophe11560
    Participant
    Senior

    Boujour,

    J’essaye de coder le modèle de congestion JOE ROSS et mon code ne marche pas.

    Définition congestion:

    • 1 bougie (notée 1ière bougie) suivi de 5 bougies minimum et consécutives où soit leur ouverture, soit leur  clôture sont pris dans le zone délimitée par le haut et le bas de la 1ière bougie .

    Je souhaite faire apparaître sur chart chaque zone de congestion délimitée par le haut et la bas de la 1ière Bougie.

    Merci de bien vouloir m’aider à coder cette congestion

    christophe

    //ONCE countvalid = Undefined
    ONCE count = Undefined
    ONCE pivotH = Undefined
    ONCE pivotL = Undefined
    
    body=close-open
    if body>0 then
    bodytop=close
    bodybottom=open
    else
    bodytop=open
    bodybottom=close
    endif
    
    count=0
    i=1
    tot=0
    while count>0 do
    if bodytop<high[i] and bodybottom>low[i] then
    //inside bar
    count=count+1
    i=i+1
    endif
    tot=tot+1
    wend
    
    countvalid=tot>4
    
    if countvalid then
    pivotH = high[tot+1]
    pivotL = low[tot+1]
    drawrectangle(barindex,pivotL,barindex[tot+1],pivotH) coloured(0,204,0,ALPHAfond) bordercolor(0,0,0,20)
    endif
    //endif
    
    
    RETURN 
    CONGESTION.jpg CONGESTION.jpg
    #221362 quote
    JC_Bywan
    Moderator
    Master

    Bonjour,

    ALPHAfond=100// ligne à mettre en commentaire si ALPHAfond utilisé en paramètre
    
    Haut=high
    Bas=low
    
    tot=0
    for i=0 to 4
    ci= (open[i]>bas[5] and open[i]<haut[5]) or (close[i]>bas[5] and close[i]<haut[5])
    tot=tot+ci
    next
    
    if tot=5 then
    drawrectangle(barindex[5],bas[5],barindex,Haut[5]) coloured(0,204,0,ALPHAfond) bordercolor(0,0,0,20)
    endif
    
    return
    #221380 quote
    christophe11560
    Participant
    Senior

    Bonjour JC_Bywan et merci pour ton retour.

    La congestion doit être composée de 5 bougie minimum. Donc elle peut être composée de 7, 9 ou 10 bougies par exemple.
    Comment pourrait on adapter ton code pour que le rectangle se projette respectivement jusqu’à la 7, 9 ou 10 bougies de la congestion?

    Bien à toi
    christophe

    #221396 quote
    JC_Bywan
    Moderator
    Master

    Effectivement, j’ai zappé le “minimum”, du coup puisqu’il peut y avoir plusieurs congestions superposées ne partant pas de la même bougie, avec des durées non fixes on ne peut pas gérer avec une seule variable, il faut probablement faire différemment, j’essaierai de me repencher dessus quand je peux (pas ce soir, rugby!)

    #221407 quote
    JC_Bywan
    Moderator
    Master

    Edit 22/09: vu un cas qui n’a pas marché ce matin avec le nouveau code initialement présent dans ce post hier soir, je l’edit en supprimant le code, je regarderai plus tard si c’est un bug qu’on peut corriger tout en gardant cette autre approche, ou si tout simplement ce n’était pas la bonne approche non plus

    christophe11560 thanked this post
    #221447 quote
    christophe11560
    Participant
    Senior

    Salut et merci
    j’attend ton retour 😉

    christophe

    #221465 quote
    Alain
    Participant
    Senior

    Bonjour,

    Ce  code devrait répondre à votre demande

    ALPHAfond=100// ligne à mettre en commentaire si ALPHAfond utilisé en paramètre
     
    Haut=high
    Bas=low
     
    tot=0
    for i=0 to 4
    ci= (open[i]>bas[5] and open[i]<haut[5]) or (close[i]>bas[5] and close[i]<haut[5])
    tot=tot+ci
    next
     
    if tot=5 then
    Congestion = 1
    barDebut = barindex[5]
    HautCong = haut[5]
    BasCong = bas[5]
    endif
    If Congestion = 1 then
    if NOT ((open>BasCong and open<HautCong) or (close>BasCong and close<HautCong)) then
    Congestion = 0
    drawrectangle(barDebut,BasCong,barindex-1,HautCong) coloured(0,204,0,ALPHAfond) bordercolor(0,0,0,20)
    endif
    endif
    
    return
    Congestion.itf
    #221560 quote
    christophe11560
    Participant
    Senior

    Bonjour et merci pour ton intérêt.

    Après vérification du code, il doit y avoir une erreur.
    Je te joins une image précisant les zones que devraient mettre en valeur l’indicateur (rectangle rouge) superposé avec ton indicateur (zone verte).
    Ces zones ne correspondent pas;

    Si tu as une autre idée 😉

    erreur envoi photos: je n’arrive pas à les supprimer
    image hvN4qJicGo remplace I7eyJNO8Xq et VVThvIZSTG

    I7eyJNO8Xq.png I7eyJNO8Xq.png VVThvIZSTG.jpg VVThvIZSTG.jpg hvN4qJicGo.png hvN4qJicGo.png
    #221564 quote
    Alain
    Participant
    Senior

    Voilà la correction.

     

    ALPHAfond=100// ligne à mettre en commentaire si ALPHAfond utilisé en paramètre
     
    Haut=high
    Bas=low
    if Congestion = 0 then
    tot=0
    for i=0 to 4
    ci= (open[i]>bas[5] and open[i]<haut[5]) or (close[i]>bas[5] and close[i]<haut[5])
    tot=tot+ci
    next
    DRAWTEXT("#tot#", barindex, 170)
    if tot=5 then
    Congestion = 1
    barDebut = barindex[5]
    HautCong = haut[5]
    BasCong = bas[5]
    endif
    endif
    
    If Congestion = 1 then
    if NOT ((open>BasCong and open<HautCong) or (close>BasCong and close<HautCong)) then
    Congestion = 0
    drawrectangle(barDebut,BasCong,barindex-1,HautCong) coloured(0,204,0,ALPHAfond) bordercolor(0,0,0,20)
    endif
    endif
    
    return
    christophe11560 thanked this post
    Congestion-v2.itf
    #221570 quote
    christophe11560
    Participant
    Senior

    J’ai modifié le code comme suit pour corriger les erreurs suivantes:
    – ligne 7: 5 au lieu de 4 (5 bougies minimuns prisent dans la barre initiale)
    – même principe pour lignes 8, 12,14,15 et 16): 6 au lieu de 5.
    – ligne 19: inversion des signes pour les exceptions

    Il reste deux problèmes à résoudre:
    – La zone de congestion (verte) ne va pas jusqu’à la dernière bougie de la congestion (rectangle rouge): voir zones 1,2 et 3 sur photographie jointe. En effet, seulement les 5 premières bougies sont surlignées.
    – La superposition des congestions: zones 1 et 2 sur photographie jointe
    => La 1ière bougie qui prime est la bougie qui est à l’origine des autres congestions qui pourraient se former (bougies intérieures par les clôtures et les ouvertures)

    Dans l’attente de vous lire

    ALPHAfond=100// ligne à mettre en commentaire si ALPHAfond utilisé en paramètre
     
    Haut=high
    Bas=low
     
    tot=0
    for i=0 to 5
    ci= (open[i]>bas[6] and open[i]<haut[6]) or (close[i]>bas[6] and close[i]<haut[6])
    tot=tot+ci
    next
     
    if tot=6 then
    Congestion = 1
    barDebut = barindex[6]
    HautCong = haut[6]
    BasCong = bas[6]
    endif
    If Congestion = 1 then
    if NOT ((open<BasCong and open>HautCong) or (close<BasCong and close>HautCong)) then
    Congestion = 0
    drawrectangle(barDebut,BasCong,barindex-1,HautCong) coloured(0,204,0,ALPHAfond) bordercolor(0,0,0,20)
    endif
    endif
    
    return
    GmUQpPls0V.png GmUQpPls0V.png
    #221573 quote
    christophe11560
    Participant
    Senior

    Cher ac6305,
    J’ai pris en compte ta nouvelle modification dans le code ci-dessous.
    Je suis revenu sur la ligne 19 d’origine que tu avais proposé (j’avais mal interprété la ligne de code). J’ai laissé mes autres remarques pour 5 bougies minimum.
    A priori cela fonctionne bien et il n’y a pas de zones de superposition.

    Comme tu peux le voir sur l’image jointe, il y aurait une amélioration à apporter pour la zone 1 par exemple.

    C’est à dire, que si une nouvelle congestion démarre dans une congestion existante, elle n’est dessinée que si elle dépasse la première congestion en longueur.

    Maintenant je ne sais pas si cela peut être codé? A toi de me dire 😉

    En tout cas merci pour ton aide.

    Christophe

    ALPHAfond=100// ligne à mettre en commentaire si ALPHAfond utilisé en paramètre
     
    Haut=high
    Bas=low
    if Congestion = 0 then
    tot=0
    for i=0 to 5
    ci= (open[i]>bas[6] and open[i]<haut[6]) or (close[i]>bas[6] and close[i]<haut[6])
    tot=tot+ci
    next
     
    if tot=6 then
    Congestion = 1
    barDebut = barindex[6]
    HautCong = haut[6]
    BasCong = bas[6]
    endif
    endif
    If Congestion = 1 then
    if NOT ((open>BasCong and open<HautCong) or (close>BasCong and close<HautCong)) then
    Congestion = 0
    drawrectangle(barDebut,BasCong,barindex-1,HautCong) coloured(0,204,0,ALPHAfond) bordercolor(0,0,0,20)
    endif
    endif
    
    return
    VfXZK6fBkB.png VfXZK6fBkB.png
    #221575 quote
    Alain
    Participant
    Senior

    En changeant for i=0 to 4 en for i=0 to 5, tu imposes un minimum de 6 bougies au lieu de 5.

    Les bougies 0,1,2,3 et 4 sont bien au nombre de 5 et sont comparées à la sixième (cell qui a le numéro 5).

    christophe11560 thanked this post
    #221580 quote
    christophe11560
    Participant
    Senior

    Oui tu as raison, code corrigé ci-dessous:
    Merci

    Haut=high
    Bas=low
    NbBougieCongestion=5
    if Congestion = 0 then
    tot=0
    for i=0 to NbBougieCongestion-1
    ci= (open[i]>bas[NbBougieCongestion] and open[i]<haut[NbBougieCongestion]) or (close[i]>bas[NbBougieCongestion] and close[i]<haut[NbBougieCongestion])
    tot=tot+ci
    next
    // DRAWTEXT("#tot#", barindex, 170)
    if tot=NbBougieCongestion then
    Congestion = 1
    barDebut = barindex[NbBougieCongestion]
    HautCong = haut[NbBougieCongestion]
    BasCong = bas[NbBougieCongestion]
    endif
    endif
    If Congestion = 1 then
    if NOT ((open>BasCong and open<HautCong) or (close>BasCong and close<HautCong)) then
    Congestion = 0
    drawrectangle(barDebut,BasCong,barindex-1,HautCong) coloured(0,204,0,ALPHAfond) bordercolor(0,0,0,20)
    endif
    endif
    
    return
    #221581 quote
    JC_Bywan
    Moderator
    Master

    Bonjour,

    Que 5 soit un minimum au lieu d’être une durée fixe introduit le besoin de gérer les congestions qui se chevauchent aussi bien sur la verticale que sur l’horizontale, ou qui sont l’une dans l’autre. Cela ne peut pas passer par une simple variable qui ne peut prendre qu’une seule valeur en fin de bougie, cela doit passer par des tableaux pour pouvoir traiter un nombre d’occurrences simultanées indéterminé.

    Par rapport à la version avec tableaux de fin de semaine dernière, que j’avais enlevée vendredi car buguée sur le live, plutôt que de superposer à chaque nouvelle barre les rectangles d’une même congestion l’un sur l’autre, le choix est fait de juxtaposer les rectangles qui sont au-delà de 5, soit via un bloc d’un coup dans l’historique, soit en rallongeant juste d’une barre à chaque nouvelle barre en live. Ceci est fait au prix d’une légère concession esthétique à cause de la superposition des bords verticaux de rectangles qui crée de légers segments verticaux, mais concession graphiquement moins désagréable que d’obscurcir le fond en redessinant plusieurs fois la même congestion depuis son départ. De plus cela permet de garder visible une congestion dans une autre grâce au seul assombrissement des zones de fond communes à 2 congestions.

    Désolé, c’était un peu lent à débuguer, mais avec les tableaux si un bug n’apparaît que dans le traitement du live plutôt que dans l’historique, il faut modifier et le retester sur du live, ce qui implique d’attendre que le cas se représente, vérifier si c’est résolu (ou pas… et modifier et recommencer…), c’est forcément plus lent que pour un problème à régler dans l’historique OHLC. En espérant que les modifs n’auront pas créé un autre bug du live qui m’aurait échappé…

    J’ai rajouté une gestion de taille de boucle pour éviter d’avoir des tableaux à indice max énorme qui ralentiraient massivement le temps de calcul, en exploitant les temps sans aucune congestion en cours pour tout simplement réinitialiser les tableaux et garder une taille de boucle faible.

    Enfin, il y a une option qui dessine un fond de rectangle orange en direct quand on est sur une sortie possible de congestion, il faut dé-commenter ( = enlever les // )  les lignes 32 à 34 pour l’ajouter.

    ALPHAfond=100// ligne à mettre en commentaire si ALPHAfond utilisé en paramètre
    
    once ind=0
    once prem=0
    count=0
    tot=0
    $memhaut[0]=0
    $membas[0]=0
    $memx[0]=0
    $memy[0]=0
    
    for i=0 to 4
    ci= (open[i]>=low[5] and open[i]<=high[5]) or (close[i]>=low[5] and close[i]<=high[5])
    tot=tot+ci
    next
    if tot=5 then
    drawrectangle(barindex[5],low[5],barindex,high[5]) coloured(0,204,0,ALPHAfond) bordercolor(0,204,0,20)
    endif
    if tot[1]=5 and ((open>=low[6] and open<=high[6]) or (close>=low[6] and close<=high[6])) then
    ind=ind+1
    $memhaut[ind]=high[6]
    $membas[ind]=low[6]
    $memx[ind]=barindex[6]
    $memy[ind]=1
    endif
    for i=0 to lastset($memy)
    if $memy[i]=1 or $memy[i]=2 then
    count=count+1
    if ((open[1]>=$membas[i] and open[1]<=$memhaut[i]) or (close[1]>=$membas[i] and close[1]<=$memhaut[i])) then
    if not ((open>=$membas[i] and open<=$memhaut[i]) or (close>=$membas[i] and close<=$memhaut[i])) then
    $memy[i]=2
    //if islastbarupdate then
    //drawrectangle(barindex[1],$membas[i],barindex,$memhaut[i]) coloured(255,153,0,ALPHAfond) bordercolor(255,153,0,20)// Prolongement couleur orange en live si la bougie n'ouvre pas dans la congestion, qui peut repasser vert si la bougie live réintègre la congestion. Si la bougie finit orange, elle confirme la fin de la (ou de l'une des) congestion(s).
    //endif
    else
    $memy[i]=1
    if islastbarupdate then
    if not prem then
    drawrectangle($memx[i]+5,$membas[i],barindex,$memhaut[i]) coloured(0,204,0,ALPHAfond) bordercolor(0,204,0,20)
    else
    drawrectangle(barindex[1],$membas[i],barindex,$memhaut[i]) coloured(0,204,0,ALPHAfond) bordercolor(0,204,0,20)
    endif
    endif
    endif
    else
    $memy[i]=0
    if not islastbarupdate and ((open[2]>=$membas[i] and open[2]<=$memhaut[i]) or (close[2]>=$membas[i] and close[2]<=$memhaut[i])) then
    drawrectangle($memx[i]+5,$membas[i],barindex[2],$memhaut[i]) coloured(0,204,0,ALPHAfond) bordercolor(0,204,0,20)
    endif
    endif
    endif
    next
    if islastbarupdate then
    prem=1
    endif
    if count=0 and count[1]=0 then
    ind=0
    unset($memhaut)
    unset($membas)
    unset($memx)
    unset($memy)
    endif
    
    return
    christophe11560 thanked this post
    #221582 quote
    JC_Bywan
    Moderator
    Master

    Nota si c’est juste pour ut jour (cf graphe apple plus haut): mes histoires de live barre après barre et de rectangles larges d’une barre qui se chevauchent quand même par les bords, c’est valable pour petite ut intraday quand tu as plusieurs barres nouvelles qui apparaissent après le lancement de l’indicateur. En ut jour tu auras forcément quitté la plateforme avant de voir le phénomène sur une nouvelle barre jour, donc tu peux zapper ce passage du texte…

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

CONGESTION JOE ROSS


ProBuilder : Indicateurs & Outils Personnalisés

New Reply
Author
Summary

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

Topic Details
Forum: ProBuilder : Indicateurs & Outils Personnalisés
Language: French
Started: 09/20/2023
Status: Active
Attachments: 8 files
Logo Logo
Loading...