The Four Tops (Outside 3BBs Fractal) and the Loco In Acapulco (professionals dumping longs on that doji).

Now, watch my hand because I’m cheating. A capitulation comes with a major reversal, typically a 100-pip bounce. The driven thrusts can build on each other; see how the second one is outside the 30-BB from the get-go. I would target the lower BB with the shorts since the second thrust brought on a reversal.

#property copyright "Copyright © 2025, Macdulio"
#property link "https://forexfore.blog"
#property description "V1.0"
#property description "Market Speed"
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 clrDarkGreen
#property indicator_color3 clrMagenta
#property indicator_color2 clrCrimson
#property indicator_level1 10
#property indicator_level2 20
#property indicator_level3 30
#property indicator_level4 40
#property indicator_level5 50
#property indicator_level6 60
#property indicator_levelcolor clrBlue
#property indicator_levelstyle STYLE_DOT
double E44[], ExtMovingBuffer[];
double ExtLowerBuffer[];
extern double valuemonitor = 24;
extern int lookback = 800;
extern int indicator_window = 3;
extern int sample = 200;
extern double FSize=32;
double upper[], middle[], lower[];
double avg;
double FMax = FSize*6/5;
double iHi4[];
double iLo4[];
string symbol = Symbol();
double ExtATRBuffer[],ExtATRBuffer2[],ExtATRBuffer3[],ExtATRBuffer4[],ExtATRBuffer5[],stoch60[];
double corr[],corr2[], RSI2[], squeeze[];
int init(){
SetIndexBuffer(0,ExtATRBuffer);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,4,indicator_color1);
SetIndexBuffer(1,ExtATRBuffer2);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,4,indicator_color2);
SetIndexBuffer(2,ExtATRBuffer3);
SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,4,indicator_color3);
return(0);
}
//+------------------------------------------------------------------+
//| Average True Range |
//+------------------------------------------------------------------+
int start(){
ArrayResize(ExtATRBuffer, Bars);
ArrayInitialize(ExtATRBuffer, 0);
ArrayResize(ExtATRBuffer2, Bars);
ArrayInitialize(ExtATRBuffer2, 0);
ArrayResize(ExtATRBuffer3, Bars);
ArrayInitialize(ExtATRBuffer3, EMPTY_VALUE);
ArrayResize(ExtATRBuffer4, Bars);
ArrayInitialize(ExtATRBuffer4, EMPTY_VALUE);
ArrayResize(ExtATRBuffer5, Bars);
ArrayInitialize(ExtATRBuffer5, EMPTY_VALUE);
ArrayResize(ExtMovingBuffer, Bars);
ArrayInitialize(ExtMovingBuffer,0);
ArrayResize(ExtLowerBuffer, Bars);
ArrayInitialize(ExtLowerBuffer,0);
ArrayResize(E44, Bars);
ArrayInitialize(E44,EMPTY_VALUE);
ArrayResize(iHi4, Bars);
ArrayInitialize(iHi4, EMPTY_VALUE);
ArrayResize(iLo4, Bars);
ArrayInitialize(iLo4, EMPTY_VALUE);
ArrayResize(stoch60, Bars);
ArrayInitialize(stoch60, EMPTY_VALUE);
ArrayResize(RSI2, Bars);
ArrayInitialize(RSI2, EMPTY_VALUE);
ArrayResize(corr, Bars);
ArrayInitialize(corr, EMPTY_VALUE);
ArrayResize(corr2, Bars);
ArrayInitialize(corr2, EMPTY_VALUE);
ArrayResize(middle, Bars);
ArrayInitialize(middle, EMPTY_VALUE);
ArrayResize(squeeze, Bars);
ArrayInitialize(squeeze, 0);
ArrayResize(upper, Bars);
ArrayInitialize(upper, EMPTY_VALUE);
ArrayResize(lower, Bars);
ArrayInitialize(lower, EMPTY_VALUE);
int i,j;
double std;
for (i=0; i<lookback; i++){
E44[i]=iMA(symbol,0,44,0,MODE_EMA, PRICE_MEDIAN,i);
for (j=i; j<i+20; j++)
ExtMovingBuffer[i]=ExtMovingBuffer[i]+E44[j];
ExtMovingBuffer[i]=ExtMovingBuffer[i]/20;
}
deletetxt1("God");
for (i=lookback-1; i>=0; i--)
{
std = iStdDevOnArray(ExtMovingBuffer,0,10,0,0,i);
ExtLowerBuffer[i]=ExtMovingBuffer[i]-std;
}
for(i=Bars-100; i>=0; i--){
if (Period()==240) iHi4[i]=iMA(NULL,0,52,0,MODE_EMA, PRICE_HIGH,i);
else if (Period()==30) iHi4[i]=iMA(NULL,0,414,0,MODE_EMA, PRICE_HIGH,i);
else if (Period()==60) iHi4[i]=iMA(NULL,0,207,0,MODE_EMA, PRICE_HIGH,i);
if (Period()==240) iLo4[i]=iMA(NULL,0,52,0,MODE_EMA, PRICE_LOW,i);
else if (Period()==30) iLo4[i]=iMA(NULL,0,414,0,MODE_EMA, PRICE_LOW,i);
else if (Period()==60) iLo4[i]=iMA(NULL,0,207,0,MODE_EMA, PRICE_LOW,i);
stoch60[i]=iStochastic(symbol,60,60,3,3,MODE_SMA,0,MODE_SIGNAL,i);
RSI2[i]=iRSI(symbol,0,2,PRICE_MEDIAN,i);
}
deletetxt1("Pepper");
deletetxt1("Panace");
deletetxt1("PLOT");
deletetxt1("LINE");
for(i=lookback; i>=0; i--){
middle[i] = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_TYPICAL, i);
avg = findAvg(20, i);
upper[i] = middle[i] + avg;
lower[i] = middle[i] - avg;
if (High[i]>(iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_UPPER,i)-50*Point)) {ExtATRBuffer[i]=(High[i]-iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_UPPER,i))*10000+10;
if (ExtATRBuffer[i]>valuemonitor) ExtATRBuffer3[i]=ExtATRBuffer[i];
}
if (Low[i]<iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_LOWER,i)+50*Point) {ExtATRBuffer2[i]=(iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_LOWER,i)-Low[i])*10000+10;
if (ExtATRBuffer2[i]>valuemonitor) ExtATRBuffer3[i]=ExtATRBuffer2[i];
}
}
deletetxt1("AveriD");
deletetxt1("AverD");
int twodigits=0;
if (ExtATRBuffer[0]!=0) twodigits = NormalizeDouble((High[0]-iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_UPPER,0))*10000+10,0);
if (ExtATRBuffer2[0]!=0) twodigits = NormalizeDouble((iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_LOWER,0)-Low[0])*10000+10,0);
if (ExtATRBuffer[0]!=EMPTY_VALUE && twodigits>19) {
ObjectCreate("AverD",OBJ_LABEL,indicator_window, 0,0);
ObjectSet("AverD",OBJPROP_CORNER,2);
ObjectSet("AverD",OBJPROP_XDISTANCE,20);
ObjectSet("AverD",OBJPROP_YDISTANCE,27);
ObjectSetText("AverD","Abnormal",40,"Impact",DeepPink);
}
if (ExtATRBuffer2[0]!=EMPTY_VALUE && twodigits>15) {
ObjectCreate("AverD",OBJ_LABEL,indicator_window, 0,0);
ObjectSet("AverD",OBJPROP_CORNER,2);
ObjectSet("AverD",OBJPROP_XDISTANCE,20);
ObjectSet("AverD",OBJPROP_YDISTANCE,27);
ObjectSetText("AverD","Abnormal",40,"Impact",DeepPink);
}
int tens = round(twodigits/10);
int ones = twodigits-tens*10;
string stens, sones;
switch(tens)
{
case 1: stens=CharToStr(140);
break;
case 2: stens=CharToStr(141);
break;
case 3: stens=CharToStr(142);
break;
case 4: stens=CharToStr(143);
break;
case 5: stens=CharToStr(144);
break;
case 6: stens=CharToStr(145);
break;
case 7: stens=CharToStr(146);
break;
case 8: stens=CharToStr(147);
break;
case 9: stens=CharToStr(148);
break;
default: stens=CharToStr(139);
break;
}
//deletetxt1("AverD");
switch(ones)
{
case 1: sones=CharToStr(140);
break;
case 2: sones=CharToStr(141);
break;
case 3: sones=CharToStr(142);
break;
case 4: sones=CharToStr(143);
break;
case 5: sones=CharToStr(144);
break;
case 6: sones=CharToStr(145);
break;
case 7: sones=CharToStr(146);
break;
case 8: sones=CharToStr(147);
break;
case 9: sones=CharToStr(148);
break;
default: sones=CharToStr(139);
break;
}
string jointstring=stens+sones;
ObjectCreate("AveriD",OBJ_LABEL,indicator_window, 0,0);
ObjectSet("AveriD",OBJPROP_CORNER,3);
ObjectSet("AveriD",OBJPROP_XDISTANCE,20);
ObjectSet("AveriD",OBJPROP_YDISTANCE,27);
ObjectSetText("AveriD",jointstring,40,"Wingdings",DimGray);
if (twodigits>15) ObjectSetText("AveriD",jointstring,40,"Wingdings",Tomato);
if (twodigits>19) ObjectSetText("AveriD",jointstring,40,"Wingdings",DeepPink);
return(0);
}
//+------------------------------------------------------------------+
void deletetxt1(string text){
for(int iObj=ObjectsTotal()-1; iObj >= 0; iObj--){
string on = ObjectName(iObj);
if(StringFind(on, text) == 0) ObjectDelete(on);
} }
double findAvg(int period, int shift) {
double sum=0;
for (int x=shift;x<(shift+period);x++) {
sum += High[x]-Low[x];
}
sum = sum/period;
return (sum);
}