Bonjour à tous,
Veuillez trouvez ci-joint en fichier un market profile.
Ma question est la suivante ;
Est-il possible de créer un indicateur qui pourrait calculer automatiquement durant la journée le total des TPO
en fin de ligne de prix ?(voir graphique)
Merci
Oui, il est possible de construire un indicateur personnalisé qui compte automatiquement le nombre de TPO par niveau de prix pendant la session en cours et l’affiche sur le graphique. Ce type d’indicateur nécessite un contrôle détaillé du nombre de fois que le prix a touché chaque niveau au cours de la journée. Voici un exemple de base de la manière dont vous pourriez l’implémenter dans ProBuilder :
// TPO Count Indicator per Price Level During the Current Session
DEFPARAM CalculateOnLastBars = 500
once $tpoCounts[0] = 0
once $priceLevels[0] = 0
increment = pointsize // price increment in ticks
// Reset at the beginning of a new session
IF OpenDay <> OpenDay[1] THEN
UnSet($tpoCounts)
UnSet($priceLevels)
ENDIF
// Check if the current close price level has already been registered
found = 0
FOR i = 0 TO LastSet($priceLevels) DO
IF ABS(close - $priceLevels[i]) <= increment / 2 THEN
$tpoCounts[i] = $tpoCounts[i] + 1
found = 1
BREAK
ENDIF
NEXT
// If it's a new level, add it
IF found = 0 THEN
i = LastSet($priceLevels) + 1
$priceLevels[i] = close
$tpoCounts[i] = 1
ENDIF
// Display the total TPO count per price level on the chart
FOR i = 0 TO LastSet($priceLevels) DO
drawtext($tpoCounts[i], barindex, $priceLevels[i]) coloured("blue")
NEXT
return
rien ne se passe en graphique mode”MARKET PROFILE”.
En mode “PRIX” il y a une superposition des nombres
Je rajoute un point d’intérêt,
Un tour d’enchère dure 30mn dans un market profile du début à la fin du marché. Durant ce tour d’enchère, le prix peut aller de haut en bas ou inversement et comptera
autant de boites que de pointsize dans ce cas 0.01 points; Donc le range de 30mn correspond à autant de boite verticale même si le prix passe et repasse durant ce range.
Et ce dans tous les timeframes jusqu’à 30mn en mode “PRIX” ou 30mn en mode “MARKET PROFILE” et sur une ligne verticale en fin de graphique.
Bonjour. Je suppose que je ne t'ai pas compris. Ce que j'ai programmé calcule combien de fois le prix de clôture est passé par un certain niveau.
Dans le graphique “MARKET PROFILE”e ci-dessous chaque lettre verticale représente 30mn
Cela commence par A à 2h15 et finit par n à 22h00.(heure d’été)
Le but est de compter tout au long de la journée le nombre de BOITES sur chaque pipsize.
exemple : à 20h15 lettre k verticale
on a eu à 129,43 – 21 boites 129.40-16 boites 129.36-7 boites 129,25- 2 boites en horizontale.
Dans un graphique “PRIX” le système pourrait être pareil.
En 5 minutes, 6 chandeliers représente 30minutes le cours pourra repasser plusieurs fois sur un prix mais il ne comptera qu’un boite à tel prix.
exemple : 129.68- 1 boite 129.59 – 5 boites
et le compteur augmente au fur et a mesure du range de la journée. mais ne diminue jamais.
merci
Bon. Voyons si quelqu’un d’autre peut t’aider.
L’indicateur que j’ai codé évalue, au cours d’une même journée, les niveaux de clôture atteints par incréments de pipsize.
L’utilité que j’y vois, c’est qu’en fin de journée, on peut voir quels sont les niveaux les plus actifs.
En réalité, c’est une première étape pour coder le volume profile.
En réalité le “market profile” c’est le temps passé sur un prix dessiné par des boites (1pipsize) de 30mn
Bonjour à tous,
J’essaie toujours dans ma quête de MARKET PROFILE a mettre en place la value area, la VAH, la VAL, le POC et tout ceci
dans un code dynamique.L’IA m’a sorti un code mais il y des erreurs .Si un informaticien veut bien se pencher dessus.
merci à vous
// === Paramètres ===
tickSize = 0.25 // Résolution du profil en points
maxLevels = 200 // Nombre max de niveaux de prix
valueAreaPercent = 70 // Pourcentage de la Value Area
// === Détection d’un nouveau jour ===
newDay = (date <> date[1])
if newDay then
i_reset = 0
minPrice = low
maxPrice = high
endif
// === Initialisation progressive des niveaux TPO ===
if i_reset < maxLevels then
if i_reset = 0 then setglobal("freq0", 0)
if i_reset = 1 then setglobal("freq1", 0)
if i_reset = 2 then setglobal("freq2", 0)
if i_reset = 3 then setglobal("freq3", 0)
if i_reset = 4 then setglobal("freq4", 0)
if i_reset = 5 then setglobal("freq5", 0)
if i_reset = 6 then setglobal("freq6", 0)
if i_reset = 7 then setglobal("freq7", 0)
if i_reset = 8 then setglobal("freq8", 0)
if i_reset = 9 then setglobal("freq9", 0)
// [...] à répéter jusqu’à freq199
i_reset = i_reset + 1
endif
// === Mise à jour min/max journalier ===
if low < minPrice then
minPrice = low
endif
if high > maxPrice then
maxPrice = high
endif
// === Calcul du nombre de niveaux à suivre ===
range = maxPrice - minPrice
nbBins = min(maxLevels, ceil(range / tickSize) + 1)
// === Mise à jour des niveaux de fréquence (TPO) ===
for i = 0 to nbBins - 1 do
level = minPrice + i * tickSize
if level >= low and level <= high then
freq = getglobal("freq" + i)
setglobal("freq" + i, freq + 1)
endif
next
// === Détermination du POC ===
pocIdx = 0
maxFreq = getglobal("freq0")
totalFreq = maxFreq
for i = 1 to nbBins - 1 do
freq = getglobal("freq" + i)
totalFreq = totalFreq + freq
if freq > maxFreq then
maxFreq = freq
pocIdx = i
endif
next
// === Calcul Value Area (70%) ===
target = totalFreq * valueAreaPercent / 100
sum = getglobal("freq" + pocIdx)
up = pocIdx + 1
down = pocIdx - 1
while sum < target do
fUp = 0
fDown = 0
if up < nbBins then
fUp = getglobal("freq" + up)
endif
if down >= 0 then
fDown = getglobal("freq" + down)
endif
if fUp >= fDown and up < nbBins then
sum = sum + fUp
up = up + 1
elsif down >= 0 then
sum = sum + fDown
down = down - 1
else
break
endif
wend
// === Résultats convertis en prix ===
poc = minPrice + pocIdx * tickSize
vah = minPrice + (up - 1) * tickSize
val = minPrice + (down + 1) * tickSize
// === Tracé ===
return poc coloured("red") style(line,2) as "POC",
vah coloured("green") style(dottedline) as "VAH",
val coloured("green") style(dottedline) as "VAL"
venturer ne peux pas t’aider .
voici le lien de ce qu’il a fait
Indicatore Volume Profile diviso per sessione
Merci mais ce n’est pas ce que je recherche .Ce n’est pas un volume profile mais un market profile (avec un profil dynamique)et en plus je me suis trompé ,je voulais créer un nouveau post.
Chose que je vais faire maintenant.
Les logiciels d’IA génèrent presque toujours du code incorrect, car ils n’ont pas une bonne connaissance du langage ProRealTime (ProBuilder).
Je vais vous signaler quelques erreurs que vous devrez corriger :
- les mots surlignés en bleu sont des mots réservés, par exemple tickSize ; il suffit de changer le nom, en ajoutant même une seule lettre, par exemple : mytickSize
- les noms de variables doivent toujours commencer par une lettre, mais peuvent également contenir des chiffres ; Cependant, ils NE PEUVENT PAS contenir de caractères de ponctuation ou de caractères spéciaux ; vous devrez supprimer le trait de soulignement «_» ou le remplacer
- IF doit être suivi de la condition à tester et THEN, mais il ne doit y avoir AUCUN autre caractère après THEN, à l’exception des commentaires ; vous devez donc mettre les instructions qui sont écrites après THEN, sur une nouvelle ligne suivante; s’il y a plusieurs instructions, chacune doit être écrite sur une ligne distincte; la dernière ligne DOIT contenir uniquement l’instruction ENDIF (éventuellement suivie uniquement de commentaires)
- les instructions getglobal et setglobal n’existent PAS, vous devriez essayer d’utiliser des instructions similaires (que je ne connais pas) ; Il semble que ce soient des fonctions qui ne sont pas actuellement supportées par ProRealTime mais qui pourraient être remplacées par des indicateurs appelés via CALL
- RETURN doit avoir TOUTES les valeurs sur une seule ligne; Vous pouvez facilement résoudre ce problème en déplaçant les lignes après la première vers le haut.
Vous pouvez vérifier cet indicateur : https://www.prorealcode.com/prorealtime-indicators/rolling-poc-volume-profile-indicator/ De là, vous pouvez obtenir le VAH et le VAL. Mais je te laisse ça 😉