By calling upon Vax within the 30-minute window with a 398-sample dataset, the Fractal MFI divergence can receive an additional flag.
Looking at the Cumulative Volume Delta, you can see that Friday was a strong up day, buying from the start to the end, almost on the high.

Of course, still outside the prior volume block.
Now, my colored MFI divergence highlights are a good idea to start with, but it is tiresome going back and forth between 30-min and 1H just to get a picture of the volatility-compression readings. So, more text was my answer.

As you can see the red / bear line is over the bull line, which can be a crucial final information that tips the scale. The high of that candle is a promoted sell.
Next up, a Demoted buy.

Of course, things can get more nuanced than that.
For instance, a low volatility turn sequence plots first a “where” spike out of the 30 BB (triangular plots) then the “when” receives its plot (vertical highlights), and if the where block is unable to break through the peak of the triangle, that’s a priority turn.

As you can see, the Demoted supplementing flag was incorrect. 4 hours later, the Bears managed to overcome the Bulls. Time/sample size is just as important as the price level. No New HH.
Here’s one more example of a low-volatility turn.

No new LL.
///fractal MFI below
if (i>0 && Close[i+2]>Low[i] && Low[i+1]>Low[i] && Low[i]<iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_LOWER,i) && Close[i-1]>iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_LOWER,i-1)-20*Point && Low[i-1]>Low[i]-20*Point ){
MFIDMEM[i]=MFI[i];
ObjectCreate("Caligula"+IntegerToString(i),OBJ_TEXT, 3, Time[i],25);
ObjectSetText("Caligula"+IntegerToString(i),DoubleToStr(NormalizeDouble(MFI[i],1),1), 16, "Impact", clrGray);
if (MFIDMEM[i+1]<MFIDMEM[i] && MFI[i]<48 && MFI[i]>26 && (RSI2[i]<10 || RSI2[i]>20)) {ObjectSetText("Caligula"+IntegerToString(i),DoubleToStr(NormalizeDouble(MFI[i],1),1), 26, "Impact", clrGreen);
ObjectCreate("Caligulas"+IntegerToString(i),OBJ_TEXT, 3, Time[i],95);
ObjectSetText("Caligulas"+IntegerToString(i),"U-BB (S30Wide)/3BBx", 22, "Impact", clrBlue);
if (ExtATRBuffer2[i+1]>ExtATRBuffer[i+1]) {
ObjectCreate("Caligulazz"+IntegerToString(i),OBJ_TEXT, 3, Time[i+8],25);
ObjectSetText("Caligulazz"+IntegerToString(i),"Promoted", 22, "Impact", clrMidnightBlue);
}
else {
ObjectCreate("Caligulazz"+IntegerToString(i),OBJ_TEXT, 3, Time[i+8],25);
ObjectSetText("Caligulazz"+IntegerToString(i),"Demoted", 22, "Impact", clrMidnightBlue);
}
ObjectCreate("Caligulasz"+IntegerToString(i),OBJ_TEXT, 3, Time[i],55);
ObjectSetText("Caligulasz"+IntegerToString(i),"S4 -> E-", 22, "Impact", clrMidnightBlue);
if (RSI2[i]<5) {ObjectSetText("Caligula"+IntegerToString(i),DoubleToStr(NormalizeDouble(MFI[i],1),1), 26, "Impact", clrAquamarine);
if (ExtATRBuffer2[i+1]>ExtATRBuffer[i+1]) {
ObjectCreate("Caligulazz"+IntegerToString(i),OBJ_TEXT, 3, Time[i+8],25);
ObjectSetText("Caligulazz"+IntegerToString(i),"Promoted", 22, "Impact", clrMidnightBlue);
}
else {
ObjectCreate("Caligulazz"+IntegerToString(i),OBJ_TEXT, 3, Time[i+8],25);
ObjectSetText("Caligulazz"+IntegerToString(i),"Demoted", 22, "Impact", clrMidnightBlue);
}
ObjectSetText("Caligulas"+IntegerToString(i),"->3xBB,Vol,Fail/Fl-Stop", 22, "Impact", clrIndigo);
}
}
}
///fractal MFI above
if (i>0 && Close[i+2]<High[i] && High[i+1]<High[i] && High[i]>iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_UPPER,i) && Close[i-1]<iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_UPPER,i-1)+5*Point && High[i-1]<High[i]+20*Point){
MFIUMEM[i]=MFI[i];
ObjectCreate("Caligula"+IntegerToString(i),OBJ_TEXT, 3, Time[i],95);
ObjectSetText("Caligula"+IntegerToString(i),DoubleToStr(NormalizeDouble(MFI[i],1),1), 16, "Impact", clrGray);
if (MFI[i]>68 && MFI[i]<75 && RSI2[i]<96 ) ObjectSetText("Caligula"+IntegerToString(i),DoubleToStr(NormalizeDouble(MFI[i],1),1), 26, "Impact", clrBlue);
if (MFIUMEM[i+1]<MFIUMEM[i] && MFI[i]>52 && MFI[i]<71 && RSI2[i]<96 ) {ObjectSetText("Caligula"+IntegerToString(i),DoubleToStr(NormalizeDouble(MFI[i],1),1), 26, "Impact", clrRed);
if (ExtATRBuffer2[i+1]<ExtATRBuffer[i+1]) {
ObjectCreate("Caligulazz"+IntegerToString(i),OBJ_TEXT, 3, Time[i+8],75);
ObjectSetText("Caligulazz"+IntegerToString(i),"Promoted", 22, "Impact", clrMidnightBlue);
}
else {
ObjectCreate("Caligulazz"+IntegerToString(i),OBJ_TEXT, 3, Time[i+8],75);
ObjectSetText("Caligulazz"+IntegerToString(i),"Demoted", 22, "Impact", clrMidnightBlue);
}
}
If this is a low volatility turn – and I don’t think it is (- a stall), it would still have to test back into that triangle at least once. A lower low would mean a high volatility turn though.
There is a well-defined failure area between 1.1622 and 1.16, the prudent area to pick up a hedge / close shorts. The BRK level should remain untouched. If it blows past, you are in a Wave 3 down, and a new measuring leg just started printing.

After a while, it may pose a challenge to surprise yourself with what you can do in music. I am managing to do it still.

After a volatility compression anchor print, there should be a divergence, weaker compression achieved at a lower low.