3ma_alertidge
Download scriptThis script is designed as a technical analysis tool for the MetaTrader platform, specifically created to identify significant trend reversals by monitoring the interaction between three different Moving Averages (MA). By analyzing these three distinct layers of price data, the tool helps traders spot "crossovers"—moments when the momentum of the market shifts from one direction to another.
How the Logic Works
The core logic relies on comparing three different moving averages simultaneously: a Faster average, a Medium average, and a Slower average. Each represents a different time horizon of price action.
To determine a valid signal, the script looks for a specific "alignment" rather than just a single line crossing another. It validates signals based on two primary conditions:
1. Identifying an Upward Trend (Buy Signal)
The script identifies a potential upward move when:
- The Primary Cross: The Faster Moving Average crosses from below to above the Slower Moving Average.
- Confirmation: To ensure this isn't just a temporary "fake out," the tool also checks the Medium Moving Average. A signal is triggered if either the Faster MA or the Medium MA has successfully crossed over the Slower MA and remains positioned above it.
2. Identifying a Downward Trend (Sell Signal)
Conversely, the script identifies a potential downward move when:
- The Primary Cross: The Faster Moving Average crosses from above to below the Slower Moving Average.
- Confirmation: Similar to the upward logic, it validates this by ensuring that either the Faster MA or the Medium MA is also positioned below the Slower MA.
Dynamic Visuals and Alerts
The script provides several layers of feedback for the user:
- Visual Markers: Instead of just drawing lines, the script places specific visual arrows on your chart at the exact moment these crossover conditions are met. It calculates the "Range" (the volatility) of recent price candles to ensure these arrows are placed at a professional distance from the price bars, making them easy to see.
- Real-Time Alerts: When a valid crossover occurs, the tool provides immediate notifications. If enabled in the settings, it will trigger a sound alert and display a pop-up notification on your screen showing the current time of the signal.
- Email Notifications: The logic is also equipped to send an automated email alert, notifying you of the trend change even if you are not currently looking at your trading terminal.
Summary for the User
Essentially, this tool acts as a "trend filter." It waits for the shorter-term price momentum (Faster/Medium) to break through the longer-term price baseline (Slower). By requiring multiple averages to align, it aims to filter out market "noise" and highlight more significant shifts in market direction.
//+--------------------------------------------------------------------------+
//| 3 MA Cross w_Alert v2.mq4 |
//| Copyright © 2005, Jason Robinson (jnrtrading) |
//| http://www.jnrtading.co.uk |
//| 3 ma conversion and Alert , David Honeywell , transport.david@gmail.com |
//| http://finance.groups.yahoo.com/group/MetaTrader_Experts_and_Indicators/ |
//+--------------------------------------------------------------------------+
/*
+-------------------------------------------------------------------------------+
| Allows you to enter 3 ma periods and it will then show you and alert you at |
| which point the 2 faster ma's "OPEN" are both above or below the Slowest ma . |
+-------------------------------------------------------------------------------+
*/
#property copyright "Copyright © 2005, Jason Robinson (jnrtrading)"
#property link "http://www.jnrtrading.co.uk"
//----
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Green
//----
double CrossUp[];
double CrossDown[];
double prevtime;
double Range, AvgRange;
double fasterMAnow, fasterMAprevious, fasterMAafter;
double mediumMAnow, mediumMAprevious, mediumMAafter;
double slowerMAnow, slowerMAprevious, slowerMAafter;
//----
extern int FasterMA = 5;
extern int FasterShift = -5;
extern int FasterMode = 1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma
extern int MediumMA = 20;
extern int MediumShift = -5;
extern int MediumMode = 1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma
extern int SlowerMA = 34;
extern int SlowerShift = 0;
extern int SlowerMode = 1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma
extern int SoundAlert = 1; // 0 = disabled
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0, DRAW_ARROW, EMPTY);
SetIndexArrow(0, 233);
SetIndexBuffer(0, CrossUp);
SetIndexStyle(1, DRAW_ARROW, EMPTY);
SetIndexArrow(1, 234);
SetIndexBuffer(1, CrossDown);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int limit, i, counter;
int counted_bars=IndicatorCounted();
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
//----
limit=Bars-counted_bars;
//----
for(i = 0; i <= limit; i++)
{
counter=i;
Range=0;
AvgRange=0;
for (counter=i ;counter<=i+9;counter++)
{
AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
}
Range=AvgRange/10;
//----
fasterMAnow = iMA(NULL, 0, FasterMA, FasterShift, FasterMode, PRICE_CLOSE, i+1);
fasterMAprevious = iMA(NULL, 0, FasterMA, FasterShift, FasterMode, PRICE_CLOSE, i+2);
fasterMAafter = iMA(NULL, 0, FasterMA, FasterShift, FasterMode, PRICE_CLOSE, i-1);
//----
mediumMAnow = iMA(NULL, 0, MediumMA, MediumShift, MediumMode, PRICE_CLOSE, i+1);
mediumMAprevious = iMA(NULL, 0, MediumMA, MediumShift, MediumMode, PRICE_CLOSE, i+2);
mediumMAafter = iMA(NULL, 0, MediumMA, MediumShift, MediumMode, PRICE_CLOSE, i-1);
//----
slowerMAnow = iMA(NULL, 0, SlowerMA, SlowerShift, SlowerMode, PRICE_CLOSE, i+1);
slowerMAprevious = iMA(NULL, 0, SlowerMA, SlowerShift, SlowerMode, PRICE_CLOSE, i+2);
slowerMAafter = iMA(NULL, 0, SlowerMA, SlowerShift, SlowerMode, PRICE_CLOSE, i-1);
//----
if ((fasterMAnow > slowerMAnow &&
fasterMAprevious <= slowerMAprevious &&
fasterMAafter > slowerMAafter &&
mediumMAnow > slowerMAnow )
||
(fasterMAnow > slowerMAnow &&
mediumMAnow > slowerMAnow &&
mediumMAprevious <= slowerMAprevious &&
mediumMAafter > slowerMAafter ))
{
CrossUp[i] = Low[i] - Range*0.5;
}
if ((fasterMAnow < slowerMAnow &&
fasterMAprevious >= slowerMAprevious &&
fasterMAafter < slowerMAafter &&
mediumMAnow < slowerMAnow )
||
(fasterMAnow < slowerMAnow &&
mediumMAnow < slowerMAnow &&
mediumMAprevious >= slowerMAprevious &&
mediumMAafter < slowerMAafter ))
{
CrossDown[i] = High[i] + Range*0.5;
}
}
if ((CrossUp[0] > 20) && (CrossDown[0] > 20)) { prevtime = 0; }
if ((CrossUp[0] == Low[0] - Range*0.5) && (prevtime != Time[0]) && (SoundAlert != 0))
{
prevtime = Time[0];
Alert(Symbol()," 3 MA Cross Up @ Hour ",Hour()," Minute ",Minute());
SendMail("Cross Alert for", Symbol() + Period() + "minutes");
}
if ((CrossDown[0] == High[0] + Range*0.5) && (prevtime != Time[0]) && (SoundAlert != 0))
{
prevtime = Time[0];
Alert(Symbol()," 3 MA Cross Down @ Hour ",Hour()," Minute ",Minute());
SendMail("Cross Alert for", Symbol() + Period() + "minutes");
}
//Comment(" CrossUp[0] ",CrossUp[0]," , CrossDown[0] ",CrossDown[0]," , prevtime ",prevtime);
//Comment("");
return(0);
}
//-------------------------------------------------------+
Comments