CONGESTION JOE ROSS
Forums › ProRealTime forum Français › Support ProBuilder › CONGESTION JOE ROSS
- This topic has 19 replies, 3 voices, and was last updated 1 year ago by JC_Bywan.
-
-
09/20/2023 at 7:36 PM #221357
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
code à corriger12345678910111213141516171819202122232425262728293031323334353637//ONCE countvalid = UndefinedONCE count = UndefinedONCE pivotH = UndefinedONCE pivotL = Undefinedbody=close-openif body>0 thenbodytop=closebodybottom=openelsebodytop=openbodybottom=closeendifcount=0i=1tot=0while count>0 doif bodytop<high[i] and bodybottom>low[i] then//inside barcount=count+1i=i+1endiftot=tot+1wendcountvalid=tot>4if countvalid thenpivotH = 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//endifRETURN09/21/2023 at 7:28 AM #221362Bonjour,
12345678910111213141516ALPHAfond=100// ligne à mettre en commentaire si ALPHAfond utilisé en paramètreHaut=highBas=lowtot=0for i=0 to 4ci= (open[i]>bas[5] and open[i]<haut[5]) or (close[i]>bas[5] and close[i]<haut[5])tot=tot+cinextif tot=5 thendrawrectangle(barindex[5],bas[5],barindex,Haut[5]) coloured(0,204,0,ALPHAfond) bordercolor(0,0,0,20)endifreturn09/21/2023 at 10:39 AM #221380Bonjour 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
christophe09/21/2023 at 3:19 PM #221396Effectivement, 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!)
09/21/2023 at 7:13 PM #221407Edit 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
1 user thanked author for this post.
09/22/2023 at 12:39 PM #221447Salut et merci
j’attend ton retour 😉christophe
09/23/2023 at 10:50 AM #221465Bonjour,
Ce code devrait répondre à votre demande
Congestion12345678910111213141516171819202122232425ALPHAfond=100// ligne à mettre en commentaire si ALPHAfond utilisé en paramètreHaut=highBas=lowtot=0for i=0 to 4ci= (open[i]>bas[5] and open[i]<haut[5]) or (close[i]>bas[5] and close[i]<haut[5])tot=tot+cinextif tot=5 thenCongestion = 1barDebut = barindex[5]HautCong = haut[5]BasCong = bas[5]endifIf Congestion = 1 thenif NOT ((open>BasCong and open<HautCong) or (close>BasCong and close<HautCong)) thenCongestion = 0drawrectangle(barDebut,BasCong,barindex-1,HautCong) coloured(0,204,0,ALPHAfond) bordercolor(0,0,0,20)endifendifreturn09/25/2023 at 2:49 PM #221560Bonjour 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 VVThvIZSTG09/25/2023 at 3:04 PM #221564Voilà la correction.
Congestion v2123456789101112131415161718192021222324252627ALPHAfond=100// ligne à mettre en commentaire si ALPHAfond utilisé en paramètreHaut=highBas=lowif Congestion = 0 thentot=0for i=0 to 4ci= (open[i]>bas[5] and open[i]<haut[5]) or (close[i]>bas[5] and close[i]<haut[5])tot=tot+cinextDRAWTEXT("#tot#", barindex, 170)if tot=5 thenCongestion = 1barDebut = barindex[5]HautCong = haut[5]BasCong = bas[5]endifendifIf Congestion = 1 thenif NOT ((open>BasCong and open<HautCong) or (close>BasCong and close<HautCong)) thenCongestion = 0drawrectangle(barDebut,BasCong,barindex-1,HautCong) coloured(0,204,0,ALPHAfond) bordercolor(0,0,0,20)endifendifreturn1 user thanked author for this post.
09/25/2023 at 3:34 PM #221570J’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 exceptionsIl 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
mes corrections12345678910111213141516171819202122232425ALPHAfond=100// ligne à mettre en commentaire si ALPHAfond utilisé en paramètreHaut=highBas=lowtot=0for i=0 to 5ci= (open[i]>bas[6] and open[i]<haut[6]) or (close[i]>bas[6] and close[i]<haut[6])tot=tot+cinextif tot=6 thenCongestion = 1barDebut = barindex[6]HautCong = haut[6]BasCong = bas[6]endifIf Congestion = 1 thenif NOT ((open<BasCong and open>HautCong) or (close<BasCong and close>HautCong)) thenCongestion = 0drawrectangle(barDebut,BasCong,barindex-1,HautCong) coloured(0,204,0,ALPHAfond) bordercolor(0,0,0,20)endifendifreturn09/25/2023 at 4:27 PM #221573Cher 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
code MàJ1234567891011121314151617181920212223242526ALPHAfond=100// ligne à mettre en commentaire si ALPHAfond utilisé en paramètreHaut=highBas=lowif Congestion = 0 thentot=0for i=0 to 5ci= (open[i]>bas[6] and open[i]<haut[6]) or (close[i]>bas[6] and close[i]<haut[6])tot=tot+cinextif tot=6 thenCongestion = 1barDebut = barindex[6]HautCong = haut[6]BasCong = bas[6]endifendifIf Congestion = 1 thenif NOT ((open>BasCong and open<HautCong) or (close>BasCong and close<HautCong)) thenCongestion = 0drawrectangle(barDebut,BasCong,barindex-1,HautCong) coloured(0,204,0,ALPHAfond) bordercolor(0,0,0,20)endifendifreturn09/25/2023 at 5:00 PM #221575En 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).
1 user thanked author for this post.
09/25/2023 at 6:15 PM #221580Oui tu as raison, code corrigé ci-dessous:
Mercicode corrigé12345678910111213141516171819202122232425Haut=highBas=lowNbBougieCongestion=5if Congestion = 0 thentot=0for i=0 to NbBougieCongestion-1ci= (open[i]>bas[NbBougieCongestion] and open[i]<haut[NbBougieCongestion]) or (close[i]>bas[NbBougieCongestion] and close[i]<haut[NbBougieCongestion])tot=tot+cinext// DRAWTEXT("#tot#", barindex, 170)if tot=NbBougieCongestion thenCongestion = 1barDebut = barindex[NbBougieCongestion]HautCong = haut[NbBougieCongestion]BasCong = bas[NbBougieCongestion]endifendifIf Congestion = 1 thenif NOT ((open>BasCong and open<HautCong) or (close>BasCong and close<HautCong)) thenCongestion = 0drawrectangle(barDebut,BasCong,barindex-1,HautCong) coloured(0,204,0,ALPHAfond) bordercolor(0,0,0,20)endifendifreturn09/25/2023 at 6:43 PM #221581Bonjour,
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.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364ALPHAfond=100// ligne à mettre en commentaire si ALPHAfond utilisé en paramètreonce ind=0once prem=0count=0tot=0$memhaut[0]=0$membas[0]=0$memx[0]=0$memy[0]=0for i=0 to 4ci= (open[i]>=low[5] and open[i]<=high[5]) or (close[i]>=low[5] and close[i]<=high[5])tot=tot+cinextif tot=5 thendrawrectangle(barindex[5],low[5],barindex,high[5]) coloured(0,204,0,ALPHAfond) bordercolor(0,204,0,20)endifif tot[1]=5 and ((open>=low[6] and open<=high[6]) or (close>=low[6] and close<=high[6])) thenind=ind+1$memhaut[ind]=high[6]$membas[ind]=low[6]$memx[ind]=barindex[6]$memy[ind]=1endiffor i=0 to lastset($memy)if $memy[i]=1 or $memy[i]=2 thencount=count+1if ((open[1]>=$membas[i] and open[1]<=$memhaut[i]) or (close[1]>=$membas[i] and close[1]<=$memhaut[i])) thenif 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).//endifelse$memy[i]=1if islastbarupdate thenif not prem thendrawrectangle($memx[i]+5,$membas[i],barindex,$memhaut[i]) coloured(0,204,0,ALPHAfond) bordercolor(0,204,0,20)elsedrawrectangle(barindex[1],$membas[i],barindex,$memhaut[i]) coloured(0,204,0,ALPHAfond) bordercolor(0,204,0,20)endifendifendifelse$memy[i]=0if not islastbarupdate and ((open[2]>=$membas[i] and open[2]<=$memhaut[i]) or (close[2]>=$membas[i] and close[2]<=$memhaut[i])) thendrawrectangle($memx[i]+5,$membas[i],barindex[2],$memhaut[i]) coloured(0,204,0,ALPHAfond) bordercolor(0,204,0,20)endifendifendifnextif islastbarupdate thenprem=1endifif count=0 and count[1]=0 thenind=0unset($memhaut)unset($membas)unset($memx)unset($memy)endifreturn1 user thanked author for this post.
09/25/2023 at 6:54 PM #221582Nota 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…
-
AuthorPosts