Historique des prix, combien de fois le prix a t’il coupé un niveau ?
Forums › ProRealTime forum Français › Support ProBuilder › Historique des prix, combien de fois le prix a t’il coupé un niveau ?
- This topic has 20 replies, 4 voices, and was last updated 1 year ago by sharteel.
-
-
12/13/2021 at 1:22 PM #183243
Bonjour à tous,
Je cherche à connaitre combien de fois une valeur de prix est “coupée” par le cours.
Je m’explique, je travaille sur les indices, en chandelier et j’aimerai réussir à créer un indicateur qui sur la droite (barindex + 50 par exemple) me dise combien de fois le cours a coupé ou été égal à ce niveau.
J’y arrive correctement avec 1 niveau à tester.
Donc pour le niveau tester ‘16390’ le cour le coupe ou est égal 108 fois !
(La ligne visuelle n’est pas nécessaire, c’était uniquement pour ‘illustrer’ l’exemple).Maintenant j’aimerai arriver à trouver comment faire pour tester toutes les valeurs entre le plus bas et le plus haut affiché.
Je n’arrive pas à utiliser correctement la fonction “For” ou “While”, et surtout comment faire pour connaitre pour chaque niveau le nombre de “coupe”.
Faut il passer par “array” car quand je demande “drawtext” j’ai la même valeur à chaque niveau.
Voici mon début de code :
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051defparam drawonlastbaronly = true///////////////////////////t = time[0]if t > t[1] thenChandelles = 1endifif Chandelles > Chandelles[1] thenNombreChandelles = 2endifif Chandelles = Chandelles[1] thenNombreChandelles = NombreChandelles[1]+1endifif NombreChandelles > 3 thenMaxHisto = highest[NombreChandelles](high)MinHisto = lowest[NombreChandelles](low)endifDiff = MaxHisto - MinHistoLigneBasse = MinHisto - 10LigneHaute = MaxHisto + 10///////////////////////////if SignalTouche <> 0 thenSommeSignalTouche = SommeSignalTouche[1] + 1endif///////////////////////////a = 16390if ((high >= a or close >= a) and (low <= a or open <= a)) or ((high >= a or open >= a) and (low <= a or close <= a)) then//backgroundcolor (0,180, 70)SignalTouche = 1elseSignalTouche = 0endifif SignalTouche <> 0 thenSommeSignalTouche = SommeSignalTouche[1] + 1endifdrawtext ("#SommeSignalTouche#", barindex+30, a, dialog, bold, 10) coloured (255, 255, 255)drawsegment (barindex+60, a, barindex+3500, a)return a as "Ligne Test"Merci d’avance,
N’hésitez pas à me demander plus de précisions.
Benjamin
12/28/2021 at 10:35 AM #18395912/28/2021 at 8:34 PM #184048Bonsoir Nicolas!
Merci pour ton retour!
Alors je vais essayer d’être le plus clair possible.
Il y aurait plusieurs niveaux à tester ! Idéalement de 0,25 en 0,25 d’une valeur X a une valeur X+50 (par exemple).
Et cela sur un nombre choisi de chandelles, les 100 dernières par exemple.
Pour l’affichage.
J’imaginais, en gros, une sorte de heatmap sur le côté (dans le futur) au niveau des valeurs du cours.
Je m’explique, pour la valeur testée “16400”
Le cours “crosses over” ou “crosses under” “16400”, 9 fois sur les 100 dernières chandelles. Donc idéalement au niveau de “16400” un petit carré d’une certaine couleur, si 9 fois c’est beaucoup.
Cela se mettrait à jour à chaque chandelle clôturée.
Je suis compréhensible?
Encore merci à toi Nicolas, je reste à ta disposition pour tous éclaircissements nécessaires!
12/29/2021 at 3:53 PM #184103Ci-joint un premier essai, mais le code ne fonctionne pas 🙁 j’ai une erreur de ‘positive integer’ pour le tableau $level, alors que non il ne devrait pas y en avoir à priori..
123456789101112131415161718192021222324252627282930313233defparam drawonlastbaronly=truex1 = 15840x2 = 16000step = 0.25MaxBars = 200Size = 20 //heat map size in candlesticks//---------------//make the count of close crossesif islastbarupdate thenx = x1while x<=x2 dofor i = maxbars downto 1 doif close[i] crosses over x then$level[x] = $level[x]+1endifnextx = x+step*pointsizewend//plot the levelsimax = arraymax($level)while x>=x1 doif ($level[x]>0) and x>0 and isset($level[x]) thenlevelsize = 100*round($level[x]/imax)drawsegment(barindex,$level[x]+size,barindex,$level[x]+size+levelsize)endifx = x-step*pointsizewendendifreturnJe vais voir qui pourrait m’aider et je reviens vers toi .. ! 😉
12/29/2021 at 6:49 PM #18412812/30/2021 at 11:55 AM #184150Le problème du code posté ci-dessus vient du fait que j’ai référencé les colonnes du tableau avec des Double puisque j’utilisais x comme valeur avec des pointsize, donc avec des décimales pour résumé, hors ce doit être des integer bien entendu..
bref, je suis reparti de plus simple, d’autant plus qu’on excède facilement les capacités mémoire avec ce genre de boucle, voici autre chose :
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647defparam drawonlastbaronly=truedefparam calculateonlastbars=1000drawvline(barindex[1000])// ------------------------x1 = 46700x2 = 47150step = 2.5Size = 5 //heat map size in candlesticks//---------------inbetween = close>=x1 and close<=x2x = x1y=0if inbetween thenwhile x<=x2 doif close crosses over x or close crosses under x thenif isset($levelc[y]) then$levelp[y] = x$levelc[y] = $levelc[y]+1else$levelp[y] = x$levelc[y] = 1endify=y+1endifx = (x+(step*pointsize))wendendif//make the count of close crossesif islastbarupdate then//plot the levelsimax = arraymax($levelc)for i = 0 to y doif isset($levelp[i]) thenlevelsize = ($levelc[i]/imax)*100//drawtext(levelsize,barindex,$levelp[i])drawsegment(barindex+size,$levelp[i],barindex+size+levelsize,$levelp[i]) style(line,2)endifnextendifreturn y coloured(100,100,0),lastset($levelc) coloured(0,0,200),arraymax($levelc)01/03/2022 at 3:58 PM #18441805/24/2022 at 7:47 AM #193753Bonjour à tous,
Bonjour Nicolas,
Une nouvelle fois merci pour tes précédents retours,
Je me permets de répondre ici, afin d’éviter de faire un doublon de topic.
Car en effet, les limites de mes connaissances en codage m’empêche d’utiliser / torturer le code que tu as eu la gentillesse de me faire.
Et je n’arrive pas à l’exploiter comme je l’aimerai.
Je me permets de nouveau d’expliquer ce que j’aimerai réussir à faire.
L’idée principale et de visualiser les niveaux de prix les plus “touchés”, sur une période donnée.
Dans mon exemple, je travaille sur le S&P en 30s.
Donc une période de 120 barindex pour avoir la dernière heure.
Tester chaque valeur de prix entre le plus haut de la dernière heure et le plus bas de la dernière heure.
Dans l’optique final d’avoir sur le côté du graphique (barindex + 5) une heat map des niveaux les plus fréquents, juste un petit carré variant du blanc (touché 1 fois) au rouge (touché le plus de fois) pour chaque valeur de prix.
Donc j’ai créé un petit code très simple, qui me donne pour une ligne test le nombre de fois où cette dernière est touchée par le cours.
12345678910111213141516Periode = 120PlusHautPeriode = Highest[Periode](High)PlusBasPeriode = Lowest[Periode](Low)LigneTest = 3960if High >= LigneTest and Low <= LigneTest thenToucheLigneTest = 1elseToucheLigneTest = 0endifNombreToucheLigneTest = Summation[Periode](ToucheLigneTest)return PlusHautPeriode as "PlusHautPeriode", PlusBasPeriode as "PlusBasPeriode", ToucheLigneTest as "ToucheLigneTest", LigneTest as "LigneTest", NombreToucheLigneTest as "NombreToucheLigneTest"Maintenant je bloque sur le fait de tester chaque valeur de prix (de 0,25 en 0,25, entre le plus bas et le plus haut).
Pour ensuite créer la heat map.
Aurais tu une idée de comment je pourrai faire?
Je reste à votre entière disponibilité si vous avez la moindre question.
Merci beaucoup!
05/24/2022 at 8:49 AM #193758Voilà une version rapide, la couleur varie du noir au rouge :
1234567891011121314151617181920212223242526272829303132333435defparam drawonlastbaronly=truePeriod = 120step = 0.25// ---------hh = Highest[Period](High)ll = Lowest[Period](Low)checkprice = llif islastbarupdate thenind=0 //reset index of array//get the price touch occurences for each levelwhile checkprice<=hh dotouch=0 //reset price touch for this price levelfor i = 0 to period-1 doif high[i]>=checkprice and low[i]<=checkprice thentouch=touch+1$hm[ind] = touchendifnext//define colorr = min($hm[ind]*10,255)//plot the result//drawtext($hm[ind],barindex+5,checkprice) coloured(r,0,0)drawtext("█",barindex+5,checkprice) coloured(r,0,0)checkprice=checkprice+step //increase price check for next roundind=ind+1 //increase array indexwendendifreturn hh,ll1 user thanked author for this post.
05/24/2022 at 2:57 PM #19378405/24/2022 at 3:27 PM #19378705/24/2022 at 3:57 PM #19379205/24/2022 at 3:58 PM #193793voici le lien
https://www.prorealcode.com/topic/indicatore-volume-profile-diviso-per-sessione/
1 user thanked author for this post.
05/24/2022 at 5:05 PM #193799Bonjour Fifi,
Merci beaucoup pour ton retour,
Effectivement, ce qu’à construit Cventurer est très intéressant,
Néanmoins je ne trouve toujours pas l’astuce pour ressortir le plus grand ‘touch’.
Merci de ton aide,
Si jamais une autre technique est possible!
05/24/2022 at 6:22 PM #193803Bonsoir,
J’ai un début d’ébauche de commencement d’idée,
//////////
defparam drawonlastbaronly=true
Period = 120
step = 0.25
// ———hh = Highest[Period](High)
ll = Lowest[Period](Low)checkprice = ll
MaxTouch1 = 0if IsLastBarUpdate then
ind=0 //reset index of array
//get the price touch occurences for each level
while checkprice<=hh do
touch=0 //reset price touch for this price level
for i = 0 to period-1 do
if high[i]>=checkprice and low[i]<=checkprice then
touch=touch+1
$hm[ind] = touch
endif
nextif $hm[ind] > MaxTouch1 then
MaxTouch1 = $hm[ind]
MaxTouch2 = checkprice
endif//define color
r = min($hm[ind]*10,255)
//plot the result
drawtext(“█”,barindex+5,checkprice) coloured(r,0,0)
drawtext(“#touch#”,barindex+8,checkprice) coloured(r,0,0)
checkprice=checkprice+step //increase price check for next round
ind=ind+1 //increase array indexwend
endifreturn hh,ll, touch as “touch”, MaxTouch2 as “MaxTouch2″
//////////
(Désolé je n’ai plus la fonction ‘insert PRT code”)
Première remarque, en faisant un return de “MaxTouch2” j’arrive à avoir le niveau (prix) du ‘touch’ le plus grand, mais uniquement à partir du moment ou je ‘valide’ le code.
Je n’ai pas ‘avant’, est se lié à “IsLastBarUpdate”?Deuxièmement, comme je le présentais, si plusieurs ‘touch’ on le même nombre ‘MaxTouch2’ se fixe sur le niveau du ‘premier’.
Comment pourrais je faire pour pour que si il y a un seul ‘touch’ à 25 alors ‘MaxTouch2’ = le niveau du touch à 25.
Mais s’ił y a 2 touch à 25 alors avoir un nouveau ‘MaxTouch2’ qui s’aligne au niveau du deuxième touch à 25.Merci à vous!
-
AuthorPosts
Find exclusive trading pro-tools on