DayImpuls_T3_v3_001
Download scriptThis script is designed as a technical analysis tool for the MetaTrader platform, specifically created to help traders visualize price momentum and volatility trends. It functions by transforming raw price data into several different visual layers that identify specific market behaviors.
Core Logic Overview
The logic operates on three primary stages: data collection, smoothing (the T3 algorithm), and range detection.
1. Momentum Calculation The tool starts by analyzing the relationship between opening and closing prices over a specific period. It calculates the difference between these two points to determine "Impulse." If the price closed higher than it opened, the script captures that movement; if lower, it captures the opposite. This allows the tool to identify the direction and strength of the current trend regardless of absolute price levels.
2. The T3 Smoothing Engine Once the raw impulse is calculated, the script applies a sophisticated mathematical smoothing technique known as the T3 Moving Average. Unlike a standard moving average which can be "laggy" (slow to react) or "noisy" (too jumpy), the T3 algorithm uses specific weights and multiple layers of calculation to create a curve that stays very close to the actual price action while filtering out minor market fluctuations. This provides a cleaner visual of the underlying trend.
3. Dynamic Range Detection The script also scans a specific "look-back" window of data (determined by your chosen timeframe) to identify extreme highs and lows. It tracks:
- High/Low Bounds: The absolute peak and valley points within the period.
- Channel Lines: It calculates midpoints based on those peaks and valleys to help define a "trading zone."
Visual Customization Options
The logic includes a built-in toggle system that allows users to change what they see on their screen without changing the underlying math:
- Full Display: Shows both the primary Impulse data and the smoothed T3 curve.
- Impulse Only: Hides the smooth line, focusing only on the raw momentum values.
- Signal Line Only: Hides the raw impulse and only shows the smoothed T3 curve for a cleaner, less cluttered chart.
Technical Constraints
The script is specifically optimized for certain timeframes (specifically M15, M30, and M60). It includes a built-in check to ensure that the calculations remain accurate; if used on a timeframe it wasn't designed for, it will provide a notification to the user.
//+------------------------------------------------------------------+
//| DayImpuls_T3_v2.mq4.mq4
//|
//| http://www.arkworldmarket.ru/forum/showthread.php?t=966&page=2&pp=10
//+------------------------------------------------------------------+
// Modest äîáàâèë ñãëàæèâàíèå ïî ìåòîäó t3. Äîáàâèë êàíàëû.
// Ñëåãêà èçìåíèë àëãîðèòì, ÷òîáû ïîíÿòíåå âîñïðèíèìàëñÿ êîä. Íà ñóòü îðèãèíàëà íå âëèÿåò ÍÈÊÀÊ.
// Óáèðàåì ëèøíþþ ãðàôèêó, ââîäèì óïðàâëåíèå ðåæèìîì îòîáðàæåíèÿ
// DisplayMode=0 DayImpl & Sig MAÎ òîáðàæàþòñÿ DayImpuls è ñëàæåííàÿ êðèâàÿ
// DisplayMode=1 only DI Îòîáðàæàþòñÿ òîëüêî DayImpuls
// DisplayMode=2 OnlySigMA Îòîáðàæàþòñÿ òîëüêî ñëàæåííàÿ êðèâàÿ
#property copyright ""
#property link "http://www.arkworldmarket.ru/forum/showthread.php?t=966&page=2&pp=10"
//----
#property indicator_separate_window
#property indicator_buffers 7
#property indicator_color1 Indigo
#property indicator_level1 0.0
//---- input parameters
extern int per=14;
extern int d=100;
extern int t3_period=8;
extern double b=0.7;
//extern ChanPercent=70;
extern int DisplayMode=0;
//---- buffers
double DayImp[];
double t3[];
//double MaxH[];
//double MinH[];
double MaxLine[];
double MinLine[];
double ChanLineMax[];
double ChanLineMin[];
double Level[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
if (DisplayMode>2 || DisplayMode<0) DisplayMode=0;
switch( DisplayMode )
{
case 0:
SetIndexStyle(0,DRAW_LINE,EMPTY,1,Blue);
SetIndexBuffer(0,DayImp);
SetIndexStyle(1,DRAW_LINE,EMPTY,2,Red);
SetIndexBuffer(1,t3);
break;
case 1:
SetIndexStyle(0,DRAW_LINE,EMPTY,1,Blue);
SetIndexBuffer(0,DayImp);
SetIndexStyle(1,DRAW_NONE,EMPTY,2,Red);
SetIndexBuffer(1,t3);
break;
case 2:
SetIndexStyle(0,DRAW_NONE);
SetIndexBuffer(0,DayImp);
SetIndexStyle(1,DRAW_LINE,EMPTY,2,Red);
SetIndexBuffer(1,t3);
break;
default:
SetIndexStyle(0,DRAW_LINE,EMPTY,1,Blue);
SetIndexBuffer(0,DayImp);
SetIndexStyle(1,DRAW_LINE,EMPTY,2,Red);
SetIndexBuffer(1,t3);
break;
}
/*
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,DayImp);
SetIndexStyle(1,DRAW_LINE,EMPTY,2,Red);
SetIndexBuffer(1,t3);
*/
SetIndexStyle(2,DRAW_LINE,EMPTY,2,Goldenrod);
SetIndexBuffer(2,MaxLine);
SetIndexStyle(3,DRAW_LINE,EMPTY,2,Goldenrod);
SetIndexBuffer(3,MinLine);
SetIndexLabel(0,NULL); SetIndexLabel(1,NULL);SetIndexLabel(2,NULL);SetIndexLabel(3,NULL);
SetIndexLabel(4,NULL);SetIndexLabel(5,NULL);
//----
SetIndexStyle(4,DRAW_LINE,EMPTY,2,Green);
SetIndexBuffer(4,ChanLineMax);
SetIndexStyle(5,DRAW_LINE,EMPTY,2,Green);
SetIndexBuffer(5,ChanLineMin);
SetIndexStyle(6,DRAW_LINE,EMPTY,1,Black);
SetIndexBuffer(6,Level);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=1000;
int shift,i,N;
double imp,mBar,Max,Min;
double e1,e2,e3,e4,e5,e6,c1,c2,c3,c4,n,w1,w2, b2,b3,dpo,Prise,k;
//SetLoopCount(0);
// loop from first bar to current bar (with shift=0)
//----
if(Bars<=t3_period) return(0);
//---- initial zero
if(counted_bars<t3_period)
{
// for(i=1;i<=t3_period;i++) prise[Bars-i]=0.0;
for(i=1;i<=t3_period;i++) t3[Bars-i]=0.0;
}
//----
b2=b*b;
b3=b2*b;
c1=-b3;
c2=(3*(b2+b3));
c3=-3*(2*b2+b+b3);
c4=(1+3*b+b3+3*b2);
n=t3_period;
//----
if (n<1) n=1;
n=1 + 0.5*(n-1);
w1=2/(n + 1);
w2=1 - w1;
//----
int limit;
counted_bars=1000;
//---- 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;
//---- main loop
for(shift=0; shift<limit; shift++)
//for shift=Bars-1 Downto 0
{
DayImp[shift]=1;
t3[shift]=0;
//SetIndexValue(shift,0);
//SetIndexValue2(shift,0);
}
mBar=d*per;
//for shift=mBar downto per
for( shift=Bars-96-1; shift>=0; shift--)
{
imp=0;
Level[shift]=0.0;
for( i=shift ;i<=shift+per; i++)
{
imp=imp+(Open[i]-Close[i]);
}
imp=MathRound(imp/Point);
//----
if (imp==0 )imp=0.0001;
if (imp!=0 )
{
imp=-imp;
DayImp[shift]=imp;
}
//for( i=shift ;i<=shift+per; i++)
// DayImp[shift]=iMA(NULL,0,14,0,MODE_SMMA,PRICE_HIGH,i);
dpo=DayImp[shift];
e1=w1*dpo + w2*e1;
e2=w1*e1 + w2*e2;
e3=w1*e2 + w2*e3;
e4=w1*e3 + w2*e4;
e5=w1*e4 + w2*e5;
e6=w1*e5 + w2*e6;
t3[shift]=c1*e6 + c2*e5 + c3*e4 + c4*e3;
//----
switch( Period() )
{
case 1: N=1440; break;
case 5: N=288; break;
case 15: N=96; break;
case 30: N=48; break;
case 60: N=24; break;
default: N=0; break;
}
if (N==0) {Alert("Work only in M15,M30,M60 timeframes");return(0);}
Max=DayImp[shift+N-1];
Min=DayImp[shift+N-1];
for( i=shift ;i<=shift+N-1; i++)
{
if (Max<DayImp[i]) Max=DayImp[i];
if (Min>DayImp[i]) Min=DayImp[i];
}
//MaxH[shift]=Max;//+(Max-Min)*(1-kChannel);
//MinH[shift]=Min;//+(Max-Min)*(kChannel);
MaxLine[shift]=Max;//+(Max-Min)*(1-kChannel);
MinLine[shift]=Min;//+(Max-Min)*(kChannel);
//k=((100-ChanPercent)/2)/100;
ChanLineMax[shift]=Max/2; // Min+(Max-Min)*(1-k);
ChanLineMin[shift]=Min/2; //Min+(Max-Min)*(k);
}
//----
//----
return(0);
}
//+------------------------------------------------------------------+
Comments