#include <stdlib.mqh>
//+------------------------------------------------------------------+
//|                                                 DayTrend-T01.mq4 |
//|                                                                  |
//|                                                                  |
//|                                        Converted by Mql2Mq4 v1.0 |
//|                                            http://yousky.free.fr |
//|                                    Copyright © 2006, Yousky Soft |
//+------------------------------------------------------------------+

#property copyright " Author := Copyright © 2006, HomeSoft-Tartan Corp."
#property link      " spiky@transkeino.ru"

#property indicator_separate_window
#property indicator_color1 Gold
#property indicator_buffers 2
#property indicator_color2 Red

//+------------------------------------------------------------------+
//| Common External variables                                        |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| External variables                                               |
//+------------------------------------------------------------------+
extern double t3_period = 14;
extern double b = 0.7;
extern double ppor = 50;
extern double mpor = -50;
extern double mBar = 300;
extern double sm = 6;

//+------------------------------------------------------------------+
//| Special Convertion Functions                                     |
//+------------------------------------------------------------------+

int LastTradeTime;
double ExtHistoBuffer[];
double ExtHistoBuffer2[];

void SetLoopCount(int loops)
{
}

void SetIndexValue(int shift, double value)
{
  ExtHistoBuffer[shift] = value;
}

void SetIndexValue2(int shift, double value)
{
  ExtHistoBuffer2[shift] = value;
}

bool MoveObject(string name, int type, datetime Atime, double Aprice, datetime Atime2 = 0, double Aprice2 = 0, color Acolor = CLR_NONE, int Aweight = 0, int Astyle = 0)
{
    if (ObjectFind(name) != -1)
    {
      int OType = ObjectType(name);

      if ((OType == OBJ_VLINE) ||
         (OType == OBJ_HLINE) ||
         (OType == OBJ_TRENDBYANGLE) ||
         (OType == OBJ_TEXT) ||
         (OType == OBJ_ARROW) ||
         (OType == OBJ_LABEL))
      {
        return(ObjectMove(name, 0, Atime, Aprice));
      }

      if ((OType == OBJ_GANNLINE) ||
         (OType == OBJ_GANNFAN) ||
         (OType == OBJ_GANNGRID) ||
         (OType == OBJ_FIBO) ||
         (OType == OBJ_FIBOTIMES) ||
         (OType == OBJ_FIBOFAN) ||
         (OType == OBJ_FIBOARC) ||
         (OType == OBJ_RECTANGLE) ||
         (OType == OBJ_ELLIPSE) ||
         (OType == OBJ_CYCLES) ||
         (OType == OBJ_TREND) ||
         (OType == OBJ_STDDEVCHANNEL) ||
         (OType == OBJ_REGRESSION))
      {
        return(ObjectMove(name, 0, Atime, Aprice) && ObjectMove(name, 1, Atime2, Aprice2));
      }


    }
    else
    {
      return(ObjectCreate(name, type, 0, Atime, Aprice, Atime2, Aprice2, 0, 0) && ObjectSet(name, OBJPROP_COLOR, Acolor));
    }
}

//+------------------------------------------------------------------+
//| End                                                              |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Initialization                                                   |
//+------------------------------------------------------------------+

int init()
{
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID);
   SetIndexBuffer(0, ExtHistoBuffer);
   SetIndexStyle(1, DRAW_LINE, STYLE_SOLID);
   SetIndexBuffer(1, ExtHistoBuffer2);
   return(0);
}
int start()
{
//+------------------------------------------------------------------+
//| Local variables                                                  |
//+------------------------------------------------------------------+
double e1 = 0;
double e2 = 0;
double e3 = 0;
double e4 = 0;
double e5 = 0;
double e6 = 0;
double c1 = 0;
double c2 = 0;
double c3 = 0;
double c4 = 0;
double n = 0;
double w1 = 0;
double w2 = 0;
double b2 = 0;
double b3 = 0;
int shift = 0;
int cnt = 0;
double per = 0;
double trend = 0;
double top = 0;
double oldtop = 0;
double MaxH = 0;
double MinL = 0;
double MidL = 0;
double trig = 0;
double t3 = 0;
bool ft = true;
//-----------------------------

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;} 


SetLoopCount(0);

// loop from first bar to current bar (with shift=0)

for(shift=Bars-1;shift>=0 ;shift--){ SetIndexValue(shift, 0);SetIndexValue2(shift, 0);} 
per=24*60/Period();
for(shift=mBar ;shift>=0 ;shift--){ 
MaxH=0;MinL=1000;trend=0; 
for(cnt=shift+sm;cnt<=shift+per+sm ;cnt++){ 
if( MaxH<High[cnt] ) MaxH=High[cnt];
if( MinL>Low[cnt] ) MinL=Low[cnt];oldtop=Close[cnt];} 
top=Close[shift];MidL=MathRound(((MaxH-MinL)/Point)/2); 
trend=MathRound((top-oldtop)/Point);

e1 = w1*trend + 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 = c1*e6 + c2*e5 + c3*e4 + c4*e3;

  if( t3 == 0 ) t3=0.0001;

SetIndexValue(shift,t3);
if( t3 == 0 ) trend=0.00001;
if( t3>0 ) trig=ppor;
if( t3<0 ) trig=mpor;


SetIndexValue2(shift,trig);
if( shift == 0 ) MoveObject("MIDL",OBJ_HLINE,Time[30],MidL,Time[0],MidL,Gold,1,STYLE_DOT);}   return(0);
}