1_v3
Download scriptThe logic of this script is designed to analyze market price movements by calculating a specific type of smoothed trend data. Instead of looking at just one set of numbers, it processes the market history through four distinct layers of calculation simultaneously.
Here is a breakdown of how the logic functions:
Core Mathematical Approach
The script uses a weighted smoothing technique. It takes the closing prices of the market and applies a specific mathematical formula (based on configurable periods and coefficients) to "smooth out" the noise. By doing this, it attempts to identify the underlying momentum of the price rather than reacting to every small tick or fluctuation.
The Four-Layer Analysis
The script performs this smoothing process four times independently. Each layer is unique because it uses different user-defined settings:
- Different Periods: Each layer looks at a different amount of historical data (e.g., a short timeframe vs. a longer timeframe).
- Different Smoothing Weights: Each layer applies a different intensity of "smoothing," allowing the script to see various levels of trend sensitivity.
Trend Detection and Visualization
For every one of these four layers, the logic performs a "comparison check":
- Directional Logic: It compares the current calculated value against the previous value.
- Movement Identification:
- If the value is currently higher than it was in the previous step, it identifies this as an Upward movement.
- If the value is lower than it was in the previous step, it identifies this as a Downward movement.
- Visual Feedback: The script translates these findings into visual lines on your chart. It specifically distinguishes between different trend types by using different colors and line styles, allowing you to see multiple layers of market momentum at once.
Real-Time Status Reporting
In addition to the visual lines, the script provides a live text summary on the chart. This summary displays:
- The specific settings currently being used for each of the four layers.
- A clear text label (such as "UP" or "DOWN") for the direction of each layer based on the most recent price movement.
In summary, this script acts as a multi-layered trend filter. It smooths out market noise through four different lenses to help you visualize whether the current price momentum is leaning upwards or downwards across various time horizons and sensitivities.
//+------------------------------------------------------------------+
//| 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 8
#property indicator_color1 Aqua
#property indicator_color2 Red
#property indicator_color3 MediumTurquoise
#property indicator_color4 DarkOrange
#property indicator_color5 DodgerBlue
#property indicator_color6 Chocolate
#property indicator_color7 Blue
#property indicator_color8 Gold
//------- Âíåøíèå ïàðàìåòðû èíäèêàòîðà -------------------------------
extern int t3_period1=5;
extern double b1=0.2;
extern int t3_period2=5;
extern double b2=0.3;
extern int t3_period3=5;
extern double b3=0.4;
extern int t3_period4=5;
extern double b4=0.5;
extern int mBar=300;
//------- Ãëîáàëüíûå ïåðåìåííûå èíäèêàòîðà ---------------------------
double dBuf0[], dBuf1[];
double dBuf2[], dBuf3[];
double dBuf4[], dBuf5[];
double dBuf6[], dBuf7[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void init()
{
SetIndexBuffer (0, dBuf0);
SetIndexEmptyValue(0, EMPTY_VALUE);
SetIndexStyle (0, DRAW_LINE,1);
SetIndexBuffer (1, dBuf1);
SetIndexEmptyValue(1, EMPTY_VALUE);
SetIndexStyle (1, DRAW_LINE,1);
SetIndexBuffer (2, dBuf2);
SetIndexEmptyValue(2, EMPTY_VALUE);
SetIndexStyle (2, DRAW_LINE,2);
SetIndexBuffer (3, dBuf3);
SetIndexEmptyValue(3, EMPTY_VALUE);
SetIndexStyle (3, DRAW_LINE,2);
SetIndexBuffer (4, dBuf4);
SetIndexEmptyValue(4, EMPTY_VALUE);
SetIndexStyle (4, DRAW_LINE,3);
SetIndexBuffer (5, dBuf5);
SetIndexEmptyValue(5, EMPTY_VALUE);
SetIndexStyle (5, DRAW_LINE,3);
SetIndexBuffer (6, dBuf6);
SetIndexEmptyValue(6, EMPTY_VALUE);
SetIndexStyle (6, DRAW_LINE,4);
SetIndexBuffer (7, dBuf7);
SetIndexEmptyValue(7, EMPTY_VALUE);
SetIndexStyle (7, DRAW_LINE,4);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
void start()
{
bool ft1=True;
double e11, e21, e31, e41, e51, e61, c11, c21, c31, c41, n1, w11, w21, b21, b31;
double t31[];
int LoopBegin1, shift1;
bool ft2=True;
double e12, e22, e32, e42, e52, e62, c12, c22, c32, c42, n2, w12, w22, b22, b32;
double t32[];
int LoopBegin2, shift2;
bool ft3=True;
double e13, e23, e33, e43, e53, e63, c13, c23, c33, c43, n3, w13, w23, b23, b33;
double t33[];
int LoopBegin3, shift3;
bool ft4=True;
double e14, e24, e34, e44, e54, e64, c14, c24, c34, c44, n4, w14, w24, b24, b34;
double t34[];
int LoopBegin4, shift4;
if (mBar==0) LoopBegin1=Bars-t3_period1-1;
else LoopBegin1=mBar;
LoopBegin1=MathMin(LoopBegin1, Bars-t3_period1-1);
ArrayResize(t31, LoopBegin1);
if (ft1)
{
b21=b1*b1;
b31=b21*b1;
c11=-b31;
c21=(3*(b21+b31));
c31=-3*(2*b21+b1+b31);
c41=(1+3*b1+b31+3*b21);
n1=t3_period1;
if (n1<1) n1=1;
n1=1+0.5*(n1-1);
w11=2/(n1+1);
w21=1-w11;
ft1=False;
}
for(shift1=LoopBegin1; shift1>=0; shift1--)
{
e11=w11*Close[shift1]+w21*e11;
e21=w11*e11+w21*e21;
e31=w11*e21+w21*e31;
e41=w11*e31+w21*e41;
e51=w11*e41+w21*e51;
e61=w11*e51+w21*e61;
t31[shift1]=c11*e61+c21*e51+c31*e41+c41*e31;
if (t31[shift1+1]<=t31[shift1]) dBuf0[shift1]=t31[shift1]; else dBuf0[shift1]=0;
if (t31[shift1+1]>t31[shift1]) dBuf1[shift1]=t31[shift1]; else dBuf1[shift1]=0;
}
if (mBar==0) LoopBegin2=Bars-t3_period2-1;
else LoopBegin2=mBar;
LoopBegin2=MathMin(LoopBegin2, Bars-t3_period2-1);
ArrayResize(t32, LoopBegin2);
if (ft2) {
b22=b2*b2;
b32=b22*b2;
c12=-b32;
c22=(3*(b22+b32));
c32=-3*(2*b22+b2+b32);
c42=(1+3*b2+b32+3*b22);
n2=t3_period2;
if (n2<1) n2=1;
n2=1+0.5*(n2-1);
w12=2/(n2+1);
w22=1-w12;
ft2=False;
}
for(shift2=LoopBegin2; shift2>=0; shift2--)
{
e12=w12*Close[shift2]+w22*e12;
e22=w12*e12+w22*e22;
e32=w12*e22+w22*e32;
e42=w12*e32+w22*e42;
e52=w12*e42+w22*e52;
e62=w12*e52+w22*e62;
t32[shift2]=c12*e62+c22*e52+c32*e42+c42*e32;
if (t32[shift2+1]<=t32[shift2]) dBuf2[shift2]=t32[shift2]; else dBuf2[shift2]=0;
if (t32[shift2+1]>t32[shift2]) dBuf3[shift2]=t32[shift2]; else dBuf3[shift2]=0;
}
if (mBar==0) LoopBegin3=Bars-t3_period3-1;
else LoopBegin3=mBar;
LoopBegin3=MathMin(LoopBegin3, Bars-t3_period3-1);
ArrayResize(t33, LoopBegin3);
if (ft3)
{
b23=b3*b3;
b33=b23*b3;
c13=-b33;
c23=(3*(b23+b33));
c33=-3*(2*b23+b3+b33);
c43=(1+3*b3+b33+3*b23);
n3=t3_period3;
if (n3<1) n3=1;
n3=1+0.5*(n3-1);
w13=2/(n3+1);
w23=1-w13;
ft3=False;
}
for(shift3=LoopBegin3; shift3>=0; shift3--)
{
e13=w13*Close[shift3]+w23*e13;
e23=w13*e13+w23*e23;
e33=w13*e23+w23*e33;
e43=w13*e33+w23*e43;
e53=w13*e43+w23*e53;
e63=w13*e53+w23*e63;
t33[shift3]=c13*e63+c23*e53+c33*e43+c43*e33;
if (t33[shift3+1]<=t33[shift3]) dBuf4[shift3]=t33[shift3]; else dBuf4[shift3]=0;
if (t33[shift3+1]>t33[shift3]) dBuf5[shift3]=t33[shift3]; else dBuf5[shift3]=0;
}
if (mBar==0) LoopBegin4=Bars-t3_period4-1;
else LoopBegin4=mBar;
LoopBegin4=MathMin(LoopBegin4, Bars-t3_period4-1);
ArrayResize(t34, LoopBegin4);
if (ft4)
{
b24=b4*b4;
b34=b24*b4;
c14=-b34;
c24=(3*(b24+b34));
c34=-3*(2*b24+b4+b34);
c44=(1+3*b4+b34+3*b24);
n4=t3_period4;
if (n4<1) n4=1;
n4=1+0.5*(n4-1);
w14=2/(n4+1);
w24=1-w14;
ft4=False;
}
for(shift4=LoopBegin4; shift4>=0; shift4--)
{
e14=w14*Close[shift4]+w24*e14;
e24=w14*e14+w24*e24;
e34=w14*e24+w24*e34;
e44=w14*e34+w24*e44;
e54=w14*e44+w24*e54;
e64=w14*e54+w24*e64;
t34[shift4]=c14*e64+c24*e54+c34*e44+c44*e34;
if (t34[shift4+1]<=t34[shift4]) dBuf6[shift4]=t34[shift4]; else dBuf6[shift4]=0;
if (t34[shift4+1]>t34[shift4]) dBuf7[shift4]=t34[shift4]; else dBuf7[shift4]=0;
}
if (dBuf0[0]!=0) string z1="UP";
if (dBuf1[0]!=0) z1="DOWN";
if (dBuf2[0]!=0) string z2="UP";
if (dBuf3[0]!=0) z2="DOWN";
if (dBuf4[0]!=0) string z3="UP";
if (dBuf5[0]!=0) z3="DOWN";
if (dBuf6[0]!=0) string z4="UP";
if (dBuf7[0]!=0) z4="DOWN";
Comment(TimeToStr(iTime(NULL,0,0),TIME_MINUTES),
"\nÏåðâûé t3=",t3_period1," b=",b1, " íàïðàâëåíèå ",z1,
"\nÏåðâûé t3=",t3_period2," b=",b2, " íàïðàâëåíèå ",z2,
"\nÏåðâûé t3=",t3_period3," b=",b3, " íàïðàâëåíèå ",z3,
"\nÏåðâûé t3=",t3_period4," b=",b4, " íàïðàâëåíèå ",z4);
}
//+------------------------------------------------------------------+
Comments