//+------------------------------------------------------------------+ //| Version July 20, 2006 | //| Editing Nikolay Kositsin 15.06.2006 farria@mail.redcom.ru | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| T3 Taotra.mq4 | //| T3 code: Copyright © 1998, Tilson | //+------------------------------------------------------------------+ #property copyright "" #property link "" //---- отрисовка индикатора в главном окне #property indicator_chart_window //---- количество индикаторных буфферов #property indicator_buffers 6 //---- цвета индикатора #property indicator_color1 Brown #property indicator_color2 Red #property indicator_color3 Purple #property indicator_color4 Aqua #property indicator_color5 Green #property indicator_color6 Blue //---- ВХОДНЫЕ ПАРАМЕТРЫ ИНДИКАТОРА extern int MA_Period_1 = 3; // период индикатора 1 extern int MA_Period_2 = 5; // период индикатора 2 extern int MA_Period_3 = 8; // период индикатора 3 extern int MA_Period_4 = 12;// период индикатора 4 extern int MA_Period_5 = 21;// период индикатора 5 extern int MA_Period_6 = 34;// период индикатора 6 //---- extern int Shift1 = 0; // cдвиг индикатора 1 вдоль оси времени extern int Shift2 = 0; // cдвиг индикатора 2 вдоль оси времени extern int Shift3 = 0; // cдвиг индикатора 3 вдоль оси времени extern int Shift4 = 0; // cдвиг индикатора 6 вдоль оси времени extern int Shift5 = 0; // cдвиг индикатора 5 вдоль оси времени extern int Shift6 = 0; // cдвиг индикатора 6 вдоль оси времени extern double b = 0.7; //---- индикаторные буфферы double Ind_Buffer1[]; double Ind_Buffer2[]; double Ind_Buffer3[]; double Ind_Buffer4[]; double Ind_Buffer5[]; double Ind_Buffer6[]; //---- double e1[6], e2[6], e3[6], e4[6], e5[6], e6[6]; double c1, c2, c3, c4, Price, Resalt[6]; double n[6], w1[6], w2[6], b2, b3; int M[6]; //---- введение переменных для сохранения переменных e1,e2,e3,e4,e5,e6 int time2; double E1[6], E2[6], E3[6], E4[6], E5[6], E6[6]; //+------------------------------------------------------------------+ //| T3 Taotra initialization function | //+------------------------------------------------------------------+ int init() { //---- определение стиля исполнения графика SetIndexStyle(0, DRAW_LINE); SetIndexStyle(1, DRAW_LINE); SetIndexStyle(2, DRAW_LINE); SetIndexStyle(3, DRAW_LINE); SetIndexStyle(4, DRAW_LINE); SetIndexStyle(5, DRAW_LINE); //---- IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS)); //---- имя для окон данных и лэйба для субъокон IndicatorShortName("T3 Taotra"); //---- установка номера бара, начиная с которого будет отрисовываться индикатор SetIndexDrawBegin(0, 100); SetIndexDrawBegin(1, 100); SetIndexDrawBegin(2, 100); SetIndexDrawBegin(3, 100); SetIndexDrawBegin(4, 100); SetIndexDrawBegin(5, 100); //---- 6 индикаторных буфферов использованы для счёта SetIndexBuffer(0, Ind_Buffer1); SetIndexBuffer(1, Ind_Buffer2); SetIndexBuffer(2, Ind_Buffer3); SetIndexBuffer(3, Ind_Buffer4); SetIndexBuffer(4, Ind_Buffer5); SetIndexBuffer(5, Ind_Buffer6); //---- горизонтальный сдвиг индикаторных линий SetIndexShift (0, Shift1); SetIndexShift (1, Shift2); SetIndexShift (2, Shift3); SetIndexShift (3, Shift4); SetIndexShift (4, Shift5); SetIndexShift (5, Shift6); //---- установка значений индикатора, которые не будут видимы на графике SetIndexEmptyValue(0, 0); SetIndexEmptyValue(1, 0); SetIndexEmptyValue(2, 0); SetIndexEmptyValue(3, 0); SetIndexEmptyValue(4, 0); SetIndexEmptyValue(5, 0); SetIndexEmptyValue(6, 0); //---- иницмализация переменных n[0] = MA_Period_1; n[1] = MA_Period_2; n[2] = MA_Period_3; n[3] = MA_Period_4; n[4] = MA_Period_5; n[5] = MA_Period_6; //---- 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); //---- for(int iii = 0; iii < 6; iii++) { M[iii] = 4*n[iii]; if(n[iii] < 1) n[iii] = 1; n[iii] = 1 + 0.5*(n[iii] - 1); w1[iii] = 2 / (n[iii] + 1); w2[iii] = 1 - w1[iii]; } //---- завершение инициализации return(0); } //+------------------------------------------------------------------+ //| T3 Taotra iteration function | //+------------------------------------------------------------------+ int start() { //----+ Введение целых переменных и получение уже подсчитанных баров int limit, nnn, bar, MaxBar, counted_bars = IndicatorCounted(); //---- проверка на возможные ошибки if(counted_bars < 0) return(-1); //---- последний подсчитанный бар должен быть пересчитан if(counted_bars > 0) counted_bars--; //---- определение номера самого старого бара, начиная с которого будет // произедён пересчёт всех баров MaxBar = Bars - 1; //---- определение номера самого старого бара, начиная с которого будет // произедён пересчёт только новых баров limit = (Bars -1 - counted_bars); //+--- до основного цикла расчёта индикатора восстанавливаем значения // переменных, какими они были после рачёта на втором баре //+--- восстановление значений переменных int Tnew = Time[limit+1]; if(limit < MaxBar) if(Tnew == time2) for(int xxx = 0; xxx < 6; xxx++) { e1[xxx] = E1[xxx]; e2[xxx] = E2[xxx]; e3[xxx] = E3[xxx]; e4[xxx] = E4[xxx]; e5[xxx] = E5[xxx]; e6[xxx] = E6[xxx]; } else { if(Tnew > time2) Print("ERROR01"); else Print("ERROR02"); return(-1); } //---- for(bar = limit; bar >= 0; bar--) { //+--- Запоминаем значения переменных, какими они были после второго бара //+--- Сохранение значений переменных +=============+ if(bar == 1) if(((limit == 1) && (time2 != Time[2])) || (limit > 1)) { time2 = Time[2]; for(int yyy = 0; yyy < 6; yyy++) { E1[yyy] = e1[yyy]; E2[yyy] = e2[yyy]; E3[yyy] = e3[yyy]; E4[yyy] = e4[yyy]; E5[yyy] = e5[yyy]; E6[yyy] = e6[yyy]; } } //+---+============================================+ for(nnn = 0; nnn < 6; nnn++) { Price = Close[bar]; e1[nnn] = w1[nnn]*Price + w2[nnn]*e1[nnn]; e2[nnn] = w1[nnn]*e1[nnn] + w2[nnn]*e2[nnn]; e3[nnn] = w1[nnn]*e2[nnn] + w2[nnn]*e3[nnn]; e4[nnn] = w1[nnn]*e3[nnn] + w2[nnn]*e4[nnn]; e5[nnn] = w1[nnn]*e4[nnn] + w2[nnn]*e5[nnn]; e6[nnn] = w1[nnn]*e5[nnn] + w2[nnn]*e6[nnn]; //---- if(bar <= Bars - M[nnn]) Resalt[nnn] = c1*e6[nnn] + c2*e5[nnn] + c3*e4[nnn] + c4*e3[nnn]; //---- инициализация нуля else Resalt[nnn] = 0; } Ind_Buffer1[bar] = Resalt[0]; Ind_Buffer2[bar] = Resalt[1]; Ind_Buffer3[bar] = Resalt[2]; Ind_Buffer4[bar] = Resalt[3]; Ind_Buffer5[bar] = Resalt[4]; Ind_Buffer6[bar] = Resalt[5]; } //---- return(0); } //+------------------------------------------------------------------+