i-RoundPrice-T01m-mod_NonLagMA_2

Download script
Author: Copyright � 2006, HomeSoft Tartan Corp.
i-RoundPrice-T01m-mod_NonLagMA_2

This script is a custom technical analysis tool designed to help traders identify specific trends and price movements by smoothing out market "noise." Instead of looking at raw, jagged price action, it uses a mathematical approach to calculate a customized moving average that emphasizes certain parts of the data over others.

How the Logic Works

1. Data Weighting (The "MAB" Calculation) The core of this script is a specialized moving average. Unlike standard moving averages that treat every past price point as equally important, this tool applies a specific weighting system. It uses trigonometric functions (sine waves) and custom coefficients to decide which historical data points should carry more weight in the current calculation. This allows the indicator to focus on specific cycles within the market data rather than just looking at a simple average of the last few bars.

2. Trend Smoothing and Filtering Once the primary weighted average is calculated, the script passes that data through a secondary filtering process. It uses a series of mathematical constants to smooth the line even further. This helps eliminate minor fluctuations (volatility) so that only the significant directional moves remain visible on the chart.

3. Directional Signaling The script evaluates the relationship between the current calculated value and the previous one. It looks for changes in direction:

  • Downward Movement: If the current trend value is lower than or equal to the previous one, it identifies this as a specific type of price action.
  • Upward Movement: If the current trend value is higher than the previous one, it identifies this as an opposing movement.

Visual Representation on Chart

The script communicates these findings by drawing two distinct lines (or signals) on your chart:

  • Aqua Line: Represents areas where the calculated trend is moving downward or holding steady.
  • Red Line: Represents areas where the calculated trend is pushing upward.

By observing where these lines appear and disappear, a trader can get a clearer picture of the underlying market momentum, filtered through a customized mathematical lens that prioritizes specific price cycles.

Indicators Used
Moving average indicator
10 Views
0 Downloads
0 Favorites
i-RoundPrice-T01m-mod_NonLagMA_2
//+------------------------------------------------------------------+
//|                                            i-RoundPrice-T01m.mq4 |
//|          25.07.2006  Translated on MT4 by Êèì Èãîðü Â. aka KimIV |
//|                                              http://www.kimiv.ru |
//+------------------------------------------------------------------+
/*[[
	Name := RoundPrice
	Author := Copyright © 2006, HomeSoft Tartan Corp.
	Link := spiky@transkeino.ru
	Separate Window := No
	First Color := Lime
	First Draw Type := Line
	First Symbol := 217
	Use Second Data := Yes
	Second Color := Red
	Second Draw Type := Line
	Second Symbol := 218
]]*/
#property copyright "Copyright © 2006, HomeSoft Tartan Corp."
#property link      "spiky@transkeino.ru"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Aqua
#property indicator_color2 Red

//------- Âíåøíèå ïàðàìåòðû èíäèêàòîðà -------------------------------
extern int t3_period=21;
extern double b=0.7;

extern int Price4ma =  0;
extern int Len      = 39;
extern double Cycle =  4;
extern int Phase    =  2;
extern double Level =  0.3;
extern double Coeff =  7;

extern int mBar=300;

//------- Ãëîáàëüíûå ïåðåìåííûå èíäèêàòîðà ---------------------------
double dBuf0[], dBuf1[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void init() {
  SetIndexBuffer    (0, dBuf0);
  SetIndexEmptyValue(0, EMPTY_VALUE);
  SetIndexStyle     (0, DRAW_LINE,EMPTY,2);

  SetIndexBuffer    (1, dBuf1);
  SetIndexEmptyValue(1, EMPTY_VALUE);
  SetIndexStyle     (1, DRAW_LINE,EMPTY,2);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
void start() {
  bool   ft=True;
  double e1, e2, e3, e4, e5, e6, c1, c2, c3, c4, n, w1, w2, b2, b3;
  double t3[];
  double MAB[];
  int    LoopBegin, shift;

  int    i,limit, num;
  double alfa, beta, t, AvgRange,Weight, step,step1,g;
  double pi = 3.1415926535;    
  
  limit=mBar; 
  
  LoopBegin=mBar;

  ArrayResize(t3,mBar);
  ArrayResize(MAB,mBar);
  step = 2.0*Cycle/(Len-1);
  num = MathRound((Len-1)/(2.0*Cycle))+Phase;
     
  for(shift=limit;shift>=0;shift--) 
  {	
   Weight=0;AvgRange=0;
   
     for (i=0;i<=Len-1;i++)
	   { 
         if ( i <= num )
         step = 1.0/num;  
         else
         step = (2.0*Cycle-1)/(Len-1-num);
      
      t = i*step;
      g = 1.0/(Coeff*t+1);   
      if (g > Level ) g = 1;
      beta = MathSin(pi*(t + 0.5));
      alfa = g * beta;
      AvgRange = AvgRange + alfa*iMA(NULL,0,1,0,MODE_SMA,Price4ma,shift+i);
      Weight =Weight + alfa;
      
      }
	
   if (Weight > 0) MAB[shift]=AvgRange/Weight;
  }
	
  if (ft) {
    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;
    ft=False;
  }

  for (shift=LoopBegin; shift>=0; shift--) {
    e1=w1*MAB[shift]+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;
    Comment ("MAB=",MAB[shift]," t3=",t3[shift]);
    if (t3[shift+1]<=t3[shift]) dBuf0[shift]=t3[shift]; else dBuf0[shift]=0;
    if (t3[shift+1]>t3[shift]) dBuf1[shift]=t3[shift]; else dBuf1[shift]=0;
  }
}
//+------------------------------------------------------------------+

Comments