Détection des plus haut+plus bas sur une période
Forums › ProRealTime forum Français › Support ProBuilder › Détection des plus haut+plus bas sur une période
- This topic has 9 replies, 3 voices, and was last updated 1 year ago by
Sofitech.
-
-
11/10/2020 at 3:09 PM #150036
Bonjour,
Je me permets de vous contacter car je suis novice dans la programmation d’indicateur sous PRT.
1ère question :
L’exécution du code s’effectue t’il dans l’historique de droite à gauche, donc à partir de la dernière bougie, ou à l’inverse de gauche à droite ?2ème question :
Je cherche actuellement à identifier, dans une période de 20 à 30 jours, le cours le plus haut et le cours le plus bas et à afficher une flèche ainsi la valeur dans le graphique au niveau du plus haut et du plus bas.
Le code fonctionne, cependant, je n’ai pas le résultat attendues car l’apparition du couple indicateurs plus haut+plus bas est “glissant” car le code s’exécute à chaque bougie, sans attendre, soit la fin de la 1ère période, soit la détection du 1er du couple indicateurs plus haut+plus bas.Je souhaiterais que le code se réexécute sur l’historique uniquement après chaque période de 20-30jrs, ou à partir de la barre qui suit directement la détection du 1er du couple indicateurs plus haut+plus bas.
Pourriez vous m’indiquer comment réaliser ceci ?
J’ai mis en pièce jointe le résultat de mon code ci-dessous :
Highest+lowest detection1234567891011121314151617181920Period = 30HighestV = Highest[Period](high)LowestV = Lowest[Period](low)For i = 0 To Period doIF High[i]=HighestV ThenHighestI = BarIndex[i]DRAWTEXT(HighestV, HighestI, HighestV+2, Dialog, Standard, 12)COLOURED(0,255,0)DRAWARROWDOWN(HighestI,HighestV+1) COLOURED(0,255,00)endifIF Low[i]=LowestV ThenLowestI = BarIndex[i]DRAWTEXT(LowestV, LowestI, LowestV-2, Dialog, Standard, 12)COLOURED(200,0,0)DRAWARROWUP(LowestI,LowestV-1) COLOURED(255,0,00)endifnextRETURNJe vous remercie d’avance.
Nicolas11/11/2020 at 9:42 AM #150098Bonjour,
Pour la 1re question, le code s’éxécute dans le sens du défilement du temps (donc de gauche à droite pour reprendre les termes de la question). Comme je vois que tu as tenté une solution avec boucles, par extension pour la même question je rajouterais ceci: même une boucle que tu ferais aller de droite vers gauche ne signifie pas que le code va aller s’éxécuter dans d’autres bougies vers la gauche, la boucle a lieu dans la bougie, mais en faisant éventuellement appel aux données enregistrées de bougies précédentes.
Pour la 2ème question, ceci devrait faire ce que tu cherches toutes les 30 (ou period à modifier en ligne 1) barres. La ligne 8 en drawrectangle est mise en commentaire, mais tu peux enlever les // devant pour faire apparaitre un rectangle encadrant chaque groupe de period barres et vérifier tes couples +haut+bas:
12345678910111213141516171819202122Period = 30if barindex mod period = 0 thenDRAWTEXT(HighestV, HighestI, HighestV+2, Dialog, Standard, 12)COLOURED(0,255,0)DRAWARROWDOWN(HighestI,HighestV+1) COLOURED(0,255,00)DRAWTEXT(LowestV, LowestI, LowestV-2, Dialog, Standard, 12)COLOURED(200,0,0)DRAWARROWUP(LowestI,LowestV-1) COLOURED(255,0,00)//DRAWRECTANGLE(barindex[period], LowestV, barindex, HighestV)HighestV=lowLowestV=highendifif high>HighestV thenHighestV=highHighestI=barindexendifif low<LowestV thenLowestV=lowLowestI=barindexendifRETURNRien n’empêche de se servir de boucles si tu veux, mais quand c’est possible il vaut mieux privilégier une solution sans boucle pour la vitesse d’éxécution. J’ai changé la logique pour me débarrasser de la boucle, et j’ai gardé tes noms de variables pour s’y retrouver facilement. A tester pour confirmation.
11/11/2020 at 3:22 PM #150136Bonjour Noobywan
Tout dabord je te remercie pour ta réponse ainsi que tes explications. Le code que tu m’as donné fonctionne presque.
Le seul problème semble que pour la 1ère et la dernière période, l’exécution ne se passe pas très bien. En effet, si j’atoute l’instruction “DEFPARAM CALCULATEONLASTBARS = 50” en début de code, sur une période de 10 barres, il s’avère que :
- Le maximum ne semble pas calculé et ,’est pas affiché sur les 10 premières barres. Seul le minimum est calculé et affiché.
- Les maximum ne semblent pas calculés ni affichés sur les 10 dernières barres.
- Les rectangle des 10 premières barres et 10 dernières barre ne s’affiche pas.
Aurais tu une explication à m’indiquer ou une éventuelle correction ?
Je te remercie d’avance de ton retour.
11/11/2020 at 3:47 PM #150140Il n’a pas été question d’un calculateonlastbars=50 dans le message auquel j’ai répondu, tu le rajoutes ensuite et ça impacte le comportement au début: en effet dans ce cas il ne faut pas regarder 10 barres avant le premier rectangle, mais 50 barres avant la bougie de lancement, et si par exemple il y en a eu 4 après le dernier rectangle au moment du lancement, tu n’en auras que 6 sur 10 qui comptent dans ce que tu penses être les 10 premières barres (c’est à dire que tu as limité à 50 le calcul mais tu espères voir des choses à partir de la 56ème précédente, ça va pas le faire…)
En ce qui concerne les 10 dernières, et l’affichage des rectangles là ce n’est pas lié au calculateonlastbars, mais à ta demande de ne pas avoir d’effet glissant et je cite “que le code se réexécute sur l’historique uniquement après chaque période de 20-30jrs”. La fin d’un rectangle marque la fin d’une période de “20-30” (ou de period=10 dans ta capture écran), et donc le code t’affichera le dernier rectangle, le plus haut et le plus bas de la période de “period” jours quand le nouvel intervalle de “period” jours sera terminé. Si tu veux compter les “period” jours dans l’autre sens, alors tu réintroduirais l’effet glissant, ce que tu as explicitement dit ne pas vouloir. Ou sinon il faut expliquer différemment comment tu veux ta période de 20-30 jours, de là je peux voir si c’est modifiable.
11/11/2020 at 4:48 PM #150148Re-Bonjour Noobywan
Merci pour ton retour, ainsi que ta patience. Je pense effectivement que je me suis mal exprimé à la base, et que je ne comprends surement pas parfaitement le déroulement de l’exécution du code.
Je vais essayer de faire plus simple dans mon explication : sur la période des 50..100 ou 200 dernières barres de l’historique, je souhaite calculer le couple highest+lowest par période de 10 barres. En d’autre terme, sur une période totale de 50 dernières barres, je m’attends à avoir 5 périodes (ou fenêtre/rectangle) de 10 barres où sont calculées les highest+lowest, où encore 10 périodes (ou fenêtre/rectangle) de 5 barres.
En réalité je m’attends à nb périodes (ou fenêtre/rectangle) = x dernières barres / période
Me suis-je un peu mieux exprimé sur ce que je cherche à obtenir ? 🙂
11/11/2020 at 5:44 PM #150157Ok, quitte à devoir passer par des boucles pour refaire de droite à gauche “nb” intervalles de “period” barres, autant faire une double boucle. Tant que “nb” et “period” ne sont pas trop gros, ici nb=5 et period=10, et que l’intérieur des boucles n’est pas trop long/complexe, ça devrait passer, sinon on tombe sur un message d’erreur de boucle infinie… on ne sait pas trop où est le plafond de boucle dans une combinaison [nombre d’itérations x complexité pour chaque itération], mais il y en a un et il est souvent trop près, en plus de la lenteur de calculs c’est une autre raison d’éviter les boucles quand on peut…
Tu auras en fait un effet glissant au sens ou tous les intervalles se décalent de 1 à chaque bougie, mais il ne sera pas visible car tout est redessiné au changement de bougie, au lieu de tout superposer:
12345678910111213141516171819202122232425262728293031DEFPARAM DRAWONLASTBARONLY=trueDEFPARAM CALCULATEONLASTBARS = 51Period = 10nb=5HighestV = Highest[Period](high)LowestV = Lowest[Period](low)if IsLastBarUpdate thenFor j = 1 To nb dofor i = 0 To Period-1 doIF High[period*(j-1)+i]=HighestV[(j-1)*period] ThenHighestI = BarIndex[period*(j-1)+i]DRAWTEXT(HighestV[(j-1)*period], HighestI, HighestV[(j-1)*period]+2, Dialog, Standard, 12) COLOURED(0,255,0)DRAWARROWDOWN(HighestI,HighestV[(j-1)*period]+1) COLOURED(0,255,00)endifIF Low[period*(j-1)+i]=LowestV[(j-1)*period] ThenLowestI = BarIndex[period*(j-1)+i]DRAWTEXT(LowestV[(j-1)*period], LowestI, LowestV[(j-1)*period]-2, Dialog, Standard, 12) COLOURED(200,0,0)DRAWARROWUP(LowestI,LowestV[(j-1)*period]-1) COLOURED(255,0,00)endifnextDRAWRECTANGLE(barindex[j*(period)]+1, LowestV[(j-1)*period], barindex[(j-1)*period], HighestV[(j-1)*period])nextendifRETURNnb1: s’assurer que le calculateonlastbars a une bougie de plus que nb*period, ici 5*10+1 = 51
nb2: ta copie écran est en v11, ceci est aussi un code v11, si besoin je peux le faire en v10.3 les modifs sont mineures
11/13/2020 at 9:16 PM #150421Bonjour Noobywan,
Je m’excuse de n’avoir pu répondre plus tôt. Le code fonctionne très bien, je te remercie beaucoup pour ta patience et ton aide.
11/13/2020 at 9:30 PM #150422Pour information, en repartant de ta 1ère réponse où tu m’indiquais qu’il fallait éviter les boucles et en m’inspirant de ton code, avec beaucoup d’essais voici un code qui fonctionne à l’identique du tien :
1234567891011121314151617181920212223242526272829303132333435363738394041424344DEFPARAM CALCULATEONLASTBARS = 51ONCE CurrCandle = 0ONCE MaxCandle = 10ONCE HighestV1=0ONCE HighestI1=0ONCE LowestV2=0ONCE LowestI2=0IF High > HighestV1 THENHighestV1 = HighHighestI1 = BarIndexENDIFIF LowestV2 = 0 OR Low < LowestV2 THENLowestV2 = LowLowestI2 = BarIndexENDIFIF CurrCandle mod MaxCandle = 0 THEN// HighestDRAWTEXT(HighestV1, HighestI1, HighestV1, Dialog, Standard, 12)COLOURED(0,255,0)DRAWARROWDOWN(HighestI1,HighestV1) COLOURED(0,255,00)// LowestDRAWTEXT(LowestV2, LowestI2, LowestV2, Dialog, Standard, 12)COLOURED(200,0,0)DRAWARROWUP(LowestI2,LowestV2) COLOURED(255,0,00)DRAWRECTANGLE(barindex[MaxCandle-1], LowestV2, barindex, HighestV1)COLOURED(200,0,0)CurrCandle = 0HighestV1 = 0LowestV2 = 0ENDIFCurrCandle = CurrCandle + 1RETURN11/13/2020 at 10:09 PM #150424Bien vu, grâce au calculateonlastbars=51 qui crée un départ contrôlé à 5 boites de distance de la fin combiné à l’incrémentation de tes currcandle réinitialisées à chaque boite au lieu d’un barindex fixe, tu peux effectivement faire les 5 boites de 10 calées sur le dernier jour de gauche vers droite, au lieu de boucle de droite vers gauche.
Et ça passe parce que je pense que tu t’en sers en ut jour uniquement, puisque jusqu’ici on parlait en nombre de jours? Comme la plateforme sera relancée au lieu de rester allumée plusieurs jours consécutifs, ta solution sans boucle est suffisante par rapport à l’usage ut jour.
Au-delà de l’usage souhaité, pour le fun de la programmation (bon ok, pas tout le monde va trouver ça fun…), si tu le lances en ut 1mn pour accélérer les choses au lieu d’ut jour, la différence sera que sans boucle se recrée à la fin des 5 boites le phénomène des bougies “live” qui n’afficheront pas leur high low et rectangle tant qu’une nouvelle boite n’est pas complète. Mais en ut jour pas de souci, c’est éteint et rallumé le lendemain et redessiné par rapport au nouveau jour, donc ça passe sans.
10/02/2023 at 10:41 AM #221939Bonjour à vous. Je reviens vers concernant ce code détection plus haut et plus bas…
Est-il possible de créer une version histogramme afin de créer des alertes mails quand un plus haut plus bas est identifié sur un valeur ? (en alerte ou screener par exemple) …Merci à vous.
-
AuthorPosts
Find exclusive trading pro-tools on