The XP Moving Average is a versatile technical analysis tool designed to help traders identify trends by smoothing out price fluctuations on a trading chart. Unlike standard indicators that provide a single, static line, this script offers a variety of mathematical models and visual signals to help users better understand market direction.
Core Functionality
The primary role of this script is to calculate a "Moving Average"—a way of tracking the average price of an asset over a specific timeframe. By smoothing out the daily "noise" of price spikes, it allows traders to see whether the underlying trend is moving upward, downward, or remainingsideways.
Key Features and Customization
The logic within this script provides users with significant flexibility through several adjustable parameters:
- Diverse Calculation Models: The script supports eight different types of moving averages. This includes standard models like Simple (SMA) and Exponential (EMA), as well as more advanced, complex algorithms such as Double Exponential (DEMA), Triple Exponential (TEMA), T3 Moving Average, and the Jurik Moving Average (JMA). Each of these models reacts differently to price changes; some are faster at catching new trends, while others are smoother and less prone to "fake-outs."
- Price Source Selection: Users can choose which specific price data the average should be based on. Options include the closing price, opening price, highs, lows, or even median and weighted averages.
- Customizable Sensitivity: Through settings like the "Period," users can define how much historical data the indicator should look back at to determine its current calculation.
Visual Logic and Trend Signaling
Beyond just drawing a line on the chart, the script includes built-in logic to help visually distinguish between different types of price movement:
- Baseline Calculation: The script first determines the main moving average value based on the user's chosen model and settings.
- Directional Analysis: It then compares the current value of the average against the previous value.
- Visual Indicators:
- If the moving average is currently rising (higher than its previous position), the script identifies an upward movement.
- If the moving average is falling (lower than its previous position), it identifies a downward movement.
- By processing these comparisons, the indicator can effectively highlight these shifts on the chart, making it easier for a trader to quickly identify whether momentum is shifting in their favor.
//+------------------------------------------------------------------+
//| XP Moving Average |
//| xpMA.mq4 |
//| Developed by Coders Guru |
//| http://www.xpworx.com |
//+------------------------------------------------------------------+
#property link "http://www.xpworx.com"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Blue
#define MODE_DEMA 4
#define MODE_TEMA 5
#define MODE_T3MA 6
#define MODE_JMA 7
/* Moving average types constants:
------------------------------------
MODE_SMA 0 Simple moving average,
MODE_EMA 1 Exponential moving average,
MODE_SMMA 2 Smoothed moving average,
MODE_LWMA 3 Linear weighted moving average.
MODE_DEMA 4 Double Exponential Moving Average.
MODE_TEMA 5 Triple Exponential Moving Average.
MODE_T3MA 6 T3 Moving Average.
MODE_JMA 7 Jurik Moving Average.
------------------------------------*/
/* Applied price constants:
-------------------------------
PRICE_CLOSE 0 Close price.
PRICE_OPEN 1 Open price.
PRICE_HIGH 2 High price.
PRICE_LOW 3 Low price.
PRICE_MEDIAN 4 Median price, (high+low)/2.
PRICE_TYPICAL 5 Typical price, (high+low+close)/3.
PRICE_WEIGHTED 6 Weighted close price, (high+low+close+close)/4.
--------------------------------- */
extern int MA_Period = 35;
extern int MA_Type = MODE_JMA;
extern int MA_Applied = PRICE_CLOSE;
extern double T3MA_VolumeFactor = 0.8;
extern double JMA_Phase = 0;
double UpBuffer[];
double DownBuffer[];
double Buffer3[];
double buffer[];
double tempbuffer[];
double matriple[];
int init()
{
IndicatorBuffers(6);
SetIndexStyle(2,DRAW_LINE,STYLE_DOT,2);
SetIndexBuffer(2,UpBuffer);
SetIndexStyle(1,DRAW_LINE,STYLE_DOT,2);
SetIndexBuffer(1,DownBuffer);
SetIndexStyle(0,DRAW_LINE,STYLE_DOT,2);
SetIndexBuffer(0,Buffer3);
SetIndexBuffer(3,buffer);
SetIndexBuffer(4,tempbuffer);
SetIndexBuffer(5,matriple);
return(0);
}
int deinit()
{
return(0);
}
void start()
{
int limit;
int i = 0;
int counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
//if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars-1;
switch (MA_Type)
{
case 0:
case 1:
case 2:
case 3:
{
for(i=0; i<limit; i++)
{
buffer[i] = iMA(NULL,0,MA_Period,0,MA_Type,MA_Applied,i);
}
}
break;
case 4:
{
for(i=0; i<limit; i++)
{
tempbuffer[i] = iMA(NULL,0,MA_Period,0,MODE_EMA,MA_Applied,i);
}
for(i=0; i<limit; i++)
{
matriple[i] = iMAOnArray(tempbuffer,0,MA_Period,0,MODE_EMA,i);
}
for(i=0; i<limit; i++)
{
buffer[i] = iMAOnArray(matriple,0,MA_Period,0,MODE_EMA,i);
}
}
break;
case 5:
{
for(i=0; i<limit; i++)
{
tempbuffer[i] = iMA(NULL,0,MA_Period,0,MODE_EMA,MA_Applied,i);
}
for(i=0; i<limit; i++)
{
buffer[i] = iMAOnArray(tempbuffer,0,MA_Period,0,MODE_EMA,i);
}
}
break;
case 6:
{
for(i=0; i<limit; i++)
{
buffer[i] = iCustom(NULL,0,"T3MA",MA_Period,T3MA_VolumeFactor,0,i);
}
}
case 7:
{
for(i=0; i<limit; i++)
{
buffer[i] = iCustom(NULL,0,"JMA",MA_Period,JMA_Phase,0,i);
}
}
break;
}
for(int shift=0; shift<limit; shift++)
{
UpBuffer[shift] = buffer[shift];
DownBuffer[shift] = buffer[shift];
Buffer3[shift] = buffer[shift];
}
for(shift=0; shift<limit; shift++)
{
if (buffer[shift]<buffer[shift+1])
{
UpBuffer[shift] = EMPTY_VALUE;
}
else if (buffer[shift]>buffer[shift+1] )
{
DownBuffer[shift] = EMPTY_VALUE;
}
else
{
UpBuffer[shift] = CLR_NONE;
DownBuffer[shift] = CLR_NONE;
}
}
return(0);
}
Comments