MA_Crossover_Signal3_v1
Download scriptThis tool is designed to simplify technical analysis by automatically identifying specific moments when two moving averages intersect on your trading chart. Rather than forcing you to squint at lines that might overlap or get obscured by price candles, this script translates those movements into clear visual signals.
How the Logic Works
The script operates by monitoring two different "Moving Averages" (lines that track the average price over a specific period). You can customize these to be "Fast" or "Slow," which represent different speeds of market momentum.
1. The Detection Mechanism The core logic looks for a definitive "crossover." It doesn't just look at where the lines are right now; it looks at the history immediately preceding and following the current price point. Specifically, it checks three points in time:
- The Past: Where were the lines before the current candle?
- The Present: Where are the lines on the current candle?
- The Immediate Future/Context: It validates the trend to ensure a clean transition has occurred.
2. Identifying Upward Trends (Buy Signals) The script triggers a visual signal when the "Fast" average moves from below the "Slow" average to above it. This typically suggests that short-term momentum is starting to outweigh the longer-term trend, potentially indicating an upward move.
3. Identifying Downward Trends (Sell Signals) Conversely, it triggers a signal when the "Fast" average drops from above the "Slow" average to below it. This indicates that short-term momentum is weakening relative to the long-term average, often signaling a potential downward move.
4. Visual Placement To ensure the signals are easy to read, the script calculates the "range" (the distance between the highs and lows) of the recent candles. It then places the visual markers:
- Upward signals are placed slightly below the candle's low price.
- Downward signals are placed slightly above the candle's high price.
By using this method, the script removes the "noise" of the moving average lines themselves and highlights only the specific moments where a trend shift is detected, making it easier to spot entries at a glance.
//+------------------------------------------------------------------+
//| EMA-Crossover_Signal.mq4 |
//| Copyright © 2005, Jason Robinson (jnrtrading) |
//| http://www.jnrtading.co.uk |
//+------------------------------------------------------------------+
/*
+------------------------------------------------------------------+
| Allows you to enter two ema periods and it will then show you at |
| Which point they crossed over. It is more usful on the shorter |
| periods that get obscured by the bars / candlesticks and when |
| the zoom level is out. Also allows you then to remove the emas |
| from the chart. (emas are initially set at 5 and 6) |
+------------------------------------------------------------------+
*/
#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 LawnGreen
#property indicator_color2 Red
double CrossUp[];
double CrossDown[];
extern int FasterMode = 1; //0=sma, 1=ema, 2=smma, 3=lwma
extern int FasterMA = 5;
extern int SlowerMode = 1; //0=sma, 1=ema, 2=smma, 3=lwma
extern int SlowerMA = 6;
//+------------------------------------------------------------------+
//| 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;
double fasterMAnow, slowerMAnow, fasterMAprevious, slowerMAprevious, fasterMAafter, slowerMAafter;
double Range, AvgRange;
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, 0, FasterMode, PRICE_CLOSE, i);
fasterMAprevious = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i+1);
fasterMAafter = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i-1);
slowerMAnow = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE, i);
slowerMAprevious = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE, i+1);
slowerMAafter = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE, i-1);
if ((fasterMAnow > slowerMAnow) && (fasterMAprevious < slowerMAprevious) && (fasterMAafter > slowerMAafter)) {
CrossUp[i] = Low[i] - Range*0.5;
}
else if ((fasterMAnow < slowerMAnow) && (fasterMAprevious > slowerMAprevious) && (fasterMAafter < slowerMAafter)) {
CrossDown[i] = High[i] + Range*0.5;
}
}
return(0);
}
Comments