The T3 ALPHA script is a sophisticated technical analysis tool designed to provide traders with smoothed price data, helping to filter out "market noise" while maintaining responsiveness to new price movements. Unlike simple moving averages that can sometimes be too slow or too erratic, this script uses a multi-layered mathematical approach to interpret market trends more fluidly.
Core Logic and Mechanics
Multi-Layered Smoothing (The "T3" Foundation) The primary logic of the script is based on a recursive calculation known as the T3 moving average. Instead of looking at a single window of time, the script passes price data through several successive layers of calculations. Each layer builds upon the previous one, which helps to eliminate sudden price spikes without sacrificing the ability to follow a steady trend.
Weighted Coefficients The script employs a specific mathematical constant (defined by the user as a smoothing factor) to determine how much weight is given to new data versus old data. By calculating these coefficients upfront, the indicator ensures that the resulting lines are aesthetically smooth and mathematically consistent across different timeframes.
Dynamic Period Adjustments While you can input specific periods for each of the six data lines, the script includes a self-regulating mechanism for the inputs. If a period is set too low (near zero), the logic automatically adjusts it to a minimum functional value. This ensures that the mathematical formulas remain stable and do not produce errors or impossible values during live trading.
Multi-Line Visualization The script generates six distinct outputs simultaneously:
- Lines: Four of these are rendered as continuous lines (Yellow, Red, Magenta, and Blue), which are ideal for identifying the primary "flow" of the market.
- Histograms: Two of these are rendered as histograms (Aqua and Green). Histograms are particularly useful for visualizing momentum or the strength behind a specific price movement at a glance.
Summary for the User
In practical terms, this script acts as a high-fidelity "filter" for price action. By using multiple layers of calculation, it tries to show you the "true" direction of the market by smoothing out minor fluctuations. Because it provides six different variations based on your chosen periods, it allows you to see a variety of trend strengths—from very fast, responsive movements to slow, steady long-term trends—all within a single window.
//+------------------------------------------------------------------+
//| T3 ALPHA.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Magenta
#property indicator_color4 Aqua
#property indicator_color5 Green
#property indicator_color6 Blue
//----
extern int MA_Period_1 = 3;
extern int MA_Period_2 = 5;
extern int MA_Period_3 = 0; //8
extern int MA_Period_4 = 0; //12
extern int MA_Period_5 = 21;
extern int MA_Period_6 = 34;
//----
extern double b = 0.7;
//----
double MapBuffer1[];
double MapBuffer2[];
double MapBuffer3[];
double MapBuffer4[];
double MapBuffer5[];
double MapBuffer6[];
//----
double e1[][7], e2[][7], e3[][7], e4[][7], e5[][7], e6[][7];
double c1[7], c2[7], c3[7], c4[7];
double n[7], w1[7], w2[7], b2[7], b3[7];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators setting
SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 1, Yellow);
SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 1, Red);
SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 1, Magenta);
SetIndexStyle(3, DRAW_HISTOGRAM, STYLE_SOLID, 0, Aqua);
SetIndexStyle(4, DRAW_HISTOGRAM, STYLE_SOLID, 0, Green);
SetIndexStyle(5, DRAW_LINE, STYLE_SOLID, 1, Blue);
IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS));
IndicatorShortName("T3 ALPHA");
SetIndexDrawBegin(0, 100);
SetIndexDrawBegin(1, 100);
SetIndexDrawBegin(2, 100);
SetIndexDrawBegin(3, 100);
SetIndexDrawBegin(4, 100);
SetIndexDrawBegin(5, 100);
SetIndexBuffer(0, MapBuffer1);
SetIndexBuffer(1, MapBuffer2);
SetIndexBuffer(2, MapBuffer3);
SetIndexBuffer(3, MapBuffer4);
SetIndexBuffer(4, MapBuffer5);
SetIndexBuffer(5, MapBuffer6);
//---- variable reset
n[1] = MA_Period_1;
n[2] = MA_Period_2;
n[3] = MA_Period_3;
n[4] = MA_Period_4;
n[5] = MA_Period_5;
n[6] = MA_Period_6;
//----
for(int l = 1; l < 7; l++)
{
//e2[l]=0; e3[l]=0; e4[l]=0; e5[l]=0; e6[l]=0;
c1[l] = 0; c2[l] = 0; c3[l] = 0; c4[l] = 0;
w1[l] = 0; w2[l] = 0;
b2[l] = 0; b3[l] = 0;
//----
b2[l] = b*b;
b3[l] = b2[l]*b;
c1[l] = -b3[l];
c2[l] = (3*(b2[l] + b3[l]));
c3[l] = -3*(2*b2[l] + b + b3[l]);
c4[l] =(1 + 3*b + b3[l] + 3*b2[l]);
//----
if(n[l] < 1)
n[l] = 1;
n[l] = 1 + 0.5*(n[l] - 1);
w1[l] = 2 / (n[l] + 1);
w2[l] = 1 - w1[l];
}
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int limit, MB[], ii, i;
int counted_bars = IndicatorCounted();
//----
if(counted_bars < 0)
return(-1);
if(counted_bars > 0)
counted_bars--;
limit = (Bars - counted_bars) - 1;
//---- indicator calculation
ArrayResize(e1, Bars + 1);
ArrayResize(e2, Bars + 1);
ArrayResize(e3, Bars + 1);
ArrayResize(e4, Bars + 1);
ArrayResize(e5, Bars + 1);
ArrayResize(e6, Bars + 1);
//----
for(i = limit; i >= 0; i--)
{
for(ii = 1; ii < 7; ii++)
{
e1[Bars-i][ii] = w1[ii]*Close[i] + w2[ii]*e1[(Bars-i)-1][ii];
e2[Bars-i][ii] = w1[ii]*e1[Bars-i][ii] + w2[ii]*e2[(Bars-i)-1][ii];
e3[Bars-i][ii] = w1[ii]*e2[Bars-i][ii] + w2[ii]*e3[(Bars-i)-1][ii];
e4[Bars-i][ii] = w1[ii]*e3[Bars-i][ii] + w2[ii]*e4[(Bars-i)-1][ii];
e5[Bars-i][ii] = w1[ii]*e4[Bars-i][ii] + w2[ii]*e5[(Bars-i)-1][ii];
e6[Bars-i][ii] = w1[ii]*e5[Bars-i][ii] + w2[ii]*e6[(Bars-i)-1][ii];
//----
if(ii == 1)
MapBuffer1[i] = c1[ii]*e6[Bars-i][ii] + c2[ii]*e5[Bars-i][ii] +
c3[ii]*e4[Bars-i][ii] + c4[ii]*e3[Bars-i][ii];
if(ii == 2)
MapBuffer2[i] = c1[ii]*e6[Bars-i][ii] + c2[ii]*e5[Bars-i][ii] +
c3[ii]*e4[Bars-i][ii] + c4[ii]*e3[Bars-i][ii];
if(ii == 3)
MapBuffer3[i] = c1[ii]*e6[Bars-i][ii] + c2[ii]*e5[Bars-i][ii] +
c3[ii]*e4[Bars-i][ii] + c4[ii]*e3[Bars-i][ii];
if(ii == 4)
MapBuffer4[i] = c1[ii]*e6[Bars-i][ii] + c2[ii]*e5[Bars-i][ii] +
c3[ii]*e4[Bars-i][ii] + c4[ii]*e3[Bars-i][ii];
if(ii == 5)
MapBuffer5[i] = c1[ii]*e6[Bars-i][ii] + c2[ii]*e5[Bars-i][ii] +
c3[ii]*e4[Bars-i][ii] + c4[ii]*e3[Bars-i][ii];
if(ii == 6)
MapBuffer6[i] = c1[ii]*e6[Bars-i][ii] + c2[ii]*e5[Bars-i][ii] +
c3[ii]*e4[Bars-i][ii] + c4[ii]*e3[Bars-i][ii];
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments