MTF Waddah_Attar_Explosion
Download scriptThis 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.
//+------------------------------------------------------------------+
//| 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