i-RoundPrice-T01m-mod_NonLagMA_2
Download scriptThis 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.
//+------------------------------------------------------------------+
//| 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