Ce post n’a d’autre but que de faire connaître le travail d’un membre du forum, “Blade 106” bien trop peu actif à mon sens!
Dans le cadre de la représentation graphique de “Fair Value Gap(FVG)” selon l’approche ICT-SMC, il a créé un “Drawrectangle” rétractable. J’ignorais que ce procédé était possible sur Probuilder.
Il est d’habitude de voir des “Drawrectangle” qui restent fixes et figés dans le temps sur nos graphiques. Avec la formulation de “Blade 106”, les “Drawrectangle” vont disparaître au fur et à mesure que les “FVG” vont être comblés.
Je trouve ça génial et cela rend vraiment les graphiques beaucoup plus lisibles!
Je le mets en avant ici, afin de peut-être démocratiser la formule dans la perspective de nouveaux algorithmes…
Je joins le code et une image, mais il va de soi que seul un accès en temps réel peut permettre de se rendre compte de la beauté de la chose!
DEFPARAM DrawOnLastBarOnly = true
DEBUG = 0
// Start of code, don't change anything below
IF IsLastBarUpdate THEN
$RangeHigh[0] = 0
$RangeLow[0] = 0
$RangeIndex[0] = 0
RangeIdx = 0
BI = 0
B = 0
RI = 0
TotalBars = BarIndex[0]
IF DEBUG = 1 THEN
DRAWTEXT("Total bars: #TotalBars#", BarIndex[0], High[0])
ENDIF
// List all imbalance
FOR RI = 1 TO TotalBars - 2 DO
BI = BarIndex[RI]
//drawtext("#BI#", BI, High[RI])
IF High[BI - 1] < Low[BI + 1] THEN
RangeIdx = RangeIdx + 1
$RangeHigh[RangeIdx] = Low[BI + 1]
$RangeLow[RangeIdx] = High[BI - 1]
$RangeIndex[RangeIdx] = RI
ENDIF
IF High[BI + 1] < Low[BI - 1] THEN
RangeIdx = RangeIdx + 1
$RangeHigh[RangeIdx] = Low[BI - 1]
$RangeLow[RangeIdx] = High[BI + 1]
$RangeIndex[RangeIdx] = RI
ENDIF
NEXT
IF DEBUG = 1 THEN
DRAWTEXT("Imbalance found: #RangeIdx#", BarIndex[0], Low[0])
ENDIF
// Remove mitigated imbalance
FOR RI = 1 TO RangeIdx DO
IF DEBUG = 1 THEN
DRAWRECTANGLE($RangeIndex[RI] - 1, $RangeHigh[RI], $RangeIndex[RI] + 1, $RangeLow[RI]) COLOURED(0,0,200)
ENDIF
Valid = 1
FOR B = $RangeIndex[RI] + 2 TO TotalBars DO
LB = Low[BarIndex[B]]
HB = High[BarIndex[B]]
// Candle is above or below our zone, ignore it
IF LB >= $RangeHigh[RI] OR HB <= $RangeLow[RI] THEN
IF DEBUG = 1 THEN
DRAWTEXT("Out", B, High[BarIndex[B]])
ENDIF
CONTINUE
ENDIF
IF LB <= $RangeLow[RI] THEN
// Candle engulfs our zone, so imbalance is mitigated
IF HB >= $RangeHigh[RI] THEN
IF DEBUG = 1 THEN
DRAWTEXT("Mitigated", B, High[BarIndex[B]])
ENDIF
Valid = 0
BREAK
ENDIF
IF DEBUG = 1 THEN
DRAWTEXT("High", B, High[BarIndex[B]])
ENDIF
$RangeLow[RI] = HB
ELSE
// In this case, Low is within the zone
IF DEBUG = 1 THEN
DRAWTEXT("Low", B, High[BarIndex[B]])
ENDIF
$RangeHigh[RI] = LB
ENDIF
NEXT
IF Valid = 1 THEN
DRAWRECTANGLE($RangeIndex[RI], $RangeHigh[RI], TotalBars+2000, $RangeLow[RI]) COLOURED(0,0,0,0) FILLCOLOR(0,0,0,30)
ENDIF
NEXT
ENDIF
RETURN
C’est l’instruction ci-dessous qui efface tous les éléments graphiques à chaque nouvelle bougie (c”est par ailleurs le seul moyen d’effacer à ma connaissance), pour ne retracer que les éléments que l’on demande au code de tracer lors de la dernière lecture du code (suite à la dernière bougie donc). Il suffit de stocker tous les éléments que l’on veut retracer dans un tableau (avec possibilité d’en éliminer au passage) pour les retracer tous à chaque nouvelle bougie en parcourant le tableau… Cela fonctionne bien sûre avec toutes les instructions graphiques (segments, ligne triangle, etc)
DEFPARAM DrawOnLastBarOnly = true