This custom technical indicator is designed to analyze market momentum by identifying the relationship between two different moving averages. It simplifies complex price movements into visual cues, helping traders understand whether the current trend is accelerating or slowing down.
Core Mechanics
The logic operates in three distinct layers:
1. The Momentum Gap (MACD Line) The tool first calculates two separate moving averages based on recent closing prices: a "Fast" average and a "Slow" average. By subtracting the Slow average from the Fast average, the script creates a primary momentum value.
- When this value is positive, it suggests upward pressure.
- When it is negative, it suggests downward pressure.
2. The Signal Smoothing To filter out "market noise" and minor fluctuations, the tool takes that primary momentum value and applies a secondary smoothing process (a Simple Moving Average). This creates a "Signal Line," which acts as a benchmark to determine if a trend change is significant enough to be considered actionable.
3. Visual Alerts (The Crossover System) The most practical feature of this script is its ability to automatically plot visual markers on the chart. It watches for specific "crossovers" between the momentum value and the signal line:
- Bullish Signals: If the momentum value crosses from below the signal line to above it, the script places a visual marker (an arrow) at the bottom of the price candle. This indicates a potential shift toward upward movement.
- Bearish Signals: If the momentum value crosses from above the signal line to below it, the script places a visual marker at the top of the price candle. This indicates a potential shift toward downward movement.
Summary for Users
Instead of requiring you to manually track two shifting lines on a sub-chart, this tool processes that data in the background and highlights the exact moments where trend reversals occur by placing arrows directly on your main trading chart. It serves as an automated alert system for momentum shifts based on classic moving average theory.
//+------------------------------------------------------------------+
//| Custom MACD.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Blue
#property indicator_color4 Red
//---- indicator parameters
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;
//---- indicator buffers
double ind_buffer1[];
double ind_buffer2[];
double ind_buffer3[];
double ind_buffer4[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- drawing settings
SetIndexStyle(0,DRAW_NONE);
SetIndexStyle(1,DRAW_NONE);
SetIndexDrawBegin(1,SignalSMA);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1);
//---- indicator buffers mapping
if(!SetIndexBuffer(0,ind_buffer1) && !SetIndexBuffer(1,ind_buffer2))
Print("cannot set indicator buffers!");
SetIndexStyle(2, DRAW_ARROW, STYLE_SOLID, 0);
SetIndexArrow(2, 108);
SetIndexBuffer(2, ind_buffer3);
SetIndexStyle(3, DRAW_ARROW, STYLE_SOLID, 0);
SetIndexArrow(3, 108);
SetIndexBuffer(3, ind_buffer4);
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence |
//+------------------------------------------------------------------+
int start()
{
int limit;
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;
//---- macd counted in the 1-st buffer
for(int i=0; i<limit; i++)
ind_buffer1[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
//---- signal line counted in the 2-nd buffer
for(i=0; i<limit; i++)
ind_buffer2[i]=iMAOnArray(ind_buffer1,Bars,SignalSMA,0,MODE_SMA,i);
for (i=0; i<limit; i++)
{
ind_buffer3[i] = EMPTY_VALUE; ind_buffer4[i] = EMPTY_VALUE;
if (ind_buffer1[i] > ind_buffer2[i] && ind_buffer1[i+1] < ind_buffer2[i+1])
ind_buffer3[i] = Low[i] - 1 * Point;
if (ind_buffer1[i] < ind_buffer2[i] && ind_buffer1[i+1] > ind_buffer2[i+1])
ind_buffer4[i] = High[i] + 1 * Point;
}
//---- done
return(0);
}
Comments