DayImpuls1_v1

Download script
Author:
DayImpuls1_v1

This technical indicator is designed to provide traders with a visual representation of market momentum and price trends by utilizing two distinct mathematical approaches combined into one display. It functions by analyzing historical price data to identify "impulses" and smoothing them out to highlight the underlying direction of the market.

Core Logic Components

1. Impulse Detection (DayImpuls) The script begins by calculating the price difference between the opening and closing prices over a specific look-back period. This represents the "impulse" or the raw movement of the market during that timeframe. The logic ensures that these values are normalized, providing a baseline of how much the price is pushing in one direction versus another.

2. The T3 Smoothing Algorithm To filter out market "noise" (minor, erratic price fluctuations), the script applies a specialized smoothing technique known as the T3 algorithm. Unlike standard moving averages that can be lagging or too simple, the T3 logic uses complex coefficients to create a very smooth curve that stays tight to the actual price action. This allows the user to see the primary trend without being distracted by small-scale volatility.

3. Dynamic Range and Channels Beyond just showing a trend line, the script identifies specific "zones" based on historical extremes. It looks back at a significant number of previous bars (the amount of which automatically adjusts depending on your current chart timeframe) to find the highest and lowest impulse points.

  • It then establishes maximum and minimum boundaries.
  • It calculates a middle channel based on these extremes. These channels help traders visualize the "trading range" and identify when the price is reaching overextended levels compared to recent history.

User Experience & Display Options

The script includes a built-in toggle system that allows you to customize what information appears on your chart:

  • Full View: Displays both the raw impulse data and the smoothed T3 curve simultaneously.
  • Impulse Only: Hides the smooth curve, focusing strictly on the raw momentum.
  • Smooth Curve Only: Hides the impulse data to provide a cleaner look at the primary trendline.

Timeframe Compatibility

The logic is specifically optimized for intermediate trading timeframes (M15, M30, and M60). It includes an internal check to ensure that the calculation of price extremes remains accurate; if used on unsupported timeframes, the script will notify the user rather than providing potentially misleading data.

Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
14 Views
0 Downloads
0 Favorites
DayImpuls1_v1
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//| DayImpuls_T3_v2.mq4.mq4
//| 
//| http://www.arkworldmarket.ru/forum/showthread.php?t=966&page=2&pp=10 
//+------------------------------------------------------------------+
// Modest äîáàâèë ñãëàæèâàíèå ïî ìåòîäó t3. Äîáàâèë êàíàëû.
// Ñëåãêà èçìåíèë àëãîðèòì, ÷òîáû ïîíÿòíåå âîñïðèíèìàëñÿ êîä. Íà ñóòü îðèãèíàëà íå âëèÿåò ÍÈÊÀÊ.
// Óáèðàåì ëèøíþþ ãðàôèêó, ââîäèì óïðàâëåíèå ðåæèìîì îòîáðàæåíèÿ
// DisplayMode=0 Îòîáðàæàþòñÿ DayImpuls è ñëàæåííàÿ êðèâàÿ
// DisplayMode=1 Îòîáðàæàþòñÿ òîëüêî DayImpuls 
// DisplayMode=2 Îòîáðàæàþòñÿ òîëüêî ñëàæåííàÿ êðèâàÿ
#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(5,DRAW_LINE,EMPTY,2,White);
         SetIndexBuffer(5,DayImp); 
         SetIndexStyle(6,DRAW_LINE,EMPTY,2,Red);
         SetIndexBuffer(6,t3);
         break;
      
      case 1: 
         SetIndexStyle(5,DRAW_LINE,EMPTY,2,White);
         SetIndexBuffer(5,DayImp); 
         SetIndexStyle(6,DRAW_NONE,EMPTY,2,Red);
         SetIndexBuffer(6,t3);
         break;
      case 2: 
         SetIndexStyle(5,DRAW_NONE);
         SetIndexBuffer(5,DayImp); 
         SetIndexStyle(6,DRAW_LINE,EMPTY,2,Red);
         SetIndexBuffer(6,t3);
         break;
      
      
      default: 
         SetIndexStyle(5,DRAW_LINE,EMPTY,2,White);
         SetIndexBuffer(5,DayImp); 
         SetIndexStyle(6,DRAW_LINE,EMPTY,2,Red);
         SetIndexBuffer(6,t3);
         break;
      }
   /*
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,DayImp);
   SetIndexStyle(1,DRAW_LINE,EMPTY,2,Red);
   SetIndexBuffer(1,t3);
   */   
   SetIndexStyle(0,DRAW_LINE,EMPTY,1,Goldenrod);
   SetIndexBuffer(0,MaxLine);
   SetIndexStyle(1,DRAW_LINE,EMPTY,1,Goldenrod);
   SetIndexBuffer(1,MinLine);
   SetIndexLabel(0,NULL); SetIndexLabel(1,NULL);SetIndexLabel(2,NULL);SetIndexLabel(3,NULL);
   SetIndexLabel(4,NULL);SetIndexLabel(5,NULL);
   
   SetIndexStyle(2,DRAW_LINE,EMPTY,1,DarkGreen);
   SetIndexBuffer(2,ChanLineMax);
   SetIndexStyle(3,DRAW_LINE,EMPTY,1,DarkGreen);
   SetIndexBuffer(3,ChanLineMin);
   SetIndexStyle(4,DRAW_LINE,EMPTY,1,Blue);
   SetIndexBuffer(4,Level);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   
   
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)


//===========================================  Ýòî ÿ óæå íàêîëáàñèë t3: ===============
//=========================================== Âçÿò òèïîâîé êîä          ===============
   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;
//----
//================= Êîíåö   ====================  Ýòî ÿ óæå íàêîëáàñèë t3: ===============

int limit;
    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-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);
  
  // ==================================== Ýòî ÿ óæå íàêîëáàñèë t3: ========================
  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;
  // ==========^^^====================== Ýòî ÿ óæå íàêîëáàñèë t3: ====^^^================
      switch ( Period() )
      {
      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