dzani9_Elliotwave_confirmation
Download scriptThis tool is designed to provide visual confirmation for price trends by identifying specific "crossover" moments between two moving averages. It acts as a signaling system that helps traders spot when momentum is shifting from one direction to another.
How it Works
The logic operates by monitoring two different mathematical averages of the market price (a "Faster" average and a "Slower" average). By comparing these two lines, the script identifies the exact moment they intersect:
- Trend Shifts: The tool looks for the precise point where the faster moving average moves from being below the slower average to above it (or vice versa).
- Momentum Confirmation: To ensure the signal is reliable and not just a momentary flicker, the script validates the movement by checking the positions of the averages before and after the current price point. It confirms that a definitive "cross" has occurred.
Visual Signals
When the logic detects these shifts, it places visual markers directly on your chart:
- Upward Signal: When the faster average crosses above the slower average, indicating potential upward momentum, a green arrow appears below the price candles.
- Downward Signal: When the faster average crosses below the slower average, indicating potential downward momentum, a red arrow appears above the price candles.
Smart Positioning
The script doesn't just place these markers randomly; it calculates the "range" (the typical distance between high and low prices over the last 10 bars). It uses this measurement to ensure that the arrows are displayed at a consistent, readable distance from the candles, keeping your chart clean and easy to interpret.
//+------------------------------------------------------------------+
//| dzani9_Elliotwave_confirmation.mq4 |
//| dzani9@yahoo.co.uk |
//| |
//+------------------------------------------------------------------+
#property copyright "dzani9@yahoo.co.uk"
#property link ""
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 SpringGreen
#property indicator_color2 Red
double CrossUp[];
double CrossDown[];
extern int FasterEMA = 5;
extern int SlowerEMA = 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 fasterEMAnow, slowerEMAnow, fasterEMAprevious, slowerEMAprevious, fasterEMAafter, slowerEMAafter;
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;
fasterEMAnow = iMA(NULL, 0, FasterEMA, 0, MODE_LWMA, PRICE_CLOSE, i);
fasterEMAprevious = iMA(NULL, 0, FasterEMA, 0, MODE_LWMA, PRICE_CLOSE, i+1);
fasterEMAafter = iMA(NULL, 0, FasterEMA, 0, MODE_LWMA, PRICE_CLOSE, i-1);
slowerEMAnow = iMA(NULL, 0, SlowerEMA, 0, MODE_LWMA, PRICE_CLOSE, i);
slowerEMAprevious = iMA(NULL, 0, SlowerEMA, 0, MODE_LWMA, PRICE_CLOSE, i+1);
slowerEMAafter = iMA(NULL, 0, SlowerEMA, 0, MODE_LWMA, PRICE_CLOSE, i-1);
if ((fasterEMAnow > slowerEMAnow) && (fasterEMAprevious < slowerEMAprevious) && (fasterEMAafter > slowerEMAafter)) {
CrossUp[i] = Low[i] - Range*0.5;
}
else if ((fasterEMAnow < slowerEMAnow) && (fasterEMAprevious > slowerEMAprevious) && (fasterEMAafter < slowerEMAafter)) {
CrossDown[i] = High[i] + Range*0.5;
}
}
return(0);
}
Comments