The manner of the return into the compression box is the difference between a trending and a trading market.

You need a big hump – 62+ directional pips within 10 hours.
Upon returning into the sub-31-zone, the new, trending direction would have to stay above the oppressed direction for a bit. I use the RSI2 reading for a bit of disqualification – and the oppressed side has to be oppressed all along (10 hours).

if (
ExtATRBuffer2[i+1]<31 && RSI2[i]<90 &&
ExtATRBuffer[i+2]>31 && ExtATRBuffer[i+1]<31 && ExtATRBuffer[i]<28 && ExtATRBuffer[ArrayMaximum(ExtATRBuffer,10,i)]>62){
ObjectCreate("LINUS"+IntegerToString(i),OBJ_VLINE,1, Time[i], 0);
ObjectSet("LINUS"+IntegerToString(i),OBJPROP_COLOR,clrBrown);
ObjectSet("LINUS"+IntegerToString(i),OBJPROP_WIDTH,6);
ObjectSet("LINUS"+IntegerToString(i),OBJPROP_STYLE,STYLE_DOT);
ObjectSet("LINUS"+IntegerToString(i),OBJPROP_BACK,1);
ObjectCreate("LINUSZ"+IntegerToString(i),OBJ_TEXT, 1, Time[i],55);
ObjectSetText("LINUSZ"+IntegerToString(i),"Cut/OH: "+DoubleToStr(NormalizeDouble(High[i],4),4)+"+", 26, "Impact", clrCrimson);
}
if (
ExtATRBuffer[i+1]<31 && RSI2[i]>8 &&
ExtATRBuffer2[i+2]>31 && ExtATRBuffer2[i+1]<31 && ExtATRBuffer2[i]<28 && ExtATRBuffer2[ArrayMaximum(ExtATRBuffer2,10,i)]>62){
ObjectCreate("LINUS"+IntegerToString(i),OBJ_VLINE,1, Time[i], 0);
ObjectSet("LINUS"+IntegerToString(i),OBJPROP_COLOR,clrLimeGreen);
ObjectSet("LINUS"+IntegerToString(i),OBJPROP_WIDTH,6);
ObjectSet("LINUS"+IntegerToString(i),OBJPROP_STYLE,STYLE_DOT);
ObjectSet("LINUS"+IntegerToString(i),OBJPROP_BACK,1);
ObjectCreate("LINUSZ"+IntegerToString(i),OBJ_TEXT, 1, Time[i],55);
ObjectSetText("LINUSZ"+IntegerToString(i),"Cut/OH: "+DoubleToStr(NormalizeDouble(Low[i],4),4)+"-", 26, "Impact", clrGreen);
}
This was my project for the day: