Mettre à jour un tableau sur clôture de bougie
Forums › ProRealTime forum Français › Support ProBuilder › Mettre à jour un tableau sur clôture de bougie
- This topic has 10 replies, 2 voices, and was last updated 2 years ago by
Nicolas.
-
-
09/29/2022 at 11:25 AM #201637
Bonjour,
Je souhaite créer un histogramme par volume de prix. Le problème que je rencontre c’est qu’en temps réel, l’incrémentation +1 se réalise à chaque tick.
J’ai tenté d’ajouter une variable LastUpdate qui empêche de mettre à jour le tableau sur la bougie en cours, mais ça ne marche pas…
Voici le code
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960// Par convention, on définit une tranche de l'histogramme --> prix arrondi à l'unité// On mémorise chaque cotation dans un tableau donc l'indice est le prix arrondi à l'unité// Exemple :// $NbCotation[6500] renvoie le nombre de fois où le prix 6500 a été touché// $Cotation[6500] renvoie la valeur de cotation : 6500// Représentation graphique sous forme d'histogramme :// axe horizontal : $NbCotation[6500]// axe vertical : $Cotation[6500]defparam DRAWONLASTBARONLY = truetimeframe(default, UPDATEONCLOSE)//********************************************************************************************************************// Mémorisation des cotations//********************************************************************************************************************once MaxHighUnitaire = round(high+0.5) // utile pour la représentation graphiqueonce MinLowUnitaire = round(low-0.5) // utile pour la représentation graphiqueonce LastUpdate = barindex // initialisation sur le premier barindex égal à 0if barindex > 0 and barindex <> LastUpdate then //On comptabilise quand la bougie est clôturéeHighUnitaire = round(high[1]+0.5) //bougie précédente clôturéeLowUnitaire = round(low[1]-0.5) //bougie précédente clôturéefor i = LowUnitaire to HighUnitaireif isset($NbCotation[i]) then //cotation déjà touchée, alors on ajoute 1$NbCotation[i] = $NbCotation[i]+1else$NbCotation[i] = 1 // première fois que la cotation est atteinte, on initialise à 1$Cotation[i] = i // on mémorise le prix de cotation pour le graphiqueendifMaxHighUnitaire = max(MaxHighUnitaire, HighUnitaire)MinLowUnitaire = min(MinLowUnitaire, LowUnitaire)nextLastUpdate = barindexendif//********************************************************************************************************************// Représentation graphique sous forme d'histogramme//********************************************************************************************************************if IsLastBarUpdate thenfor i = MinLowUnitaire to MaxHighUnitaireif i >=low and i<=high then //Jeux de couleurs pour visualiser les tranches concernées par la bougie en coursR=255G=0B=0elseR=0G=255B=0endifif isset($NbCotation[i]) thenDRAWRECTANGLE(0, $Cotation[i], $NbCotation[i], $Cotation[i]-1) coloured(R,G,B,50) bordercolor(R,G,B,0)else // Gestion des gaps (ils n'ont pas été mémorisés)$NbCotation[i] = 0$Cotation[i] = iDRAWRECTANGLE(0, $Cotation[i], $NbCotation[i], $Cotation[i]-1) coloured(R,G,B,50) bordercolor(R,G,B,0)endifnextDRAWLINE(0, high, barindex, high) style(dottedline,1)DRAWLINE(0, low, barindex, low) style(dottedline,1)endifreturn09/30/2022 at 8:39 AM #20169310/11/2022 at 12:11 PM #202307Je pense toutefois qu’il y a un bug quelque part.
J’ai refait un code plus simple (voir ci-dessous) qui se compose de 3 étapes.
Seule l’étape 1 alimente deux tableaux : X (nombre de fois que le prix est atteint) et Y (valeur arrondie du prix). Cette étape n’a lieu qu’une et seule fois.
Pourtant, en le testant par exemple sur le future CAC en 5 minutes, on voit très bien que :
- le tableau continue d’être alimenté (la somme calculée augmente et l’histogramme idem).
- pourtant le traceur ne bouge pas. Donc l’étape 1 n’a bien lieu qu’une fois.
-
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647//Etape 0 : on ne fait rien//Etape 1 : on compte le nombre de fois où le prix est atteint (Etape qui n'a lieu qu'une seule fois)//Etape 2 : on dessine l'histogramme des prixdefparam DRAWONLASTBARONLY = trueonce Etape = 0if IsLastBarUpdate thenif Etape = 0 thenEtape = 1endifendifonce traceur = 0If Etape = 1 thentraceur = traceur + 1Y3Rmax = round(highest[barindex](high))Y3Rmin = round(lowest[barindex](low))for x = 0 to barindex-1xi = barindex - xLowR = round(low[xi])HighR = round(high[xi])for i = LowR to HighRif isset($X2[i]) then //Le prix a déjà été atteint, on ajoute 1$X2[i] = $X2[i]+1else //Toute première fois que le prix est atteint, on le crée$X2[i] = 1$Y2R[i] = iendifnextnextSomme = 0for i = Y3Rmin to Y3RmaxSomme = Somme + $X2[i]nextEtape = 2endifif Etape = 2 thenfor i = Y3Rmin to Y3RmaxDRAWSEGMENT(0, $Y2R[i], $X2[i], $Y2R[i]) style(line,5)nextendifdrawtext("traceur:#traceur# Somme:#Somme#",round(barindex/2),Y3Rmax+1)return
10/12/2022 at 8:43 AM #202345En effet, je remarque un comportement qui m’échappe.. Je poste ici le code pour référence, je vais reboucler en interne et revenir dés que j’ai une piste, merci pour ta patience.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849//Etape 0 : on ne fait rien//Etape 1 : on compte le nombre de fois où le prix est atteint (Etape qui n'a lieu qu'une seule fois)//Etape 2 : on dessine l'histogramme des prixdefparam DRAWONLASTBARONLY = true//once Etape = 0if IsLastBarUpdate thenif Etape = 0 thenstartbar=barindexEtape = 1endifendif//once traceur = 0If Etape = 1 thentraceur = traceur + 1Y3Rmax = round(highest[barindex](high))Y3Rmin = round(lowest[barindex](low))for x = 0 to barindex-1xi = barindex - xLowR = round(low[xi])HighR = round(high[xi])for i = LowR to HighRif isset($X2[i]) then //Le prix a déjà été atteint, on ajoute 1$X2[i] = $X2[i]+1else //Toute première fois que le prix est atteint, on le crée$X2[i] = 1$Y2R[i] = iendifnextnextSomme = 0for i = Y3Rmin to Y3RmaxSomme = Somme + $X2[i]nextEtape = 2endifif islastbarupdate and Etape = 2 thenfor i = Y3Rmin to Y3RmaxDRAWSEGMENT(0, $Y2R[i], $X2[i], $Y2R[i]) style(line,5)drawtext($Y2R[i],$X2[i],$Y2R[i])nextendifdrawtext("traceur:#traceur# Somme:#Somme# Etape:#etape#",barindex,Y3Rmax+1)return startbar,barindex, Y3Rmin,Y3Rmax//LowR,Highr10/12/2022 at 9:17 AM #202351On me glisse à l’oreille, que en effet, puisqu’une variable “standard” (en l’occurrence Etape) ne prend sa valeur définitive qu’à la fin d’une bougie, à son Close, alors à chaque tick reçu durant la même bougie, elle vaut toujours 0. Donc en utilisant un tableau associé à la condition de cette variable, ton tableau change de valeur jusqu’au Close de la bougie en cours et par conséquent continue à se tracer avec des valeurs différentes à chaque nouveau tick reçu. Est-ce clair ?
10/12/2022 at 10:24 AM #202353Merci Nicolas. Oui c’est très clair. Je comprends mieux maintenant pourquoi sur des unités de temps plus courtes les données se stabilisent à un moment donné.
Par contre je suis preneur de toute astuce 😉
10/12/2022 at 11:05 AM #20235910/12/2022 at 11:31 AM #202366Nicolas,
J’ai changé la variable normale en tableau (voir code).
L’histogramme et le texte apparaissent mais disparaissent au prochain tick.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950//Etape 0 : on ne fait rien//Etape 1 : on compte le nombre de fois où le prix est atteint (Etape qui n'a lieu qu'une seule fois)//Etape 2 : on dessine l'histogramme des prixdefparam DRAWONLASTBARONLY = trueif not isset($Etape[0]) then$Etape[0] = 0endifif IsLastBarUpdate thenif $Etape[0] = 0 then$Etape[0] = 1endifendifonce traceur = 0If $Etape[0] = 1 thentraceur = traceur + 1Y3Rmax = round(highest[barindex](high))Y3Rmin = round(lowest[barindex](low))for x = 0 to barindex-1xi = barindex - xLowR = round(low[xi])HighR = round(high[xi])for i = LowR to HighRif isset($X2[i]) then //Le prix a déjà été atteint, on ajoute 1$X2[i] = $X2[i]+1else //Toute première fois que le prix est atteint, on le crée$X2[i] = 1$Y2R[i] = iendifnextnextSomme = 0for i = Y3Rmin to Y3RmaxSomme = Somme + $X2[i]next$Etape[0] = 2endifif $Etape[0] = 2 thenfor i = Y3Rmin to Y3RmaxDRAWSEGMENT(0, $Y2R[i], $X2[i], $Y2R[i]) style(line,5)nextendifdrawtext("traceur:#traceur# Somme:#Somme#",round(barindex/2),Y3Rmax+1)return10/13/2022 at 7:53 AM #202412Les mêmes raisons causent les mêmes effets 🙂
Toujours des variables qui reset dés le premier nouveau tick reçu.
Voilà une version qui fonctionne, j’ai supprimé les étapes, ayant bien compris le fonctionnement de ce que tu cherchais à faire.
12345678910111213141516171819202122232425262728293031323334defparam DRAWONLASTBARONLY = trueif IsLastBarUpdate and not isset($somme[0]) thenY3Rmax = round(highest[barindex](high))Y3Rmin = round(lowest[barindex](low))for x = 0 to barindex-1xi = barindex - xLowR = round(low[xi])HighR = round(high[xi])for i = LowR to HighRif isset($X2[i]) then //Le prix a déjà été atteint, on ajoute 1$X2[i] = $X2[i]+1else //Toute première fois que le prix est atteint, on le crée$X2[i] = 1$Y2R[i] = iendifnextnextSomme = 0for i = Y3Rmin to Y3RmaxSomme = Somme + $X2[i]next$somme[0]=somme$Y3Rmax[0] = Y3Rmax$Y3Rmin[0] = Y3Rminendifif isset($somme[0]) thenfor i = $Y3Rmin[0] to $Y3Rmax[0]DRAWSEGMENT(0, $Y2R[i], $X2[i], $Y2R[i]) style(line,5)nextendifreturn10/13/2022 at 8:30 AM #202416Top ! Ca faisait des jours que je me prenais la tête avec ça 🙂
Merci beaucoup Nicolas !
10/13/2022 at 8:59 AM #202426Super, bonne continuation.
1 user thanked author for this post.
-
AuthorPosts
Find exclusive trading pro-tools on