MA in Color_wAppliedPrice
Download scriptThis script is a specialized technical analysis tool designed for the MetaTrader 4 platform. Its primary purpose is to visualize trend direction through a dynamic, color-coded Moving Average (MA) on your trading charts. By transforming a standard numerical indicator into a visual signaling tool, it helps traders identify momentum shifts more intuitively.
Core Functionality
The logic follows three main pillars: calculation flexibility, price source customization, and visual trend signaling.
1. Versatile Moving Average Options The tool is not limited to a single type of calculation. It allows users to choose between several standard technical moving averages, including:
- Simple Moving Average (SMA)
- Exponential Moving Average (EMA)
- Smoothed Moving Average (SMMA)
- Linear Weighted Moving Average (LWMA)
- Least Squares Moving Average (LSMA)
2. Customizable Price Inputs Unlike basic indicators that only look at the "Close" price of a candle, this script offers deep customization regarding which price data points should be used for calculations. You can choose to base the average on:
- The Open, High, or Low prices.
- Mathematical averages such as the Median (High + Low / 2), Typical Price (High + Low + Close / 3), or Weighted Price.
3. Dynamic Color Coding The standout feature of this script is its ability to change colors based on the "slope" of the moving average. Instead of showing a single line, the logic compares the current value of the moving average against its previous value:
- Trend Identification: If the moving average is moving upward (the current value is higher than the previous one), the script highlights the trend in Green.
- Downward Momentum: If the moving average is moving downward (the current value is lower than the previous one), it switches to Red.
- Neutrality: If there is no significant change between the values, the script maintains a neutral state (Yellow).
How it Works for the User
When you apply this to a chart, the tool constantly scans each price bar in real-time. It calculates the chosen moving average based on your specific period and price source. By looking at whether the line is "rising" or "falling" compared to the previous moment, it automatically paints the line to reflect the current market sentiment. This allows a trader to see at a glance whether the trend is currently bullish (Green) or bearish (Red) without having to manually interpret the raw numerical data.
//+------------------------------------------------------------------+
//| MA_In_Color_wAppliedPrice.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| Modified from LSMA_In_Color to use any MA by Robert Hill |
//| Added use of Applied Price 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 MAAppliedPrice = 0;//0=close, 1=open, 2=high, 3=low, 4=median(high+low)/2, 5=typical(high+low+close)/3, 6=weighted(high+low+close+close)/4
//---- 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 + ") ");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| LSMA with PriceMode |
//| PrMode 0=close, 1=open, 2=high, 3=low, 4=median(high+low)/2, |
//| 5=typical(high+low+close)/3, 6=weighted(high+low+close+close)/4 |
//+------------------------------------------------------------------+
double LSMA(int Rperiod, int prMode, int shift)
{
int i;
double sum, pr;
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;
switch (prMode)
{
case 0: pr = Close[length-i+shift];break;
case 1: pr = Open[length-i+shift];break;
case 2: pr = High[length-i+shift];break;
case 3: pr = Low[length-i+shift];break;
case 4: pr = (High[length-i+shift] + Low[length-i+shift])/2;break;
case 5: pr = (High[length-i+shift] + Low[length-i+shift] + Close[length-i+shift])/3;break;
case 6: pr = (High[length-i+shift] + Low[length-i+shift] + Close[length-i+shift] + Close[length-i+shift])/4;break;
}
tmp = ( i - lengthvar)*pr;
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, MAAppliedPrice,i);
MA_Prev = LSMA(MAPeriod, MAAppliedPrice,i+1);
}
else
{
MA_Cur = iMA(NULL,0,MAPeriod,0,MAMode, MAAppliedPrice,i);
MA_Prev = iMA(NULL,0,MAPeriod,0,MAMode, MAAppliedPrice,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