El Capitan

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);
   }