!_Macd
Download scriptThis tool is a technical analysis indicator designed to help traders visualize market momentum and identify potential entry and exit points by analyzing the relationship between different price averages.
Core Functionality
The script calculates a variation of the MACD (Moving Average Convergence Divergence) system. It tracks three primary visual elements:
- The Main Momentum Line: This measures the distance between a fast-moving average and a slow-moving average of the price. It helps identify whether the current market trend is accelerating or decelerating.
- The Signal Line: This is a secondary average calculated from the main momentum line itself, used to smooth out fluctuations and provide a baseline for comparison.
- The Histogram: This visualizes the gap between the main momentum line and the signal line. When the histogram bars are growing, it suggests increasing momentum; when they shrink, it indicates the trend may be losing steam.
Trend Detection Logic
The script operates by comparing the current state of the momentum histogram against its previous state. It looks for specific "crosses" where the histogram moves from positive to negative (or vice versa), which often signifies a shift in market sentiment.
Automated Visual Signals
When the visual plotting feature is enabled, the script automatically identifies and marks specific trading signals on the chart using colored arrows:
- Long Entry (Buy): Triggered when the momentum histogram moves from a positive value to a negative value, crossing over the baseline.
- Short Entry (Sell): Triggered when the momentum histogram moves from a negative value to a positive value, crossing over the baseline.
- Exit Signals: The script also monitors the direction of the histogram bars while a "trade" is active. If the histogram begins to move in the opposite direction of the current trend (indicating a loss of momentum), it places an aqua-colored arrow to signal a potential exit point.
User Customization
The logic allows for specific adjustments to remain sensitive to different market types:
- Moving Average Periods: You can change the speed of the fast, slow, and signal averages to suit different timeframes (e.g., scalping vs. long-term investing).
- Thresholds: There is a built-in filter that ensures signals are only generated when the momentum exceeds a specific strength level, helping to filter out "market noise" or flat periods where no significant movement is occurring.
//+------------------------------------------------------------------+
//| |
//| Copyright © 1999-2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.ru |
//+------------------------------------------------------------------+
#property link "jpygbp@yahoo.com"
#property indicator_buffers 5
#property indicator_separate_window
//----
#property indicator_color1 HotPink //macd
#property indicator_color2 Lime //signal
#property indicator_color3 Gray //histogram
#property indicator_color4 Blue //macd[1]
#property indicator_color5 Black //zero line
//---- buffers
double Buffer1[]; //macd
double Buffer2[]; //signal
double Buffer3[]; //histogram
double Buffer4[]; //macd[1]
double Buffer5[]; //zero line
//----
extern int FastEMA=9;
extern int SlowEMA=64;
extern int SignalSMA=112;
//extern bool plotMACD = true;
//extern bool plotSignalLine = true;
//extern bool plotHistogram = true;
//extern bool plotMACDOneBarAgo = true;
//extern bool plotZeroLine = true;
extern bool plotArrows=false;
extern double HistThreshold=0;
//----
int limit=0;
int fontsize=10;
int i=0;
bool InLTrade=false;
bool InSTrade=false;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init()
{
ObjectsDeleteAll();
//---- indicators
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);//macd
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2);//signal
SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,2);//hist
SetIndexStyle(3,DRAW_LINE,STYLE_SOLID,2);//macd[1]
SetIndexStyle(4,DRAW_LINE,STYLE_SOLID,1);//zero
//
SetIndexBuffer(0,Buffer1);
SetIndexBuffer(1,Buffer2);
SetIndexBuffer(2,Buffer3);
SetIndexBuffer(3,Buffer4);
SetIndexBuffer(4,Buffer5);
//
SetIndexDrawBegin(1,SignalSMA);
//
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1);
//
IndicatorShortName("MACD("+FastEMA+","+SlowEMA+","+SignalSMA+")");
//
SetIndexLabel(0,"MACD");
SetIndexLabel(1,"Signal");
SetIndexLabel(2,"Histogram");
SetIndexLabel(3,"MACD[1]");
SetIndexLabel(4,"Zero");
//----
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
string NewArrow(datetime T1, double P1, color collor)
{
string N=StringConcatenate("A",collor,"-",TimeToStr(T1));
int AC=SYMBOL_STOPSIGN;
if(collor==Blue)
AC=SYMBOL_ARROWUP;
if(collor==Red)
AC=SYMBOL_ARROWDOWN;
//----
ObjectCreate(N, OBJ_ARROW, 0, T1, P1);
ObjectSet(N, OBJPROP_ARROWCODE, AC);
ObjectSet(N, OBJPROP_COLOR, collor);
ObjectSet(N, OBJPROP_WIDTH, 1);
ObjectsRedraw();
return(N);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int deinit()
{
ObjectsRedraw();
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);//---- check for possible errors
if(counted_bars>0) counted_bars--;//---- last counted bar will be recounted
limit=Bars-counted_bars;
//----
for(i=0; i<limit; i++)//---- macd counted in the 1-st buffer histogram
Buffer1[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
//----
for(i=0; i<limit; i++)//---- signal line counted in the 2-nd buffer line
Buffer2[i]=iMAOnArray(Buffer1,Bars,SignalSMA,0,MODE_SMA,i);
//----
for(i=0; i<limit; i++)//---- histogram is the difference between macd and signal line
{
Buffer3[i]=Buffer1[i]-Buffer2[i];
Buffer5[i]=0;
}
//----
for(i=1; i<limit; i++)//---- macd[1]
Buffer4[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i-1)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i-1);
//----
if (plotArrows)
{
ObjectsDeleteAll();
InLTrade=false;
InSTrade=false;
for(int i=Bars;i>=0;i--)
{
if ((Buffer3[i-1] > 0) && (Buffer3[i] < 0) && Buffer3[i-1] > HistThreshold)//Long Begin
{
string upArrow1=NewArrow(Time[i-1], High[i-1]+0.0005, Blue);
InLTrade=true;
}
if ((Buffer3[i-1] < 0) && (Buffer3[i] > 0) && Buffer3[i-1] < -HistThreshold)//Short Begin
{
string dnArrow1=NewArrow(Time[i-1], Low[i-1]-0.0003, Red);
InSTrade=true;
InLTrade=false;
}
if ((InSTrade ==true) && (Buffer3[i-1] > Buffer3[i]))//Short End
{
string upArrow2=NewArrow(Time[i-1], Low[i-1]-0.0003, Aqua);
InSTrade=false;
}
if ((InLTrade==true) && (Buffer3[i-1] < Buffer3[i]))//Long End
{
string dnArrow2=NewArrow(Time[i-1], High[i-1]+0.0005, Aqua);
InLTrade=false;
}
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments