Author: Copyright � 2006, HomeSoft Tartan Corp.
1_v1

This script is designed to work as a technical indicator on a trading platform, specifically intended to help users visualize price trends and momentum. It functions by performing several mathematical calculations simultaneously to identify whether the current market direction is moving upward or downward across different timeframes or sensitivities.

Core Logic Overview

The script processes historical price data to generate four distinct sets of trend analysis. Each set uses a slightly different configuration based on user-defined settings, which allows for a multi-layered view of market behavior.

Here is how the logic flows:

1. Data Processing and Smoothing The script looks at the closing prices of assets over a specific period. Rather than looking at raw, volatile price changes, it applies a "smoothing" technique. This helps filter out minor market "noise" so that the underlying trend becomes clearer to the user. It uses a weighted calculation where recent data points are balanced against previous ones to create a fluid movement line.

2. Multi-Layered Trend Analysis The script executes this calculation four separate times (referred to in the code as four different sets). Each set is tuned using two main variables:

  • Period: This determines the length of time the script looks back at to calculate the trend.
  • Beta/Coefficient: This adjusts the sensitivity of the calculation, determining how aggressively or conservatively the script reacts to price changes.

By running these four different configurations at once, the indicator can show you the "big picture" (long-term trends) alongside "micro-movements" (short-term fluctuations).

3. Directional Identification (Up vs. Down) For every one of the four trend sets, the script performs a comparison:

  • It checks if the current calculated value is higher than the previous one.
  • If it is higher, it identifies the movement as an UP trend.
  • If it is lower, it identifies it as a DOWN trend.

4. Visual Representation and Reporting The script then displays this information on your trading chart in two ways:

  • On-Chart Lines: It draws visual lines that represent these calculations. Based on the logic, certain buffers are used to highlight specific directional movements (e.g., distinguishing between rising and falling slopes).
  • Live Commentary: In the corner of the trading screen, the script provides a real-time text summary. This summary lists the current status of all four trend analyses simultaneously, clearly labeling each one as "UP" or "DOWN."

Summary for the User

Think of this script as a "multi-lens" telescope. Instead of just showing you one line telling you where the price is going, it shows you four different types of lines. Some might show you the fast, twitchy movements of the market, while others show you the slow, steady path of the overall trend. The text on your screen tells you at a glance whether all those "lenses" agree that the price is moving up or down.

Price Data Components
Series array that contains open time of each bar
8 Views
0 Downloads
0 Favorites
1_v1
//+------------------------------------------------------------------+
//|                                            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