MA_Crossover_Signal3
Download scriptThis tool is designed to help traders identify specific trend-reversal moments by highlighting "crossovers" between two different moving averages on a trading chart. While moving averages are often used to smooth out price action and show general trends, this script focuses specifically on the exact point where those trends intersect, making it easier for users to spot entry or exit signals.
Core Functionality
The logic operates by comparing two distinct moving average lines: a Faster moving average (which reacts quickly to price changes) and a Slower moving average (which follows the broader trend). The script monitors these two lines simultaneously to detect three specific states:
- The Current State: Where the averages are positioned right now.
- The Previous State: Where the averages were positioned one candle ago.
- The Future Context: A secondary check on the surrounding data points to ensure the crossover is a valid intersection rather than a momentary flicker in price.
How the Signals Work
Instead of drawing continuous lines that might clutter your screen, this script places visual markers (arrows) at the precise moment a crossover occurs:
- Bullish Signal (Upward Cross): The script looks for a situation where the Faster moving average was previously below the Slower moving average but has now moved above it. When this happens, a green marker is placed just below the price candle.
- Bearish Signal (Downward Cross): Conversely, if the Faster moving average moves from above the Slower moving average to below it, the script identifies a downward shift and places a red marker just above the price candle.
Smart Positioning
To ensure these markers are easy to read, the script calculates the "Range" of the market—essentially measuring the typical volatility of the recent candles. It then uses this measurement to offset the arrows slightly so they do not sit directly on top of the candles, ensuring they remain clearly visible even during periods of high price movement.
Key Customization
Users have the flexibility to define the personality of these signals by adjusting several settings:
- Moving Average Type: You can choose between different mathematical smoothing methods (such as Simple, Exponential, Smoothed, or Linear Weighted).
- Time Periods: You can set the specific "speeds" for both the Fast and Slow averages to suit different trading styles (e.g., scalping vs. long-term swing trading).
//+------------------------------------------------------------------+
//| 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 = 0; //0=sma, 1=ema, 2=smma, 3=lwma
extern int FasterMA = 10;
extern int SlowerMode = 0; //0=sma, 1=ema, 2=smma, 3=lwma
extern int SlowerMA = 30;
//+------------------------------------------------------------------+
//| 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