MTF_Waddah_Attar_ExplosionSA

Download script
Author: Copyright � 2006, MetaQuotes Software Corp.
MTF_Waddah_Attar_ExplosionSA

This 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:

  1. Trend Analysis: It monitors the direction and strength of the price movement.
  2. 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:

  1. Buy Signals: Triggered when the trend is strongly upward, the explosion power is increasing, and both exceed the required thresholds.
  2. Sell Signals: Triggered when the trend is strongly downward and the expansion of price movement meets the necessary intensity.
  3. 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.
  4. 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.
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_ExplosionSA
//+------------------------------------------------------------------+
//| 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