Color Moving average
Download scriptThis technical script is designed for MetaTrader to provide a visual, color-coded moving average on a trading chart. By transforming standard price data into a dynamic visual signal, it helps traders identify the direction of market trends more intuitively than a single, static line might allow.
Core Functionality
The primary purpose of this tool is to track the "Moving Average" (MA)—a calculation that smooths out price fluctuations to reveal the underlying trend. However, instead of displaying a single line that changes color based on complex rules, this script calculates the average and then applies specific colors based on whether the average is currently rising or falling.
Key Features and Logic
-
Customizable Average Types: The script is versatile, allowing users to choose between several different mathematical methods for calculating the average:
- SMA (Simple): The standard average of prices over a set period.
- EMA (Exponential): Gives more weight to recent price data.
- SMMA & LWMA: Variations that smooth out price data differently depending on user preference.
- LSMA (Linear Weighted): A specialized calculation that prioritizes the most recent price points even more heavily.
-
Trend Detection via Color Coding: The script monitors two consecutive data points: the current value and the previous value. It then uses these to determine the color of the line on your screen:
- Upward Trend: When the current average is higher than the previous one, the script highlights the movement in a specific color (Lime).
- Downward Trend: When the current average is lower than the previous one, it shifts to a different color (Red).
- Neutral/Flat Movement: If there is no significant change between the two points, the script manages the display to reflect that lack of momentum.
How It Works for the User
When you apply this to a chart, you won't just see a plain line; you will see a visual "flow." Because the color changes based on the slope of the average:
- Green/Lime segments provide an immediate visual cue that the trend is gaining upward momentum.
- Red segments serve as a warning that the trend is losing ground or moving downward.
- Yellow elements are used to define the primary structure of the average line.
By combining these visual cues, the tool allows a trader to quickly scan a chart and identify whether the market is currently "bullish" (moving up) or "bearish" (moving down) without having to manually calculate the slope of the price action.
//+------------------------------------------------------------------+
//| 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_chart_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_color2 Lime
#property indicator_color3 Red
//----
extern int MAPeriod=60;
extern int MAType=0;
//---- 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,3);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,3);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3);
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 + ") ");
//---- 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,PRICE_CLOSE,i);
MA_Prev=iMA(NULL,0,MAPeriod,0,MAMode,PRICE_CLOSE,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