T3MA
Download scriptThis script is designed for the MetaTrader platform to provide traders with a specialized type of moving average known as a T3 Moving Average. Unlike standard moving averages, which can sometimes be "laggy" (meaning they react slowly to recent price changes), this tool uses a complex mathematical layering technique to produce a smoother line that follows price trends more closely and responsively.
How the Logic Works
The core logic of this script relies on a process of recursive smoothing. Instead of calculating an average based directly on the raw price, the script performs the following steps:
- Multi-Layered Smoothing: The script takes the closing price of the market and calculates a basic exponential moving average (EMA). It then takes that result and calculates another EMA from it. This process is repeated multiple times—layering averages on top of previous averages.
- The T3 Formula: By creating these six distinct layers of data, the script applies a specific mathematical formula involving a "Volume Factor." This factor allows for a customizable balance between smoothness and sensitivity.
- Weighting: The final output (the line you see on your chart) is created by combining these different layers using specific coefficients. This ensures that while the line is very smooth, it remains mathematically tied to the most relevant price data, reducing the "noise" of minor market fluctuations without losing the overall trend.
Key Features for the User
- Customizable Sensitivity: Through the Periods setting, you can determine the length of the average. A smaller number makes the line react faster to price changes, while a larger number makes it slower and smoother.
- Adjustable Smoothing (Volume Factor): The Volume Factor acts as a "tuning knob." It allows you to modify how aggressively the formula weights the different layers of moving averages, giving you control over how "tight" the line sticks to the price action.
- Visual Customization: The script includes built-in settings to let you choose where the indicator's label appears on your screen (e.g., top left, bottom right) and allows for easy color adjustments to match your personal trading layout.
Summary of Purpose
The primary goal of this script is to provide a high-performance trend line. It is designed for traders who want to identify the direction of a market trend clearly while minimizing the "choppiness" that usually comes with standard indicators, making it easier to spot significant price movements in real-time.
//+------------------------------------------------------------------+
//| T3MA.mq4 |
//| Copyright © 2005, Nick Bilak |
//| http://www.forex-tsd.com/ |
//| modified for VolumeFactor by: ben |
//| thanks to Bilak |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Nick Bilak"
#property link "http://www.forex-tsd.com/"
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Olive
//---- indicator parameters
extern string note1 = "Moving Average";
extern int Periods = 3; //12
extern double VolumeFactor = 0.7; //0.8
extern string note4 = "change color in the Colors area too";
extern color MAcolor1 = Olive;
extern string note5 = "Display the info in what corner?";
extern string note6 = "Upper left=0; Upper right=1";
extern string note7 = "Lower left=2; Lower right=3";
extern int WhatCorner=1;
extern string note8 = "Y distance; add 10 to each MA";
extern int ydistance1=10;
//---- indicator buffers
double e1[];
double e2[];
double e3[];
double e4[];
double e5[];
double e6[];
double e7[];
string objectma1;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
string IntToStr(int X)
{
return (DoubleToStr(X, 0));
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
int ydistance2;
IndicatorBuffers(7);
//---- drawing settings
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID);
SetIndexDrawBegin(0,Periods);
if(
!SetIndexBuffer(0,e7) &&
!SetIndexBuffer(1,e2) &&
!SetIndexBuffer(2,e3) &&
!SetIndexBuffer(3,e4) &&
!SetIndexBuffer(4,e5) &&
!SetIndexBuffer(5,e6) &&
!SetIndexBuffer(6,e1)
)
Print("cannot set indicator buffers!");
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("T3MA("+Periods+")");
//---- initialization done
if ((WhatCorner == 2) || (WhatCorner == 3))
{
ydistance2 = 50+ydistance1;
}
else
{
ydistance1 = 20+ydistance1;
}
objectma1 = "banzaiT3"+IntToStr(Periods);
ObjectCreate(objectma1, OBJ_LABEL, 0, 0, 0);
ObjectSetText(objectma1, "T3 ("+Periods+")", 8, "Arial", MAcolor1);
ObjectSet(objectma1, OBJPROP_CORNER, WhatCorner);
ObjectSet(objectma1, OBJPROP_XDISTANCE, 2);
ObjectSet(objectma1, OBJPROP_YDISTANCE, ydistance1);
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int deinit()
{
ObjectDelete(objectma1);
return(0);
}
//+------------------------------------------------------------------+
//| Moving Average of Oscillator |
//+------------------------------------------------------------------+
int start()
{
int i,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-Periods-1-counted_bars;
limit=Bars-counted_bars;
//---- main loop
for(i=limit; i>=0; i--)
{
e1[i]=iMA(NULL,0,Periods,0,MODE_EMA,PRICE_CLOSE,i);
}
for(i=limit; i>=0; i--)
{
e2[i]=iMAOnArray(e1,0,Periods,0,MODE_EMA,i);
}
for(i=limit; i>=0; i--)
{
e3[i]=iMAOnArray(e2,0,Periods,0,MODE_EMA,i);
}
for(i=limit; i>=0; i--)
{
e4[i]=iMAOnArray(e3,0,Periods,0,MODE_EMA,i);
}
for(i=limit; i>=0; i--)
{
e5[i]=iMAOnArray(e4,0,Periods,0,MODE_EMA,i);
}
double a= VolumeFactor; //0.8;
double c1=-a*a*a;
double c2=3*a*a+3*a*a*a;
double c3=-6*a*a-3*a-3*a*a*a;
double c4=1+3*a+a*a*a+3*a*a;
//T3MA=c1*e6+c2*e5+c3*e4+c4*e3;
for(i=limit; i>=0; i--)
{
e6[i]=iMAOnArray(e5,0,Periods,0,MODE_EMA,i);
e7[i]=c1*e6[i]+c2*e5[i]+c3*e4[i]+c4*e3[i];
}
//---- done
return(0);
}
/*
e1:= Mov(Pr,tPr,mt);
e2:= Mov(e1,tPr,mt);
e3:= Mov(e2,tPr,mt);
e4:= Mov(e3,tPr,mt);
e5:= Mov(e4,tPr,mt);
e6:= Mov(e5,tPr,mt);
c1:= -b*b*b;
c2:= 3*b*b+3*b*b*b;
c3:= -6*b*b-3*b-3*b*b*b;
c4:= 1+3*b+b*b*b+3*b*b;
T3MA:= c1*e6+c2*e5+c3*e4+c4*e3;
*/
//+------------------------------------------------------------------+
Comments