MTF_Waddah_Attar_ExplosionSA
Download scriptThis script is designed to analyze market trends and volatility on the MetaTrader platform, providing users with visual signals and automated alerts for potential trading opportunities. It essentially acts as a "momentum detector" that filters out minor market noise to identify significant price movements.
Core Functionality
The logic operates by combining two primary technical indicators:
- Trend Analysis: It monitors the direction and strength of the price movement.
- Explosion Analysis: It measures the intensity or "spread" of the market activity.
By comparing these two factors, the script determines if a price move is an actual breakout (an "explosion") or simply a standard trend.
Key Logic Components
- Multi-Timeframe Awareness: One of the sophisticated features of this tool is its ability to look at higher timeframes while you are viewing a lower one. For example, it can analyze the 1-hour trend while you are looking at a 5-minute chart, helping to ensure that your trades align with the larger market direction.
- Trend and Explosion Filtering: The script calculates specific "Power" levels for both trends and explosions. It won't trigger an alert unless the movement meets a minimum threshold of strength (defined by the Explosion Power and Trend Power settings). This prevents the user from receiving "false alarms" during periods of low activity.
- The "Dead Zone": To further refine accuracy, the logic incorporates a "Dead Zone." This is a small buffer that ignores very tiny price fluctuations, ensuring the script only reacts to meaningful movements.
Signal Types
The script identifies four distinct types of market scenarios:
- Buy Signals: Triggered when the trend is strongly upward, the explosion power is increasing, and both exceed the required thresholds.
- Sell Signals: Triggered when the trend is strongly downward and the expansion of price movement meets the necessary intensity.
- Exit Buy Alerts: These are designed to notify the user when an upward trend is losing its momentum or starting to weaken, suggesting it might be time to take profits or close a position.
- Exit Sell Alerts: Similar to the buy exit, these notify the user when a downward move loses its strength, indicating a potential reversal or exhaustion of the move.
Visuals and Notifications
- Visual Indicators: The script plots histograms and lines on a separate window in your workspace, allowing you to see the trend and explosion data visually.
- Automated Alerts: Depending on the user's preference, the script can produce "Pop-up" alerts on the screen or "Print" messages in the background log. It tracks how many signals have been sent to prevent spamming the user with repeated notifications for the same move.
- Dynamic Syncing: The code includes a specific mechanism to ensure that when viewing higher timeframes, the visual data remains aligned and consistent across the current chart.
//+------------------------------------------------------------------+
//| MTF CJA Alert MTF_Waddah_Attar_ExplosionSA M2.mq4 ik|
//| standalone Copyright © 2006, MetaQuotes Software Corp. |
//| fxTSD.com http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
//+------------------------------------------------------------------+
//| 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 Aqua
#property indicator_minimum 0.0
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 1
#property indicator_width4 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=20;
extern bool AlertLong=true;
extern bool AlertShort=true;
extern bool AlertExitLong=true;
extern bool AlertExitShort=true;
extern string note_TF_Minutes="5,15,30,60H1,240H4,1440D1,10080W1,43200MN1";
//----
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);
//----
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;
}
//----
if (Minutes<=Period()) Minutes=Period();
IndicatorShortName("WadAttExpl:|"+TimeFrameStr+"|[S-" + Sensetive +"][DZ-"+ DeadZonePip +"][EP-"+ ExplosionPower +"][TrP-"+ TrendPower +"])");
// Comment("copyright waddahwttar@hotmail.com");
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
datetime TimeArray[];
double Trend1, Trend2, Explo1, Explo2, Dead;
double pwrt, pwre;
int limit, i, y=0,counted_bars=IndicatorCounted();
//----
ArrayCopySeries(TimeArray,MODE_TIME,Symbol(),Minutes);
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--)
for(i=0,y=0;i<limit;i++)
{
if (Time[i]<TimeArray[y]) y++;
Trend1=(iMACD(NULL, Minutes, 20, 40, 9, PRICE_CLOSE, MODE_MAIN, y) -
iMACD(NULL, Minutes, 20, 40, 9, PRICE_CLOSE, MODE_MAIN, y + 1))*Sensetive;
Trend2=(iMACD(NULL, Minutes, 20, 40, 9, PRICE_CLOSE, MODE_MAIN, y + 2) -
iMACD(NULL, Minutes, 20, 40, 9, PRICE_CLOSE, MODE_MAIN, y + 3))*Sensetive;
Explo1=(iBands(NULL, Minutes, 20, 2, 0, PRICE_CLOSE, MODE_UPPER, y) -
iBands(NULL, Minutes, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, y));
Explo2=(iBands(NULL, Minutes, 20, 2, 0, PRICE_CLOSE, MODE_UPPER, y + 1) -
iBands(NULL, Minutes, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, y + 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("WAE",LastTime1, "- ", Symbol(), " - BUY ", " (",
DoubleToStr(bask, Digits) , ") Trend PWR " ,
DoubleToStr(pwrt,0), " - Exp PWR ", DoubleToStr(pwre, 0));
}
else
{
Print("WAE",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("WAE",LastTime2, "- ", Symbol(), " - SELL ", " (",
DoubleToStr(bbid, Digits), ") Trend PWR ",
DoubleToStr(pwrt,0), " - Exp PWR ", DoubleToStr(pwre, 0));
}
else
{
Print("WAE",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("WAE",LastTime3, "- ", Symbol(), " - Exit BUY ", " ",
DoubleToStr(bbid, Digits));
}
else
{
Print("WAE",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("WAE",LastTime4, "- ", Symbol(), " - Exit SELL ", " ",
DoubleToStr(bask, Digits));
}
else
{
Print("WAE",LastTime4, "- ", Symbol(), " - Exit SELL ", " ",
DoubleToStr(bask, Digits));
}
Status=4;
LastTime4++;
}
PrevStatus=Status;
}
if(Status!=PrevStatus)
{
LastTime1=1;
LastTime2=1;
LastTime3=1;
LastTime4=1;
}
}
//---- Refresh buffers +++++++++++++++++++++++++ Raff
if (Minutes>Period())
{
int PerINT=Minutes/Period()+1;
datetime TimeArr[]; ArrayResize(TimeArr,PerINT);
ArrayCopySeries(TimeArr,MODE_TIME,Symbol(),Period());
for(i=0;i<PerINT+1;i++)
{
if (TimeArr[i]>=TimeArray[0])
{
/********************************************************
Refresh buffers: buffer[i] = buffer[0];
********************************************************/
ind_buffer1[i]=ind_buffer1[0];
ind_buffer2[i]=ind_buffer2[0];
ind_buffer3[i]=ind_buffer3[0];
ind_buffer4[i]=ind_buffer4[0];
}
}
}
//++++++++++++++++++++++++++++++++++++++++ upgrade by Raff
return(0);
}
//+------------------------------------------------------------------+
Comments