Okay, here's a breakdown of what this MetaTrader script does, explained in a way that doesn't require any programming knowledge.
Overall Purpose:
This script is designed to identify potential trading opportunities (buying or selling) based on a custom trading strategy. It looks for specific patterns in price movements to signal possible "explosions" or significant shifts in the market. It also has functionality to alert the user.
Key Concepts:
-
Timeframes: The script can analyze data on different timeframes. Imagine looking at a stock chart showing daily prices versus one showing prices every hour. The script can do that.
-
Indicators: The script uses pre-built calculations, known as indicators, to understand price trends and volatility. Think of these as tools that highlight certain aspects of the price data. Specifically, it uses "MACD" and "Bollinger Bands".
- MACD: This indicator helps identify the direction and strength of a trend. It's like a speedometer for price changes.
- Bollinger Bands: These bands measure how much the price is moving around the average. When the bands widen, it suggests the price is becoming more volatile.
-
Alerts: The script can generate alerts to notify the user when certain conditions are met, indicating a potential trading opportunity. These alerts can pop up on the screen or be displayed as text messages.
How the Script Works - Step-by-Step:
- Setup (Initialization):
- The script starts by setting up its environment. This includes:
- Defining the types of visual elements it will draw on the chart (histograms and lines).
- Specifying the colors and widths of those elements.
- Getting user-defined settings like sensitivity, dead zone, explosion power, and trend power to customize the analysis.
- Determining the timeframe it will analyze (e.g., 5-minute chart, 1-hour chart).
- The script starts by setting up its environment. This includes:
- Data Analysis (Calculation):
- The script retrieves historical price data for the selected timeframe.
- It then calculates the values of the "MACD" and "Bollinger Bands" indicators based on that price data.
- Next, it compares the current indicator values with previous values. The change is multiplied by a Sensetive variable introduced by the creator of this script to increase the change so it's more evident
- It calculates two things based on indicator values:
- Trend: Strength of the current trend.
- Explosion: Volatility in the market.
- It also defines a "Dead Zone", which is a price range where the script ignores signals to avoid false positives.
- Signal Generation (Decision Making):
- The script compares the calculated "Trend" and "Explosion" values to the "Dead Zone" and to user-defined thresholds ("ExplosionPower" and "TrendPower").
- Based on these comparisons, it identifies potential trading opportunities:
- Buy Signal: If the "Trend" is strongly positive, the "Explosion" is high, and both exceed certain thresholds, it suggests a buying opportunity.
- Sell Signal: If the "Trend" is strongly negative, the "Explosion" is high, and both exceed certain thresholds, it suggests a selling opportunity.
- Exit Buy Signal: The Trend is positive but the Explosion is higher and the trend is weakening showing an exit opportunity.
- Exit Sell Signal: The Trend is negative but the Explosion is higher and the trend is weakening showing an exit opportunity.
- Alerting:
- If a buy or sell signal is triggered and alerting is enabled, the script generates an alert.
- The alert message includes information about the symbol (e.g., currency pair), the direction of the signal (buy or sell), the current price, and the power of the trend and explosion.
- The script also keeps track of alerts to prevent sending too many in a short period (controlled by "AlertCount").
- Refresh:
- At the end of the calculation the data is refreshed to the corresponding bar to match with the current timeframe.
User-Defined Settings (Extern Variables):
- Minutes: The timeframe to use for analysis (e.g., 5 minutes, 1 hour). If set to 0, it uses the current chart's timeframe.
- Sensetive: A sensitivity multiplier to amplify the impact of price changes.
- DeadZonePip: The size of the "Dead Zone" in pips (a unit of price measurement). Signals within this range are ignored.
- ExplosionPower: The minimum "Explosion" value required to trigger an alert.
- TrendPower: The minimum "Trend" value required to trigger an alert.
- AlertWindow: Determines whether alerts are displayed in a popup window or in the experts log.
- AlertCount: The maximum number of alerts to generate.
- AlertLong: Enables or disables buy alerts.
- AlertShort: Enables or disables sell alerts.
- AlertExitLong: Enables or disables exit buy alerts.
- AlertExitShort: Enables or disables exit sell alerts.
In Simple Terms:
Imagine the script as a weather forecaster for the market. It uses tools (indicators) to analyze the current conditions (price data) and predict potential storms (price explosions). When it sees a storm brewing, it sends out a warning (alert) to tell you to prepare for a potential trade. You can customize how sensitive the forecaster is, how strong the storm needs to be to trigger a warning, and whether you want to focus on buying opportunities, selling opportunities, or both.
//+------------------------------------------------------------------+
//| 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;
int counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
if(counted_bars==0) limit-=1+Minutes/Period();
//----
ArrayCopySeries(TimeArray,MODE_TIME,Symbol(),Minutes);
for(i=0,y=0;i<limit;i++)
{
if(y<ArraySize(TimeArray)){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
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---