The directional logic is coming along nicely.

There is a chance to turn back up around the blue BB (120-sample), but it has not happened yet. There should be a touch-and-go at the BB and another try that falls short. Kind of the mirror image of this:

Otherwise, wait for a color arrow (Red / Green = color arrows, Blue=no color, BB marker, Black=no color, black is a Tone).

The black can be a higher low / lower high already, but the colorless combo has no real foundation for a complete reversal without a color arrow (typically at the opposite side).
///prelim blue arrow down
if (i>0 && Open[i]<iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_UPPER,i) && Close[i]<iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_UPPER,i) && Close[i]<iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_UPPER,i) && High[i]>iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_UPPER,i) && High[i-1]<High[i] && Low[i+3]<(iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_MAIN,i+3)+10*Point) ) {mode[i]=-1;
ObjectCreate("Cigar"+IntegerToString(i), OBJ_TEXT, 0, Time[i], High[i]+120*Point);
ObjectSetText("Cigar"+IntegerToString(i), CharToStr(234), 56, "Wingdings", RoyalBlue);
royal[i]=-1;
}
if (i>0 && mode[i]<0 && Open[i]<iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_UPPER,i) && Close[i]<iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_UPPER,i) && High[i]>iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_UPPER,i) && High[i-1]>High[i] && Low[i+1]<(iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_MAIN,i+1))) mode[i]=1;
///prelim blue arrow up
if (i>0 && Open[i]>iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_LOWER,i) && Close[i]>iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_LOWER,i) && Close[i]>iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_LOWER,i) && Low[i]<iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_LOWER,i)-10*Point && Low[i-1]>Low[i]) {mode[i]=1;
ObjectCreate("Cigar"+IntegerToString(i), OBJ_TEXT, 0, Time[i], Low[i]-30*Point);
ObjectSetText("Cigar"+IntegerToString(i), CharToStr(233), 56, "Wingdings", RoyalBlue);
royal[i]=1;
}
if (i>0 && mode[i]>0 && Open[i]>iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_LOWER,i) && Close[i]>iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_LOWER,i) && Low[i]<iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_LOWER,i)-10*Point && Low[i-1]<Low[i]) mode[i]=-1;
///black arrow down
if (royal[ArrayMinimum(royal,24,i)]<0 && royal[ArrayMinimum(royal,6,i)]>=0 && iFractals(symbol,0,MODE_UPPER,i) && High[i]>iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_UPPER,i)-80*Point && High[i]<iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_UPPER,i)){
ObjectCreate("Cigar"+IntegerToString(i), OBJ_TEXT, 0, Time[i], High[i]+120*Point);
ObjectSetText("Cigar"+IntegerToString(i), CharToStr(234), 56, "Wingdings", Black);
}
///black arrow up
if (royal[ArrayMaximum(royal,24,i)]>0 && royal[ArrayMaximum(royal,6,i)]<=0 && iFractals(symbol,0,MODE_LOWER,i) && Low[i]<iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_LOWER,i)+80*Point && Low[i]>iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_LOWER,i)){
ObjectCreate("Cigar"+IntegerToString(i), OBJ_TEXT, 0, Time[i], Low[i]-30*Point);
ObjectSetText("Cigar"+IntegerToString(i), CharToStr(233), 56, "Wingdings", Black);
}
///black arrow down
if (royal[ArrayMinimum(royal,24,i)]<0 && royal[ArrayMinimum(royal,6,i)]>=0 && iFractals(symbol,0,MODE_UPPER,i) && High[i]>iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_UPPER,i)-80*Point && High[i]<iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_UPPER,i)){
ObjectCreate("Cigar"+IntegerToString(i), OBJ_TEXT, 0, Time[i], High[i]+120*Point);
ObjectSetText("Cigar"+IntegerToString(i), CharToStr(234), 56, "Wingdings", Black);
}
///black arrow up
if (royal[ArrayMaximum(royal,24,i)]>0 && royal[ArrayMaximum(royal,6,i)]<=0 && iFractals(symbol,0,MODE_LOWER,i) && Low[i]<iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_LOWER,i)+80*Point && Low[i]>iBands(symbol,0,120,2,0,PRICE_MEDIAN,MODE_LOWER,i)){
ObjectCreate("Cigar"+IntegerToString(i), OBJ_TEXT, 0, Time[i], Low[i]-30*Point);
ObjectSetText("Cigar"+IntegerToString(i), CharToStr(233), 56, "Wingdings", Black);
}

///red arrow down
if (mode[i]>0 &&
High[i]>iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_UPPER,i)+80*Point && Close[i]<iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_UPPER,i) && Close[i+2]<iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_UPPER,i+2)) {mode[i]=-1;
ObjectCreate("Cigar"+IntegerToString(i), OBJ_TEXT, 0, Time[i], High[i]+120*Point);
ObjectSetText("Cigar"+IntegerToString(i), CharToStr(234), 56, "Wingdings", Crimson);
}
///green arrow up
if (i>0 && mode[i]<0 && Low[i]<Low[i+1]+20*Point && Close[i-1]>iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_LOWER,i-1)+10*Point &&
Low[i]<iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_LOWER,i)-80*Point && Close[i]>iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_LOWER,i)-20*Point && Close[i+2]>iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_LOWER,i+2)) {mode[i]=1;
ObjectCreate("Cigar"+IntegerToString(i), OBJ_TEXT, 0, Time[i], Low[i]-30*Point);
ObjectSetText("Cigar"+IntegerToString(i), CharToStr(233), 56, "Wingdings", DarkGreen);
}