I’m a market models guy.
Here are some findings.

A market that is hitting the upper white band (2.8x stretch from the E-9) on the upside but not touching the lower one is an uptrending market.
A fresh-out condition (F) may be the start of a full turn or a correction. An F gets voided (not white) if in the following 3 days the volatility extreme gets exceeded.
A reversal requires the re-visit of an F 3 times in a row, then a break and a close outside of the box drawn.

A major top/bottom stats with the proof of a counter-directional volatility. This is a clearly visible ABC move (off #1 – on images 1 and 3). The A would miss the opposite band by 56 pips, the B would miss the band on the side of the F by a little less (say 42, 36 in these examples) and the C would miss the opposite band by even less than A did. The second F is #2 the 3rd F print requires another ABC move, but way smaller in amplitude. Nevertheless, the size is such that it should take a minimum of 3 days to print with the B falling shy of the F, and the C2 falling shy of the “A2” (a contracting pattern), then #3 would be the undercut of both 1 and 2.

if (High[i]>iMA(symbol,0,9,0,MODE_EMA, PRICE_MEDIAN,i)+FMax*2.2*10*Point
&& High[i]>High[i+1]+33*Point && Close[i]<High[i]-60*Point &&
High[i]-Low[i]>900*Point && Low[i]>L80N[i+1]
)
ObjectCreate("Bod"+DoubleToStr(i), OBJ_TEXT, 0, Time[i], High[i]+330*Point);
if (i>1 && High[i]>High[i+1] && (High[i-1]>High[i] || High[i-2]>High[i]) && Low[i]>L80N[i]) ObjectSetText("Bod"+DoubleToStr(i), "F", 24, "Impact", Green);
else if (i>2 && High[i]>High[i+1] && High[i-3]<High[i] && Low[i]>L80N[i]) ObjectSetText("Bod"+DoubleToStr(i), "F", 24, "Impact", Green);
else ObjectSetText("Bod"+DoubleToStr(i), "F", 24, "Impact", White);
if (Low[i]<iMA(symbol,0,9,0,MODE_EMA, PRICE_MEDIAN,i)-FMax*2.4*10*Point
&& Low[i]<Low[i+1]-33*Point && (Close[i]>Low[i]+210*Point || (i>0 && Low[i-1]>Low[i])) &&
High[i]-Low[i]>430*Point && High[i]<L80N[i+1]
)
ObjectCreate("Bod"+DoubleToStr(i), OBJ_TEXT, 0, Time[i], Low[i]-330*Point);
if (i>1 && Low[i]<Low[i+1] && (Low[i-1]<Low[i] || Low[i-2]<Low[i]) && High[i]<L80N[i]) ObjectSetText("Bod"+DoubleToStr(i), "F", 24, "Impact", Red);
else if (i>2 && Low[i]<Low[i+1] && Low[i-3]<Low[i] && High[i]<L80N[i]) ObjectSetText("Bod"+DoubleToStr(i), "F", 24, "Impact", Red);
else ObjectSetText("Bod"+DoubleToStr(i), "F", 24, "Impact", White);
}
#43, all were made this year since March.