MA in Color_Separate_v2
Download scriptThis tool is designed for traders using the MetaTrader platform to provide a visual representation of trend direction through color-coded Moving Averages. Instead of looking at a standard line that stays one color, this script dynamically changes the appearance of the moving average based on its recent momentum.
Core Functionality
The primary goal of this indicator is to make "trend following" easier to see at a glance. It calculates a moving average—which is a way to smooth out price fluctuations to reveal the underlying trend—and then compares the current value against its previous value.
How it Works
The logic operates in three main stages:
1. Selection and Calculation The user can choose various types of Moving Averages (such as Simple, Exponential, Smoothed, or Linear Weighted). The script calculates these values based on a specific timeframe (period) and price type (such as the closing price or the high/low of a candle).
2. Momentum Detection For every new data point on the chart, the script performs a comparison:
- It looks at the Current Value of the moving average.
- It looks at the Previous Value (the value from one step back).
3. Visual Color Coding Based on that comparison, the script "turns on" specific colors to signal the trend:
- Bullish Movement: If the current value is higher than the previous value, the indicator highlights the trend in a specific color (Green), indicating upward momentum.
- Bearish Movement: If the current value is lower than the previous value, the indicator highlights the trend in a different color (Red), indicating downward momentum.
- Neutral State: If there is no change between the values, the lines remain neutral or "empty" to avoid giving false signals during flat markets.
User Benefit
By converting these mathematical calculations into visual colors, the script removes the need for the trader to constantly guess if the trend is turning. It provides a clear, real-time visual cue: when the color shifts, it signifies that the momentum of the price has changed direction, allowing for quicker decision-making during live trading.
//+------------------------------------------------------------------+
//| MA_In_Color.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| Modified from LSMA_In_Color to use any MA by Robert Hill |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, FX Sniper and Robert Hill"
#property link "http://www.metaquotes.net/"
//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_color2 Green
#property indicator_color3 Red
extern int MAPeriod=14;
extern int MAType=1;
extern int Shift=0;
extern int Applied_price=0; //0=PRICE_CLOSE; 1=PRICE_OPEN; 2=PRICE_HIGH; 3=PRICE_LOW; 4=PRICE_MEDIAN; 5=PRICE_TYPICAL; 6=PRICE_WEIGHTED
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
//---- variables
int MAMode;
string strMAType;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(3);
//---- drawing settings
SetIndexBuffer(2,ExtMapBuffer1);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexBuffer(0,ExtMapBuffer3);
SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,2);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
switch (MAType)
{
case 1: strMAType="EMA"; MAMode=MODE_EMA; break;
case 2: strMAType="SMMA"; MAMode=MODE_SMMA; break;
case 3: strMAType="LWMA"; MAMode=MODE_LWMA; break;
case 4: strMAType="LSMA"; break;
default: strMAType="SMA"; MAMode=MODE_SMA; break;
}
IndicatorShortName( strMAType+ " (" +MAPeriod + ") ");
SetIndexShift(0,Shift);
SetIndexShift(1,Shift);
SetIndexShift(2,Shift);
//---- initialization done
return(0);
}
double LSMA(int Rperiod, int shift)
{
int i;
double sum;
int length;
double lengthvar;
double tmp;
double wt;
length = Rperiod;
sum = 0;
for(i = length; i >= 1 ; i--)
{
lengthvar = length + 1;
lengthvar /= 3;
tmp = 0;
tmp = ( i - lengthvar)*Close[length-i+shift];
sum+=tmp;
}
wt = sum*6/(length*(length+1));
return(wt);
}
int start()
{
double MA_Cur, MA_Prev;
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;
for(int i=limit; i>=0; i--)
{
if (MAType == 4)
{
MA_Cur = LSMA(MAPeriod,i);
MA_Prev = LSMA(MAPeriod,i+1);
}
else
{
MA_Cur = iMA(NULL,0,MAPeriod,0,MAMode,Applied_price,i);
MA_Prev = iMA(NULL,0,MAPeriod,0,MAMode,Applied_price,i+1);
}
//========== COLOR CODING ===========================================
ExtMapBuffer3[i] = MA_Cur; //red
ExtMapBuffer2[i] = MA_Cur; //green
ExtMapBuffer1[i] = MA_Cur; //yellow
if (MA_Prev > MA_Cur)
{
ExtMapBuffer2[i] = EMPTY_VALUE;
}
else if (MA_Prev < MA_Cur)
{
ExtMapBuffer1[i] = EMPTY_VALUE; //-1 red/greem tight
}
else
{
ExtMapBuffer1[i]=EMPTY_VALUE;//EMPTY_VALUE;
ExtMapBuffer2[i]=EMPTY_VALUE;//EMPTY_VALUE;
}
}
return(0);
}
//+------------------------------------------------------------------+
Comments