MA in Color_v2
Download scriptThis script is a visual trading tool designed to simplify the interpretation of moving averages on a price chart by using dynamic color coding. Instead of displaying a single, static line, it highlights shifts in market momentum through distinct visual transitions.
Core Functionality
The primary purpose of this tool is to track various types of Moving Averages (MA)—such as Simple, Exponential, Smoothed, Linear Weighted, or Least Squares—and visually signal whether the trend is currently moving upward or downward. By analyzing the relationship between the current price average and its previous value, the script changes the color of the line on your chart to reflect these movements in real-time.
How the Logic Works
The tool operates by performing a continuous calculation of the chosen moving average across all historical data points on the chart. For every candle, it performs two specific checks:
- Trend Detection: The script compares the value of the moving average at the current moment against its value from one period ago.
- Dynamic Coloring: Based on this comparison, it assigns a specific color to the line:
- If the average is increasing (the current value is higher than the previous), it highlights the trend in one direction.
- If the average is decreasing (the current value is lower than the previous), it switches to a different color.
- If the average remains unchanged, the indicator maintains a neutral state.
Key Features for the User
- Versatility: It allows you to switch between different mathematical models of moving averages (e.g., EMA, SMMA, LWMA, or LSMA) without needing different tools.
- Customizable Parameters: Users can define the "Period" (how much historical data is being averaged), the specific type of Moving Average to use, and the price source (such as Close, Open, High, Low, etc.).
- Visual Clarity: By removing the need for a trader to manually interpret "slopes" or "angles," the script provides an immediate visual cue. The color changes act as a simplified signal for trend direction, making it easier to identify market shifts at a glance.
//+------------------------------------------------------------------+
//| 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 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