Indicator Logic Overview
This script is a custom technical analysis tool designed to track and visualize momentum trends in financial markets. Rather than showing raw price data, it focuses on the Rate of Change (ROC), which helps traders understand how quickly price movements are accelerating or decelerating over specific periods.
Core Functionality
The logic operates by calculating two distinct types of smoothed moving averages, which are then used to derive momentum values. These calculations are based on a "Triple Exponential Smoothing" approach, which is designed to reduce market "noise" and provide a cleaner view of the underlying trend.
How the Calculations Work:
- Smoothing Layers: The script processes price data (either Closing or Opening prices, depending on your settings) through multiple layers of smoothing. By applying these layers repeatedly, the indicator filters out minor, insignificant price fluctuations to highlight more significant market trends.
- Dual-Trend Monitoring: The tool tracks two different periods simultaneously:
- Component A: A shorter-term trend calculation.
- Component B: A longer-term trend calculation.
- Momentum Analysis: For each component, the script calculates the mathematical difference between the current smoothed value and its previous value. This represents the "velocity" of the price movement.
Visual Output
The script provides two primary lines on your chart window:
- Line 1 (Short-term Momentum): Focuses on the velocity of the shorter period. This is typically used to identify immediate shifts in market direction.
- Line 2 (Combined/Long-term Momentum): Depending on your configuration, this line either focuses on the longer-period velocity or combines the momentum of both periods into a single reading.
Key Features for the User:
- Dynamic Smoothing: The script automatically adjusts its weightings based on the time periods you provide, ensuring that the math remains consistent regardless of how many bars are being analyzed.
- Relative Growth: Instead of showing absolute price points, the indicator displays a percentage-like rate of change. This allows you to see not just where the price is going, but how fast it is getting there relative to its previous position.
- Trend Identification: By observing the slopes and direction of these lines, users can identify periods of exhaustion (where momentum slows down) or periods of high-strength expansion (where momentum spikes).
//+------------------------------------------------------------------+
//| T3 TRIX (ROC of T6).mq4 |
//| convert FinGeR Alex orginal by Luis Damiani |
//| |
//+------------------------------------------------------------------+
#property copyright "convert FinGeR Alex orginal by Luis Damiani"
#property link ""
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DeepSkyBlue
#property indicator_color2 Blue
//---- input parameters
extern int TrixNumberOfBars=350;
extern int A_t3_period=7;//20;
extern int B_t3_period_ac=19;//35;
int is_A_open_price=0;
int diferential=0;
double hot=0.7;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtMapBuffer2);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int shift=0;
double A_t3=0,A_t3_1=0,max_per=0;
double B_t3=0,B_t3_1=0;
double e1=0,e2=0,e3=0,e4=0,e5=0,e6=0,c1=0,c2=0,c3=0,c4=0;
double e1x=0,e2x=0,e3x=0,e4x=0,e5x=0,e6x=0;
double d1=0,d2=0,d3=0,d4=0,d5=0,d6=0;
double d1x=0,d2x=0,d3x=0,d4x=0,d5x=0,d6x=0;
double n=0,A_w1=0,A_w2=0,B_w1=0,B_w2=0,b2=0,b3=0;
double init=true;
double bar=0, prevbars=0, start=0, cs=0, prevcs=0,frame=0;
string commodt="nonono";
int counted_bars=IndicatorCounted();
cs = TrixNumberOfBars+A_t3_period+is_A_open_price+B_t3_period_ac+diferential+hot;
if (cs==prevcs && commodt==Symbol() && frame==Time[4]-Time[5] && Bars-prevbars<2)
start=Bars-prevbars;
else start=-1;
commodt=Symbol();
frame=Time[4]-Time[5];
prevbars = Bars;
prevcs = cs;
if (start==1 || start==0) bar=start; else init=true;
if (init==true)
{
b2=hot*hot;
b3=b2*hot;
c1=-b3;
c2=(3*(b2+b3));
c3=-3*(2*b2+hot+b3);
c4=(1+3*hot+b3+3*b2);
n=A_t3_period;
if (n<1) n=1;
n = 1 + 0.5*(n-1);
A_w1 = 2 / (n + 1);
A_w2 = 1 - A_w1;
n=B_t3_period_ac;
if (n<1) n=1;
n = 1 + 0.5*(n-1);
B_w1 = 2 / (n + 1);
B_w2 = 1 - B_w1;
ExtMapBuffer1[TrixNumberOfBars-1]=0;
e1x=0;e2x=0;e3x=0;e4x=0;e5x=0;e6x=0;
ExtMapBuffer2[TrixNumberOfBars-1]=0;
d1x=0;d2x=0;d3x=0;d4x=0;d5x=0;d6x=0;
// max_per=max(A_t3_period,B_t3_period_ac);
bar=TrixNumberOfBars-2;
init=false;
}
//SetLoopCount(0);
shift=bar;
while(shift>=0)
{
if ( is_A_open_price==1 ) d1 = A_w1*Open[shift] + A_w2*d1x;
else d1 = A_w1*Close[shift] + A_w2*d1x;
d2 = A_w1*d1 + A_w2*d2x;
d3 = A_w1*d2 + A_w2*d3x;
d4 = A_w1*d3 + A_w2*d4x;
d5 = A_w1*d4 + A_w2*d5x;
d6 = A_w1*d5 + A_w2*d6x;
A_t3 = c1*d6 + c2*d5 + c3*d4 + c4*d3;
if ((start==1 && shift==1) || start==-1 )
{
d1x=d1;
d2x=d2;
d3x=d3;
d4x=d4;
d5x=d5;
d6x=d6;
}
e1 = B_w1*Close[shift] + B_w2*e1x;
e2 = B_w1*e1 + B_w2*e2x;
e3 = B_w1*e2 + B_w2*e3x;
e4 = B_w1*e3 + B_w2*e4x;
e5 = B_w1*e4 + B_w2*e5x;
e6 = B_w1*e5 + B_w2*e6x;
B_t3 = c1*e6 + c2*e5 + c3*e4 + c4*e3;
if(diferential==1)
{
ExtMapBuffer1[shift]=(A_t3-A_t3_1)/A_t3_1;
ExtMapBuffer2[shift]=(A_t3-A_t3_1)/A_t3_1+(B_t3-B_t3_1)/B_t3_1;
}
else
{
if ( B_t3_1 >0 && A_t3_1>0) {
ExtMapBuffer2[shift]=(B_t3-B_t3_1)/B_t3_1;
ExtMapBuffer1[shift]=(A_t3-A_t3_1)/A_t3_1;
}
//Comment("0");
}
//Comment(" start: ",start," bar: ",bar,"\n",
//"frame: ",frame," TrixNumberOfBars:" ,TrixNumberOfBars," commodity: ",commodt ,"\n",(B_t3-B_t3_1)/B_t3_1);
if ((start==1 && shift==1) || start==-1)
{
//Comment("Bar=ghfghfgh");
A_t3_1=A_t3;
B_t3_1=B_t3;
e1x=e1;
e2x=e2;
e3x=e3;
e4x=e4;
e5x=e5;
e6x=e6;
}
shift--;
//Comment("View !!! NO?????");
}
//----
}
//+------------------------------------------------------------------+
Comments