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("yellow",150)
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("yellow",150)
ENDIF
NEXT
ENDIF
RETURN