DayImpuls_T3_v3 BigJoe
Download scriptThis script is designed as a custom technical analysis tool for the MetaTrader platform, primarily intended to identify and visualize price momentum and volatility. It combines two distinct mathematical approaches—the T3 moving average and a custom "Day Impulse" calculation—to help traders perceive market trends and potential reversals.
Core Components and Logic
1. Momentum Calculation (Day Impulse) The script begins by calculating an "Impulse" value based on the relationship between opening and closing prices over a specific set of bars. By summing the differences between these prices, it determines the immediate direction of the market's movement. It then flips this value to create a dedicated indicator line that highlights price momentum in a way that is easier for a user to interpret visually than raw price action.
2. The T3 Smoothing Filter To provide a smoother view of the data, the script applies a "T3" calculation. The T3 is a sophisticated moving average known for reducing "noise" (random price fluctuations) while maintaining its ability to stay close to the actual price action. The script takes the Day Impulse data and runs it through a series of weighted calculations (using coefficients based on user-defined parameters) to produce a smooth, flowing curve that represents the underlying trend.
3. Dynamic Range Channels In addition to tracking trends, the script monitors volatility by identifying high and low points over a specific time window. Depending on the timeframe you are viewing (such as 15-minute, 30-minute, or 60-minute charts), the script automatically adjusts how many bars it looks back at to calculate these extremes. It then plots:
- Maximum/Minimum Lines: The absolute highest and lowest points reached within that window.
- Median Channels: A balanced midpoint calculation based on those high and low extremes.
User Customization and Display Options
The script includes a "Display Mode" feature that allows the user to choose what information is most important for their specific trading style:
- Mode 0 (Full View): Shows both the Day Impulse momentum and the smoothed T3 curve simultaneously.
- Mode 1 (Impulse Only): Hides the smoothed curve, showing only the raw momentum data.
- Mode 2 (Smooth Trend Only): Hides the momentum data, showing only the smoothed trend line for a cleaner look.
Technical Constraints
For the dynamic channel logic to function correctly, the script is specifically optimized for certain timeframes (M15, M30, and M60). It includes an internal check to ensure that these calculations are applied accurately based on the number of minutes present in those specific periods.
//+------------------------------------------------------------------+
//| 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 NumBars = 500;
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< NumBars) t3_period=Bars;
else t3_period=Bars;
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