Модифицированный технический индикатор ZigZag

Metatrader, MQL4

 

Технический индикатор ZigZag весьма популярен среди народа и довольно хорош, но иногда необходимо, чтобы он учитывал все «зубчики» на графике. Ниже приведенный индикатор именно это и делает, вплоть до вывода в текстовый файл.

 

 

// Улучшенный ЗигЗаг

//

//+------------------------------------------------------------------+

#property copyright "Shumi"

#property link      "http://apsheronsk.bozo.ru"

 

int max_lenght_size = 1;// максимальное количество направлений в одну сторону при тенденции в другую. В принципе - период дискретизации

double sea[50000][3]; // 0-й индекс = катет высота, 1-й индекс = катет длины, 2-й индекс = угол, 3-й индекс = гипотенуза

datetime tt[50000];

int    count = 0;

double height_koef = 3600; // масштабирование

//+------------------------------------------------------------------+

int start()

{

   int i, up=0, down=0, trigger_up = 0, trigger_down = 0, up_i, down_i;

   int first=0; // кто первый - пик (=1) или впадина (=-1)

   int kolvo = Bars;

   Alert(kolvo);

   datetime time_down, time_up;

  

   double cur_up = High[kolvo];

   double cur_down = High[kolvo];

  

   for(i=kolvo-1;i>0;i--)

   {

      if(High[i] > cur_up)

      {        

         cur_up = High[i]; time_up = Time[i]; up_i = i;

         up++;

         if((up > max_lenght_size) && (trigger_down == 0))         

         {

            ObjectCreate(DS(i,0), OBJ_ARROW, 0, time_down, cur_down); // стрелка вниз

            ObjectSet(DS(i,0), OBJPROP_ARROWCODE, 242); 

            //Alert("down ", time_down, " || ", iLow(Symbol(),Period(),down_i));

            if(count != 0)

            {

               sea[count][0] = (iHigh(Symbol(),Period(),tt[count-1]) - iLow(Symbol(),Period(),down_i));  // высота

               sea[count][1] = tt[count-1] - down_i;  // длина по времени

               if(sea[count][1] != 0)

                  {sea[count][2] = MathArctan(sea[count][0]/(sea[count][1]/height_koef))*180/3.14159;}  // угол 

               else {sea[count][2] = 0;}

               tt[count] = down_i; // время

            }      

            //Alert("up высота= ", sea[count][0]," || длина= ", sea[count][1]," || угол = ", sea[count][2]); 

                 

            down = 0; cur_down = Low[i]; time_down = Time[i]; down_i = i;

            trigger_down = 1; trigger_up = 0;

            if(first == 0) {first = 1;}

            count++;

         }

         else if(up > max_lenght_size)

         {

            //Alert("up>lenght :i=", i);

            down = 0; cur_down = Low[i]; time_down = Time[i];           

         }   

           

      }    

      if(Low[i] < cur_down)

      {

         cur_down = Low[i]; time_down = Time[i]; down_i = i;

         down++;

         if((down > max_lenght_size) && (trigger_up == 0))         

         {

            ObjectCreate(DS(i,0), OBJ_ARROW, 0, time_up, cur_up); // стрелка вверх

            ObjectSet(DS(i,0), OBJPROP_ARROWCODE, 241);

            //Alert(" up ", time_up, " || ", iHigh(Symbol(),Period(),up_i));

            if(count != 0)

            {

               sea[count][0] = (iLow(Symbol(), Period(), tt[count-1]) - iHigh(Symbol(),Period(),up_i))*(-1);   // высота

               sea[count][1] = tt[count-1] - up_i;  // длина по времени

               if(sea[count][1] != 0)

                  {sea[count][2] = MathArctan(sea[count][0]/(sea[count][1]/height_koef))*180/3.14159;}  // угол 

               else {sea[count][2] = 0;}

               tt[count] = up_i; // время

            }  

            //Alert("down высота= ", sea[count][0]," || длина= ", sea[count][1]," || угол = ", sea[count][2]);                                                                 

            up = 0; cur_up = High[i]; time_up = Time[i]; up_i = i;

            trigger_up = 1; trigger_down = 0;

            if(first == 0) {first = -1;}

            count++;

         }

         else if(down > max_lenght_size)

         {

            //Alert("down>lenght :i=", i);

            up = 0; cur_up = High[i]; time_up = Time[i];

         }    

      }         

   }

 

   Alert("Колво пиков и впадин = ",count);

   Print_Params_in_File();

   return(0);

}

//+------------------------------------------------------------------+

string DS(double a, int kol)

{

   return (DoubleToStr(a,kol));

}

//+------------------------------------------------------------------+

void Print_Params_in_File()

{

   // выводим параметры зиззага в csv файл

   int handle = FileOpen("zigzag.csv", FILE_CSV|FILE_WRITE,';');

   for(int i=2;i<count;i++)

   {

      //FileWrite(handle, DoubleToStr(sea[i][0],4), sea[i][1], MathRound(sea[i][2]));

      FileWrite(handle,DoubleToStr(sea[i][0],4));

      FileWrite(handle,sea[i][1]);

      FileWrite(handle,MathRound(sea[i][2]));

   }

   FileClose(handle);

}

//+------------------------------------------------------------------+

<< Назад



Рейтинг@Mail.ru

 
 
Апшеронск Спорт VBA Форекс Сочи-2014 Нейросети Студентам
Связь с Администратором сайта, E-mail: apsheronka@mail.ru
Апшеронск, Краснодарский край

Размещение рекламы на сайте
Карта сайта

При перепечатке материалов сайта http://apsheronsk.bozo.ru - обязательная активная гиперссылка на сайт!