road_map_v01

Author: Inkov Evgeni
road_map_v01
Price Data Components
Series array that contains the highest prices of each barSeries array that contains the lowest prices of each barSeries array that contains close prices for each bar
Miscellaneous
It plays sound alerts
2 Views
0 Downloads
0 Favorites
road_map_v01
//+------------------------------------------------------------------+
//|                                                 Road_Map_v01.mq4 |
//|  íà÷. 05/09/2015                                                 |
//+------------------------------------------------------------------+
#property copyright "Inkov Evgeni"
#property link      "ew123@mail.ru"
//---
#property version   "1.00"
#property strict
#property indicator_chart_window
//---
#define           Razm_Mas_Prizn         7
//---
input int   Max_Bars       = 300;
input color clr_Series_Up  = clrBlue;
input color clr_Series_Dw  = clrPurple;
input color clr_Tail_ZZ    = clrGreen;
input color clr_Fibo       = clrDarkOrange;
input color clr_Prob_UP    = clrGreen;
input color clr_Prob_DW    = clrRed;
input bool  On_Nom_Series  = true;
input bool  On_Fibo        = true;
input bool  Sound          = true;
//---
int Mas_Fract[];
int M_Bars;
int Sgat_ZZ_0[][Razm_Mas_Prizn];
string pref="ZZ_";
datetime time_end_urov;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Max_Bars>0)
      M_Bars=MathMin(Max_Bars,iBars(_Symbol,0));
   else
      M_Bars=iBars(_Symbol,0);

   ArrayResize(Mas_Fract,M_Bars);
   ArrayResize(Sgat_ZZ_0,M_Bars);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   remove_objects(pref);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   Form_ZZ(Period(),Sgat_ZZ_0);

   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Form_ZZ(int TF,int &mas_sgat[][])
  {
   int n_sgat=0;

   Find_Fractal(TF);
   Dorab_Fract(TF,mas_sgat,n_sgat);
   Opred_Impuls_Wave(TF,mas_sgat,n_sgat);
   Opred_Corr_wave(TF,mas_sgat,n_sgat);
   Opred_Series_Wave(TF,mas_sgat,n_sgat);

   Out_ZZ(TF,mas_sgat,n_sgat);
   if(On_Nom_Series)Out_Nom_Series(TF,mas_sgat,n_sgat);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Opred_Series_Wave(int TF,int &mas_sgat[][],int kol_sgat)
  {  // íàéòè ñåðèè âîëí
   int imp,impS=0,impS_beg=0,tek_series=0,kol_wave=0,b1,b0,b1S=0,b0S=0,b1S_beg=0,b0S_beg=0;
   double H,L,HS=0,LS=0;
   double HS_beg=0,LS_beg=0;

   int n=0,m=0;

   for(int i=kol_sgat-1;i>=1;i--)
     {
      imp=mas_sgat[i][2];   // òåêóùàÿ èìïóëüñíàÿ/êîðð. âîëíà; 1 - èìï.âîëíà ââåðõ, -1 - èìï.âîëíà âíèç, 0 - êîðð.âîëíà

      if(imp!=0) // íàéäåíà èìïóëüñíàÿ âîëíà
        {
         b0=mas_sgat[i][0];
         b1=mas_sgat[i-1][0];

         if(imp>0)
           {
            L=iLow (_Symbol,TF,b0);
            H=iHigh(_Symbol,TF,b1);
           }
         else
           {
            L=iLow (_Symbol,TF,b1);
            H=iHigh(_Symbol,TF,b0);
           }
         bool prob_up=impS<0 && ND(H)>ND(HS);  // ïðîáîé ââåðõ
         bool prob_dw=impS>0 && ND(L)<ND(LS);  // ïðîáîé âíèç

         if(prob_up)
           {
            Out_TL(n,iTime(_Symbol,TF,b0S),HS,iTime(_Symbol,TF,b1)+2*TF*60,HS,"prob_U",clr_Prob_UP,TF,1,2);
            if(Sound && iTime(_Symbol,TF,b0S)>time_end_urov)
              {
               time_end_urov=iTime(_Symbol,TF,b0S);
               PlaySound("alert.wav");
              }
            n++;
           }
         if(prob_dw)
           {
            Out_TL(m,iTime(_Symbol,TF,b0S),LS,iTime(_Symbol,TF,b1)+2*TF*60,LS,"prob_D",clr_Prob_DW,TF,1,2);
            if(Sound && iTime(_Symbol,TF,b0S)>time_end_urov)
              {
               time_end_urov=iTime(_Symbol,TF,b0S);
               PlaySound("email.wav");
              }
            m++;
           }

         if(HS==0 || prob_up || prob_dw) // èëè âîëí åù¸ íå áûëî èëè ïðîáîé ââåðõ/âíèç
           {
            HS=H;
            LS=L;
            b0S=b0;
            b1S=b1;
            impS=imp;

            HS_beg=H;
            LS_beg=L;
            b0S_beg=b0;
            b1S_beg=b1;
            impS_beg=imp;

            tek_series=imp; // 1 èëè -1
            kol_wave=0;
           }
         else
            if((impS>0 && ND(H)>ND(HS)) || 
               (impS<0 && ND(L)<ND(LS)))// ïðåâûøåíèå ââåðõ èëè âíèç
              {  // îáíîâëÿåì èñõîäíóþ âîëíó
               HS=H;
               LS=L;
               b0S=b0;
               b1S=b1;
              }
        }

      kol_wave++;
      mas_sgat[i][4]=tek_series*kol_wave;
     }
/*
   if (impS>0)
   {
      Out_TL(n,iTime(_Symbol,TF,b1S), HS, iTime(_Symbol,TF,0)+2*TF*60, HS, "gran_U", clr_Prob_UP, TF, 0,2);
      Out_TL(m,iTime(_Symbol,TF,b0S), LS, iTime(_Symbol,TF,0)+2*TF*60, LS, "gran_D", clr_Prob_DW, TF, 0,2);
   }
   else
   {
      Out_TL(n,iTime(_Symbol,TF,b0S), HS, iTime(_Symbol,TF,0)+2*TF*60, HS, "gran_U", clr_Prob_UP, TF, 0,2);
      Out_TL(m,iTime(_Symbol,TF,b1S), LS, iTime(_Symbol,TF,0)+2*TF*60, LS, "gran_D", clr_Prob_DW, TF, 0,2);
   }
   */
   Del_extra_obj(TF,"prob_U",n+1);
   Del_extra_obj(TF,"prob_D",m+1);

   if(On_Fibo)Out_Fibo(TF,impS_beg,b0S_beg,b1S_beg,LS_beg,HS_beg);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Out_Fibo(int TF,int dir,int b0,int b1,double L,double H)
  {
   if(dir>0)
     {
      double p=L;
      L=H;
      H=p;
     }
   string name=pref+"_Fibo";
   if(ObjectFind(name))ObjectCreate(name,OBJ_FIBO,0,iTime(_Symbol,TF,b1),L,iTime(_Symbol,TF,b0),H);

   ObjectSet(name,OBJPROP_TIME1,iTime(_Symbol,TF,b1));
   ObjectSet(name,OBJPROP_PRICE1,L);
   b0=(int)(0.1*b1)+b1+3;
   ObjectSet(name,OBJPROP_TIME2,iTime(_Symbol,TF,b0));
   ObjectSet(name,OBJPROP_PRICE2,H);
   ObjectSet(name,OBJPROP_COLOR,clr_Fibo);
   ObjectSet(name,OBJPROP_WIDTH,1);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,false);
   ObjectSetInteger(0,name,OBJPROP_LEVELCOLOR,0,clr_Fibo);
   ObjectSetInteger(0,name,OBJPROP_LEVELS,13);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,0,0);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,1,0.236);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,2,0.382);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,3,0.5);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,4,0.618);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,5,0.764);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,6,1.0);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,7,1.382);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,8,1.618);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,9,2.0);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,10,2.618);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,11,3.0);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,12,4.0);
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,0,"0.0");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,1,"23.6");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,2,"38.2");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,3,"50.0");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,4,"61.8");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,5,"76.4");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,6,"100.0");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,7,"138.2");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,8,"161.8");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,9,"200.0");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,10,"261.8");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,11,"300.0");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,12,"400.0");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Find_Fractal(int TF)
  {
   int up,dw;
   ArrayInitialize(Mas_Fract,0);
   for(int i=M_Bars-4;i>=2;i--)
     {
      up=0;
      dw=0;
      double H_2=iHigh(_Symbol,TF,i-2);
      double H_1=iHigh(_Symbol,TF,i-1);
      double H0 =iHigh(_Symbol,TF,i);
      double H1 =iHigh(_Symbol,TF,i+1);
      double H2 =iHigh(_Symbol,TF,i+2);
      double H3 =iHigh(_Symbol,TF,i+3);
      if(((ND(H0)>ND(H1) && ND(H0)>ND(H2)) || 
         (ND(H0)==ND(H1) && ND(H0)>ND(H2)) || 
         (ND(H0)>ND(H1) && ND(H0)==ND(H2)) || 
         (ND(H0)==ND(H1) && ND(H0)==ND(H2) && ND(H0)>ND(H3))) && 
         ND(H0)>ND(H_1) && ND(H0)>ND(H_2))
         up=1;
      //---
      double L_2=iLow(_Symbol,TF,i-2);
      double L_1=iLow(_Symbol,TF,i-1);
      double L0 =iLow(_Symbol,TF,i);
      double L1 =iLow(_Symbol,TF,i+1);
      double L2 =iLow(_Symbol,TF,i+2);
      double L3 =iLow(_Symbol,TF,i+3);
      if(((ND(L0)<ND(L1) && ND(L0)<ND(L2)) || 
         (ND(L0)==ND(L1) && ND(L0)<ND(L2)) || 
         (ND(L0)<ND(L1) && ND(L0)==ND(L2)) || 
         (ND(L0)==ND(L1) && ND(L0)==ND(L2) && ND(L0)<ND(L3))) && 
         ND(L0)<ND(L_1) && ND(L0)<ND(L_2))dw=1;
      //---
      if(up==1 && dw==0)
         Mas_Fract[i]=1;
      else
      if(up==0 && dw==1)
         Mas_Fract[i]=-1;
      else
      if(up==1 && dw==1)
        {
         double op0=iOpen (_Symbol,TF,i);
         double cl0=iClose(_Symbol,TF,i);
         if(ND(cl0)>=ND(op0))
            Mas_Fract[i]=4;
         else
            Mas_Fract[i]=-4;
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Dorab_Fract(int TF,int &mas_sgat[][],int &kol_sgat)
  {
   obrab_begin_ZZ(TF,Mas_Fract);  // îáðàáîòàòü íà÷àëî çèã-çàãà
//---
   int Sgat_ZZ[][2]; // 0 - íîì áàðà, 1 - çíà÷.
   ArrayResize(Sgat_ZZ,2*M_Bars);
   int n=0;
   szhat_mas_ZZ(Mas_Fract,Sgat_ZZ,n);  // ñæàòü ìàññèâ ZZ
   Find_promezh_point(TF,Mas_Fract,Sgat_ZZ,n); // íàéòè òî÷êè ìåæäó îäèíàêîâûìè âåðøèíàìè
   szhat_mas_ZZ(Mas_Fract,Sgat_ZZ,n);  // ñæàòü ìàññèâ ZZ
   ubrat_iskagen_ZZ(TF,Mas_Fract,Sgat_ZZ,n); // óáðàòü èñêàæåíèÿ ZZ
//---
   ArrayInitialize(mas_sgat,0);
   szhat_mas_ZZ(Mas_Fract,mas_sgat,kol_sgat);  // ñæàòü ìàññèâ ZZ
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void obrab_begin_ZZ(int TF,int &mas_Fr[])
  {
   int k,i;
   for(i=0;i<M_Bars;i++) // íàéòè íà÷àëî ìàñèâà ZZ (i)
      if(mas_Fr[i]!=0)break;
//---
   if(i>0) // íàéäåíî íà÷àëî ôðàêòàëîâ
      //--- ñìîòðèì íà êàêîì áàðå ñòîèò íà÷àëüíûé ôðàêòàë (i).
      //--- 1. Åñëè íà i-îì áàðå - âåðøèíà UP
      //--- 1.1. Åñëè íà 0-ì áàðå High >  UP, òî High[0]= 3
      //--- 1.2. Åñëè íà 0-ì áàðå High <= UP, òî Low [0]=-3
      //--- 2. (äëÿ DW - íàîáîðîò)
      if(mas_Fr[i]>0) // â íà÷àëå ëèíåéêè ôðàêòàëîâ - ìàêñèìóì (UP)
        {
         if(iHigh(_Symbol,TF,0)>iHigh(_Symbol,TF,i)) // íà 0-ì áàðå High >  UP
           {
            k=iHighest(_Symbol,TF,MODE_HIGH,i-1,1);
            if(iHigh(_Symbol,TF,k)>iHigh(_Symbol,TF,0))
              {
               mas_Fr[k]=3; // ìèíèìóì ìåæäó âåðøèíàìè íàéäåòñÿ àâòîìàòîì
               mas_Fr[0]=-3;
              }
            else
               mas_Fr[0]=3; // ìèíèìóì ìåæäó âåðøèíàìè íàéäåòñÿ àâòîìàòîì
           }
         else
           {
            k=iLowest(_Symbol,TF,MODE_LOW,i-1,1);
            if(iLow(_Symbol,TF,k)<iLow(_Symbol,TF,0))
              {
               mas_Fr[k]=-3;
               mas_Fr[0]= 3;
              }
            else
               mas_Fr[0]=-3;
           }
        }
   else
   if(mas_Fr[i]<0) // â íà÷àëå ëèíåéêè ôðàêòàëîâ - ìèíèìóì
     {
      if(iLow(_Symbol,TF,0)<iLow(_Symbol,TF,i))
        {
         k=iLowest(_Symbol,TF,MODE_LOW,i-1,1);
         if(iLow(_Symbol,TF,k)<iLow(_Symbol,TF,0))
           {
            mas_Fr[k]=-3; // ìèíèìóì ìåæäó âåðøèíàìè íàéäåòñÿ àâòîìàòîì
            mas_Fr[0]= 3;
           }
         else
            mas_Fr[0]=-3; // ìèíèìóì ìåæäó âåðøèíàìè íàéäåòñÿ àâòîìàòîì
        }
      else
        {
         k=iHighest(_Symbol,TF,MODE_HIGH,i-1,1);
         if(iHigh(_Symbol,TF,k)>iHigh(_Symbol,TF,0))
           {
            mas_Fr[1]= 3;
            mas_Fr[0]=-3;
           }
         else
            mas_Fr[0]=3;
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Find_promezh_point(int TF,int &mas_ish_ZZ[],int &mas_Szt[][],int kol_szt)
  { // íàéòè òî÷êè ìåæäó îäèíàêîâûìè âåðøèíàìè
   int k,b0,b1,z0,z1;
   for(int i=1;i<kol_szt;i++)
     {
      b0=mas_Szt[i-1][0];
      b1=mas_Szt[i]  [0];
      z0=mas_Szt[i-1][1];
      z1=mas_Szt[i]  [1];
      if(z0*z1>0) // íà âåðøèíàõ îäèíàêîâûå íàïðàâëåíèÿ
         if(b1-b0-1>1)
            if(z1>0)
              {
               k=Main_iLowest(TF,b1-b0-1,b0+1);
               mas_ish_ZZ[k]=-2;
              }
      else
        {
         k=Main_iHighest(TF,b1-b0-1,b0+1);
         mas_ish_ZZ[k]=2;
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ubrat_iskagen_ZZ(int TF,int &mas_ish_ZZ[],int &mas_Szt[][],int kol_szt)
  {   // óáðàòü èñêàæåíèÿ ZZ: åñëè ìàêñèìóì íèæå ïðåä. ìèíèìóìà è íàîáîðîò
   int i,b0,b1;
   double p0,p1;
   int f0,f1;
   for(i=1;i<kol_szt;i++)
     {
      b1=mas_Szt[i][0]; // òåê.
      f1=mas_Szt[i]  [1];
      b0=mas_Szt[i-1][0]; // ñïðàâà
      f0=mas_Szt[i-1][1];

      p1=iLow (_Symbol,TF,b1);
      p0=iHigh(_Symbol,TF,b0);
      if(f1<0 && f0>0 && ND(p1)>=ND(p0))
        {
         mas_ish_ZZ[b0]=0;
         mas_ish_ZZ[b1]=0;
         continue;
        }
      p1=iHigh(_Symbol,TF,b1);
      p0=iLow (_Symbol,TF,b0);
      if(f1>0 && f0<0 && ND(p1)<=ND(p0))
        {
         mas_ish_ZZ[b0]=0;
         mas_ish_ZZ[b1]=0;
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void szhat_mas_ZZ(int &masZZ_inp[],int &masZZ_out[][],int &kol_out)
  {  // ñæàòü ìàññèâ ZZ
   kol_out=0;
   int n;
   for(int i=0;i<M_Bars;i++)
     {
      n=masZZ_inp[i];
      if(n!=0)
        {
         if(MathAbs(n)<4)
           {
            masZZ_out[kol_out][0]=i;
            masZZ_out[kol_out][1]=n;
            kol_out++;
           }
         else // äâîéíîé ôðàêòàë
         if(n==4)
           {
            masZZ_out[kol_out][0]=i;
            masZZ_out[kol_out][1]=1;
            kol_out++;
            masZZ_out[kol_out][0]=i;
            masZZ_out[kol_out][1]=-1;
            kol_out++;
           }
         else
           {
            masZZ_out[kol_out][0]=i;
            masZZ_out[kol_out][1]=-1;
            kol_out++;
            masZZ_out[kol_out][0]=i;
            masZZ_out[kol_out][1]=1;
            kol_out++;
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Opred_Impuls_Wave(int TF,int &mas_sgat[][],int kol_sgat)
  {   // âûäåëèòü èìïóëüñíûå âîëíû
   int z1,z0,z_1,b1,b0,b_1;
   double p1,p_1;
   for(int i=kol_sgat-2;i>=1;i--)
     {
      z1 =mas_sgat[i+1][1];   // ëåâûé   ôðàêòàë
      z0 =mas_sgat[i]  [1];   // òåêóùèé ôðàêòàë
      z_1=mas_sgat[i-1][1];   // ïðàâûé  ôðàêòàë

      b1 =mas_sgat[i+1][0];
      b0 =mas_sgat[i]  [0];
      b_1=mas_sgat[i-1][0];

      if(z0<0 && z_1>0) // ëèíèÿ ââåðõ
        {
         p1 =iHigh(_Symbol,TF,b1);
         p_1=iHigh(_Symbol,TF,b_1);
         if(ND(p_1)>ND(p1))mas_sgat[i][2]=1;
        }
      else
      if(z0>0 && z_1<0) // ëèíèÿ âíèç
        {
         p1 =iLow(_Symbol,TF,b1);
         p_1=iLow(_Symbol,TF,b_1);
         if(ND(p_1)<ND(p1))mas_sgat[i][2]=-1;
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Opred_Corr_wave(int TF,int &mas_sgat[][],int kol_sgat)
  {  // íàéòè ñëîæíûå êîððåêòèðóþùèå âîëíû
   int z1,z0,b0,b1;
   double p0,d0;
   int i=kol_sgat-2;
   int n_k;

   while(i>=1)
     {
      z1 =mas_sgat[i+1][1];   // ëåâûé   ôðàêòàë
      z0 =mas_sgat[i]  [1];   // òåêóùèé ôðàêòàë

      b0=mas_sgat[i][0]; // òåêóùèé áàð
      p0 =iHigh(_Symbol,TF,b0);
      d0 =iLow (_Symbol,TF,b0);

      //--- êîðð. âîëíû âíèç
      if(z1<0 && z0>0 && mas_sgat[i+1][2]>0 && mas_sgat[i][2]==0) // ïðåä.ëèíèÿ èìïóëüñ ââåðõ, òåê -êîðð.
        {
         mas_sgat[i][3]=-1; // îáîçíà÷èòü íà÷àëî ñëîæíîé êîðð. ëèíèèè
         if(i>=2 && mas_sgat[i-1][2]==0) // ñëåä.-êîðð.
           {
            i--;
            mas_sgat[i][3]=-2;
            i--;
            n_k=3;
            while(i>0 && mas_sgat[i][2]==0)
              {
               mas_sgat[i][3]=-n_k;
               i--;
               n_k++;
               if(i<1)break;
               b1=mas_sgat[i-1][0];
               if(ND(iHigh(_Symbol,TF,b1))>ND(p0))break; // ïðåâûñèëè îñíîâíîé âåðõíèé ôðàêòàë
               mas_sgat[i][3]=-n_k;
               i--;
               n_k++;
              }
           }
         else
           {
            i--;
            continue;
           }
        }
      else // êîðð. âîëíû ââåðõ
      if(z1>0 && z0<0 && mas_sgat[i+1][2]<0 && mas_sgat[i][2]==0) // ïðåä.ëèíèÿ èìïóëüñ âíèç, òåê -êîðð.
        {
         mas_sgat[i][3]=1; // îáîçíà÷èòü íà÷àëî ñëîæíîé êîðð. ëèíèèè
         if(i>=2 && mas_sgat[i-1][2]==0) // ñëåä.-êîðð.
           {
            i--;
            mas_sgat[i][3]=2;
            i--;
            n_k=3;
            while(i>0 && mas_sgat[i][2]==0)
              {
               mas_sgat[i][3]=n_k;
               i--;
               n_k++;
               if(i<1)break;
               b1=mas_sgat[i-1][0];
               if(ND(iLow(_Symbol,TF,b1))<ND(d0))break; // ïðåâûñèëè îñíîâíîé íèæíèé ôðàêòàë
               mas_sgat[i][3]=n_k;
               i--;
               n_k++;
              }
           }
         else
           {
            i--;
            continue;
           }
        }
      else
         i--;
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Out_ZZ(int TF,int &mas_sgat[][],int kol_sgat)
  {   // Âûâåñòè ZZ       
   int z0,z1,b0,b1,m0=0,m1=0;
   double L0,H0,L1,H1;
   datetime t0,t1;

   for(int i=1;i<kol_sgat;i++)
     {
      z1=mas_sgat[i][1]; // ëåâûé  ôð.
      b1=mas_sgat[i][0];
      L1=iLow (_Symbol,TF,b1);
      H1=iHigh(_Symbol,TF,b1);
      t1=iTime(_Symbol,TF,b1);

      z0=mas_sgat[i-1][1]; // ïðàâûé ôð.
      b0=mas_sgat[i-1][0];
      L0=iLow (_Symbol,TF,b0);
      H0=iHigh(_Symbol,TF,b0);
      t0=iTime(_Symbol,TF,b0);
      //---
      if(z1>0 && z0<0) // ëèíèÿ âíèç
        {
         Out_TL(m0,t0,L0,t1,H1,"T_D",mas_sgat[i][4]>0?clr_Series_Up:clr_Series_Dw,TF,mas_sgat[i][2]!=0,4);
         m0++;
        }
      else
      if(z1<0 && z0>0) // ëèíèÿ ââåðõ
        {
         Out_TL(m1,t0,H0,t1,L1,"T_U",mas_sgat[i][4]>0?clr_Series_Up:clr_Series_Dw,TF,mas_sgat[i][2]!=0,4);
         m1++;
        }
     }
   Del_extra_obj(TF,"T_U",m0);
   Del_extra_obj(TF,"T_D",m1);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Del_extra_obj(int tf,string s,int n)
  {
   string name;
   bool F;
   do
     {
      name=pref+str_TF(tf)+"_"+s+(string)n;
      F=ObjectFind(name)>=0;
      if(F)ObjectDelete(name);
      n++;
     }
   while(F);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Main_iHighest(int tf,int n,int beg)
  {
   double pr,pr_max=0.0;
   int n_max=beg;
   for(int i=beg;i<beg+n;i++)
     {
      pr=iHigh(_Symbol,tf,i);
      if(pr>pr_max)
        {
         pr_max=pr;
         n_max=i;
        }
     }
   return(n_max);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Main_iLowest(int tf,int n,int beg)
  {
   double pr,pr_min=999999.0;
   int n_min=beg;
   for(int i=beg;i<beg+n;i++)
     {
      pr=iLow(_Symbol,tf,i);
      if(pr<pr_min)
        {
         pr_min=pr;
         n_min=i;
        }
     }
   return(n_min);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Out_Nom_Series(int TF,int &mas_sgat[][],int kol_sgat)
  {   // âûâåñòè ôðàêòàëû
   int m=0,n=0,b,k;
   color clr;

   for(int i=0;i<kol_sgat-1;i++)
     {
      int z=mas_sgat[i][1];
      b=mas_sgat[i][0];
      k=mas_sgat[i+1][4];
      if(k!=0)
        {
         if(b>=Bars)break;

         if(b<=2 && i<=2)
            clr=clr_Tail_ZZ;
         else
         if(mas_sgat[i+1][4]>0)
            clr=clr_Series_Up;
         else
            clr=clr_Series_Dw;

         if(z>0){Out_txt(n,iTime(_Symbol,TF,b),iHigh(_Symbol,TF,b),"N_U",clr,TF,ANCHOR_LOWER, k);n++;}
         if(z<0){Out_txt(m,iTime(_Symbol,TF,b),iLow (_Symbol,TF,b),"N_D",clr,TF,ANCHOR_UPPER, k);m++;}
        }
     }
   Del_extra_obj(TF,"N_U",n);
   Del_extra_obj(TF,"N_D",m);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string str_TF(int n)
  {
   if(n==0)n=Period();
   switch(n)
     {
      case PERIOD_M1:  return ("M1 ");
      case PERIOD_M5:  return ("M5");
      case PERIOD_M15: return ("M15");
      case PERIOD_M30: return ("M30");
      case PERIOD_H1:  return ("H1");
      case PERIOD_H4:  return ("H4");
      case PERIOD_D1:  return ("D1");
      case PERIOD_W1:  return ("W1");
      case PERIOD_MN1: return ("MN1");
     }
   return("TF?");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void remove_objects(string PreName)
  {
   string Obj_Name,Head;
   for(int k=ObjectsTotal()-1; k>=0; k--)
     {
      Obj_Name=ObjectName(k);
      Head=StringSubstr(Obj_Name,0,StringLen(PreName));
      if(Head==PreName)ObjectDelete(Obj_Name);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double ND(double n)
  {
   return(NormalizeDouble(n,Digits));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Out_TL(int i,datetime t1,double pr1,datetime t2,double pr2,string s,color col,int TF,bool impuls,int width)
  {
   string name=pref+str_TF(TF)+"_"+s+(string)i;
   if(ObjectFind(name))ObjectCreate(name,OBJ_TREND,0,0,0,0,0);

   ObjectSet(name,OBJPROP_TIME1,t1);
   ObjectSet(name,OBJPROP_TIME2,t2);
   ObjectSet(name,OBJPROP_PRICE1,pr1);
   ObjectSet(name,OBJPROP_PRICE2,pr2);
   ObjectSet(name,OBJPROP_COLOR,col);
   ObjectSet(name,OBJPROP_RAY,0);
   if(impuls)
     {
      ObjectSet(name,OBJPROP_WIDTH,width);
      ObjectSet(name,OBJPROP_STYLE,STYLE_SOLID);
     }
   else
     {
      ObjectSet(name,OBJPROP_WIDTH,1);
      ObjectSet(name,OBJPROP_STYLE,STYLE_SOLID);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Out_Arrow(int i,datetime t,double pr,string s,color col,int cod,int TF,int anchor)
  {
   string name=pref+str_TF(TF)+"_"+s+(string)i;
   if(ObjectFind(name))ObjectCreate(name,OBJ_ARROW,0,0,0);

   ObjectSet(name,OBJPROP_TIME1,t);
   ObjectSet(name,OBJPROP_PRICE1,pr);
   ObjectSet(name,OBJPROP_COLOR,col);
   ObjectSet(name,OBJPROP_WIDTH,1);
   ObjectSet(name,OBJPROP_ARROWCODE,cod);
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,anchor);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Out_txt(int i,datetime t,double pr,string s,color col,int TF,int anchor,int n)
  {
   string name=pref+str_TF(TF)+"_"+s+(string)i;
   if(ObjectFind(name))ObjectCreate(name,OBJ_TEXT,0,0,0);

   ObjectSetText(name,IntegerToString(n),10,"Arial Black");
   ObjectSet(name,OBJPROP_TIME1,t);
   ObjectSet(name,OBJPROP_PRICE1,pr);
   ObjectSet(name,OBJPROP_COLOR,col);
   ObjectSet(name,OBJPROP_WIDTH,1);
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,anchor);
  }
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---