MTF Waddah_Attar_Explosion

Download script
MTF Waddah_Attar_Explosion

This technical indicator is designed to analyze market momentum and volatility by monitoring the relationship between price trends and "explosive" movements. It functions as a sophisticated filtering system that helps traders identify when a market is moving with significant strength versus when it is merely fluctuating.

Core Analytical Components

The logic relies on three primary data streams to interpret the market:

  • Trend Analysis: The script uses a specific momentum calculation (MACD) to determine the direction and velocity of the price. It looks at the change in trend over multiple bars to ensure the move is sustained rather than a temporary spike.
  • Explosion Dynamics: By utilizing Bollinger Bands, the script measures the "expansion" of the market. It calculates the difference between the upper and lower boundaries to gauge how much the price is stretching.
  • Dead Zone Filtering: To avoid "market noise"—small, insignificant price movements—the logic incorporates a "Dead Zone" threshold. Signals are only triggered if the movement exceeds a specific minimum distance, ensuring that only meaningful price action is highlighted.

How the Logic Determines Signals

The script evaluates these components simultaneously to trigger four types of notifications:

1. Buy Opportunities (Long) A Buy signal is generated when several conditions align:

  • The trend is moving upward with increasing momentum.
  • The "explosion" (volatility) is expanding significantly compared to the previous period.
  • The strength of both the trend and the explosion exceeds specific user-defined power thresholds.

2. Sell Opportunities (Short) A Sell signal is generated under similar conditions but in the opposite direction:

  • The trend is moving downward with increasing intensity.
  • The volatility expansion shows a clear "explosion" toward the downside.
  • The momentum and explosion powers meet the minimum requirements to confirm a strong move.

3. Exit Signals Beyond entering trades, the script contains logic to identify potential exit points:

  • Exit Buy: Triggered when the upward trend begins to weaken or lose its explosive expansion.
  • Exit Sell: Triggered when the downward momentum starts to decelerate or the "explosion" loses its intensity.

User Control and Feedback

The logic is highly customizable, allowing users to define the sensitivity of the indicators, the specific power levels required for a signal to be valid, and the specific timeframes for analysis. It also includes a notification system that can either provide a pop-up alert on the screen or log the data into the system's internal history for later review.

Indicators Used
MACD HistogramBollinger bands indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
15 Views
0 Downloads
0 Favorites
MTF Waddah_Attar_Explosion
//+------------------------------------------------------------------+
//|                                       Waddah_Attar_Explosion.mq4 |
//|                              Copyright © 2006, Eng. Waddah Attar |
//|                                          waddahattar@hotmail.com |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2006, Eng. Waddah Attar"
#property  link      "waddahattar@hotmail.com"
//----
#property  indicator_separate_window
#property  indicator_buffers 4
//----
#property  indicator_color1  Green
#property  indicator_color2  Red
#property  indicator_color3  Gold
#property  indicator_color4  DodgerBlue
#property  indicator_minimum 0.0
#property indicator_width1 3
#property indicator_width2 3
#property indicator_width3 1
//----
extern int Minutes=0;
extern int  Sensetive=150;
extern int  DeadZonePip=15;
extern int  ExplosionPower=15;
extern int  TrendPower=15;
extern bool AlertWindow=false;
extern int  AlertCount=2;
extern bool AlertLong=false;
extern bool AlertShort=false;
extern bool AlertExitLong=false;
extern bool AlertExitShort=false;
//----
double   ind_buffer1[];
double   ind_buffer2[];
double   ind_buffer3[];
double   ind_buffer4[];
//----
int LastTime1=1;
int LastTime2=1;
int LastTime3=1;
int LastTime4=1;
int Status=0, PrevStatus=-1;
double bask, bbid;
string TimeFrameStr;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID);
   SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID);
   SetIndexStyle(2, DRAW_LINE, STYLE_SOLID);
   SetIndexStyle(3, DRAW_LINE, STYLE_SOLID);
//----   
   SetIndexBuffer(0, ind_buffer1);
   SetIndexBuffer(1, ind_buffer2);
   SetIndexBuffer(2, ind_buffer3);
   SetIndexBuffer(3, ind_buffer4);
//----
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   switch(Minutes)
     {
      case 1 : TimeFrameStr=" Period M1 "; break;
      case 5 : TimeFrameStr=" Period M5 "; break;
      case 15 : TimeFrameStr=" Period M15 "; break;
      case 30 : TimeFrameStr=" Period M30 "; break;
      case 60 : TimeFrameStr=" Period H1 "; break;
      case 240 : TimeFrameStr=" Period H4 "; break;
      case 1440 : TimeFrameStr=" Period D1 "; break;
      case 10080 : TimeFrameStr=" Period W1 "; break;
      case 43200 : TimeFrameStr=" Period MN1 "; break;
      default : TimeFrameStr=" Current TimeFrame "; Minutes=0;
     }
//----   
   IndicatorShortName("Wad Att Exp: ("+TimeFrameStr+")[S-" + Sensetive +"][DZ-"+ DeadZonePip +"][EP-"+ ExplosionPower +"][TP-"+ TrendPower +"])");
   Comment("copyright waddahwttar@hotmail.com");
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double Trend1, Trend2, Explo1, Explo2, Dead;
   double pwrt, pwre;
   int    limit, i, counted_bars=IndicatorCounted();
//----
   if(counted_bars < 0)
      return(-1);
//----
   if(counted_bars > 0)
      counted_bars--;
   //limit = Bars - counted_bars;
   limit=Bars-counted_bars+Minutes/Period();
//----
   for(i=limit - 1; i>=0; i--)
     {
      Trend1=(iMACD(NULL, Minutes, 20, 40, 9, PRICE_CLOSE, MODE_MAIN, i) -
                iMACD(NULL, Minutes, 20, 40, 9, PRICE_CLOSE, MODE_MAIN, i + 1))*Sensetive;
      Trend2=(iMACD(NULL, Minutes, 20, 40, 9, PRICE_CLOSE, MODE_MAIN, i + 2) -
                iMACD(NULL, Minutes, 20, 40, 9, PRICE_CLOSE, MODE_MAIN, i + 3))*Sensetive;
      Explo1=(iBands(NULL, Minutes, 20, 2, 0, PRICE_CLOSE, MODE_UPPER, i) -
                iBands(NULL, Minutes, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, i));
      Explo2=(iBands(NULL, Minutes, 20, 2, 0, PRICE_CLOSE, MODE_UPPER, i + 1) -
                iBands(NULL, Minutes, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, i + 1));
      Dead=Point * DeadZonePip;
      ind_buffer1[i]=0;
      ind_buffer2[i]=0;
      ind_buffer3[i]=0;
      ind_buffer4[i]=0;
      if(Trend1>=0)
         ind_buffer1[i]=Trend1;
      if(Trend1 < 0)
         ind_buffer2[i]=(-1*Trend1);
      ind_buffer3[i]=Explo1;
      ind_buffer4[i]=Dead;
      if(i==0)
        {
         if(Trend1 > 0 && Trend1 > Explo1 && Trend1 > Dead &&
            Explo1 > Dead && Explo1 > Explo2 && Trend1 > Trend2 &&
            LastTime1 < AlertCount && AlertLong==true && Ask!=bask)
           {
            pwrt=100*(Trend1 - Trend2)/Trend1;
            pwre=100*(Explo1 - Explo2)/Explo1;
            bask=Ask;
            if(pwre>=ExplosionPower && pwrt>=TrendPower)
              {
               if(AlertWindow==true)
                 {
                  Alert(LastTime1, "- ", Symbol(), " - BUY ", " (",
                        DoubleToStr(bask, Digits) , ") Trend PWR " ,
                        DoubleToStr(pwrt,0), " - Exp PWR ", DoubleToStr(pwre, 0));
                 }
               else
                 {
                  Print(LastTime1, "- ", Symbol(), " - BUY ", " (",
                        DoubleToStr(bask, Digits), ") Trend PWR ",
                        DoubleToStr(pwrt, 0), " - Exp PWR ", DoubleToStr(pwre, 0));
                 }
               LastTime1++;
              }
            Status=1;
           }
         if(Trend1 < 0 && MathAbs(Trend1) > Explo1 && MathAbs(Trend1) > Dead &&
            Explo1 > Dead && Explo1 > Explo2 && MathAbs(Trend1) > MathAbs(Trend2) &&
            LastTime2 < AlertCount && AlertShort==true && Bid!=bbid)
           {
            pwrt=100*(MathAbs(Trend1) - MathAbs(Trend2))/MathAbs(Trend1);
            pwre=100*(Explo1 - Explo2)/Explo1;
            bbid=Bid;
            if(pwre>=ExplosionPower && pwrt>=TrendPower)
              {
               if(AlertWindow==true)
                 {
                  Alert(LastTime2, "- ", Symbol(), " - SELL ", " (",
                        DoubleToStr(bbid, Digits), ") Trend PWR ",
                        DoubleToStr(pwrt,0), " - Exp PWR ", DoubleToStr(pwre, 0));
                 }
               else
                 {
                  Print(LastTime2, "- ", Symbol(), " - SELL ", " (",
                        DoubleToStr(bbid, Digits), ") Trend PWR " ,
                        DoubleToStr(pwrt, 0), " - Exp PWR ", DoubleToStr(pwre, 0));
                 }
               LastTime2++;
              }
            Status=2;
           }
         if(Trend1 > 0 && Trend1 < Explo1 && Trend1 < Trend2 && Trend2 > Explo2 &&
            Trend1 > Dead && Explo1 > Dead && LastTime3<=AlertCount &&
            AlertExitLong==true && Bid!=bbid)
           {
            bbid=Bid;
            if(AlertWindow==true)
              {
               Alert(LastTime3, "- ", Symbol(), " - Exit BUY ", " ",
                     DoubleToStr(bbid, Digits));
              }
            else
              {
               Print(LastTime3, "- ", Symbol(), " - Exit BUY ", " ",
                     DoubleToStr(bbid, Digits));
              }
            Status=3;
            LastTime3++;
           }
         if(Trend1 < 0 && MathAbs(Trend1) < Explo1 &&
            MathAbs(Trend1) < MathAbs(Trend2) && MathAbs(Trend2) > Explo2 &&
            Trend1 > Dead && Explo1 > Dead && LastTime4<=AlertCount &&
            AlertExitShort==true && Ask!=bask)
           {
            bask=Ask;
            if(AlertWindow==true)
              {
               Alert(LastTime4, "- ", Symbol(), " - Exit SELL ", " ",
                     DoubleToStr(bask, Digits));
              }
            else
              {
               Print(LastTime4, "- ", Symbol(), " - Exit SELL ", " ",
                     DoubleToStr(bask, Digits));
              }
            Status=4;
            LastTime4++;
           }
         PrevStatus=Status;
        }
      if(Status!=PrevStatus)
        {
         LastTime1=1;
         LastTime2=1;
         LastTime3=1;
         LastTime4=1;
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+

Comments