All_Channel_v01

Author: Inkov Evgeni ew123@mail.ru
Price Data Components
Series array that contains the lowest prices of each barSeries array that contains the highest prices of each barSeries array that contains close prices for each bar
0 Views
0 Downloads
0 Favorites
All_Channel_v01
//+------------------------------------------------------------------+
//|                                              All_Channel_v01.mq4 |
//+------------------------------------------------------------------+
#property copyright "Inkov Evgeni ew123@mail.ru"
#property link      "8-918-600-11-33"

#property indicator_chart_window
//=======================================================================
#define           Razm_Mas_Fract         500
//=======================================================================
extern int        Fr_bars_M1           = 7;     //
extern int        Fr_bars_M5           = 7;     //
extern int        Fr_bars_M15          = 7;     //
extern int        Fr_bars_M30          = 7;     //
extern int        Fr_bars_H1           = 7;     //
extern int        Fr_bars_H4           = 7;     //
extern int        Fr_bars_D1           = 7;     //
extern int        Fr_bars_W1           = 7;     //
extern int        Fr_bars_MN           = 7;     //
//+------------------------------------------------------------------+
extern int        Voln_end_M1          = 3;     //
extern int        Voln_end_M5          = 3;     //
extern int        Voln_end_M15         = 3;     //
extern int        Voln_end_M30         = 3;     //
extern int        Voln_end_H1          = 3;     //
extern int        Voln_end_H4          = 3;     //
extern int        Voln_end_D1          = 3;     //
extern int        Voln_end_W1          = 3;     //
extern int        Voln_end_MN          = 3;     //
extern int        Dop_Voln_end         = 0;     //
//+------------------------------------------------------------------+
extern color      Color_M1             = Green;     //
extern color      Color_M5             = Blue;    //
extern color      Color_M15            = Magenta;     //
extern color      Color_M30            = Brown;     //
extern color      Color_H1             = Red;      //
extern color      Color_H4             = Yellow;     //
extern color      Color_D1             = DeepSkyBlue;     //
extern color      Color_W1             = BlueViolet;     //
extern color      Color_MN             = Orange;     //
//+------------------------------------------------------------------+
extern double     Percent_Add_Line     = 0;    // ïðîöåíò îò ïîëîâèíû êàíàëà äîïîëíèòåëüíîé ëèíèè 
extern bool       Out_ZigZag           = true;  // âûâîäèòü çèã-çàã íà ýêðàí
extern bool       comm                 = true;  // âûâîäèòü êîììåíòàðèè íà ýêðàí
extern bool       Out_str              = true;  // âûâîäèòü êîììåíòàðèè íà ýêðàí
extern bool       Del_mlad_TF          = true;  //
extern bool       HighLow              = true;  //
//+------------------------------------------------------------------+
int         mas_Fr_bars   [9];
int         mas_Voln_end  [9];
int         mas_beg_bar   [9];
int         mas_end_bar   [9];
datetime    mas_time_line1[9];
datetime    mas_time_line2[9];
double      mas_extrem [Razm_Mas_Fract][2][9];   // 0 - öåíà ýêñòðåìóìà, 1 - íîìåð áàðà ýêñòðåìóìà
int         mas_kol_mas_extr[9];                // êîëè÷. èñïîëüçóåìûõ ÿ÷ååê â mas_extrem
double      mas_pr1_min[9];
double      mas_pr1_max[9];
double      mas_pr0 [9];
color       mas_color[9];
bool        mas_out_TF[9];
//..........................
double      mas_tg    [9];
int         mas_proboi[9];
int         mas_TF[9]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
double      gran_up=0,gran_dw=0;
//+------------------------------------------------------------------+
int         Na4_Bar_Fract        = 1;     // íîìåð áàðà, ñ êîòîðîãî íà÷èíàåòñÿ ïîèñê ôðàêòàëà
int         kol_mas_extr, end_bar,beg_bar;
datetime    time_line2, time_line1;
double      tg,pr1_min,pr1_max, pr0;
int         proboi;
double      pr1,pr2;
//+------------------------------------------------------------------+
int init()
{
   IndicatorShortName("All_Channel");
   //---------------------------------------------------------------------------------------
   put_mas (mas_Fr_bars,  Fr_bars_M1, Fr_bars_M5, Fr_bars_M15, Fr_bars_M30, Fr_bars_H1,
            Fr_bars_H4, Fr_bars_D1, Fr_bars_W1, Fr_bars_MN);
   put_mas (mas_Voln_end, Voln_end_M1,Voln_end_M5,Voln_end_M15,Voln_end_M30,Voln_end_H1,
            Voln_end_H4,Voln_end_D1,Voln_end_W1,Voln_end_MN);
   put_mas (mas_color,Color_M1,Color_M5,Color_M15,Color_M30,Color_H1,Color_H4,Color_D1,Color_W1,Color_MN);
   if (Out_str)
      out_color_TF();
   else
      del_color_TF();

   return(0);
}
//+------------------------------------------------------------------+
void put_mas (int& mas[9],int n1,int n2,int n3,int n4,int n5,int n6,int n7,int n8,int n9)
{
   mas[0]=n1; mas[1]=n2; mas[2]=n3; mas[3]=n4; mas[4]=n5; mas[5]=n6; mas[6]=n7; mas[7]=n8; mas[8]=n9;
}
//+------------------------------------------------------------------+
int deinit()
{
   if (UninitializeReason()!=REASON_CHARTCHANGE) // åñëè íå ñìåíà TF
   {
      for (int i=0;i<9;i++)
      {
         del_obj(i);
         ObjectDelete("TL_max" + str_TF(i));
         ObjectDelete("TL_cenr"+ str_TF(i));
         ObjectDelete("TL_min" + str_TF(i));
         ObjectDelete("TL_in_up" + str_TF(i));
         ObjectDelete("TL_in_dw" + str_TF(i));
      }
      Comment("");   // óáðàòü êîììåíòàðèé íà ýêðàíå
      del_color_TF();
   }
   return(0);
}
//+------------------------------------------------------------------+
int start()
{
   for (int n_TF=0;n_TF<9;n_TF++)   // ñôîðìèðîâàòü êàíàëû 
      if (mas_Fr_bars[n_TF]>0 && mas_Voln_end[n_TF]>0)
      {
         mas_out_TF[n_TF]=true;
         kol_mas_extr= mas_kol_mas_extr[n_TF];
         end_bar     = mas_end_bar[n_TF];
         beg_bar     = mas_beg_bar[n_TF];
         time_line2  = mas_time_line2[n_TF];
         time_line1  = mas_time_line1[n_TF];
         tg          = mas_tg[n_TF];
         proboi      = mas_proboi[n_TF];
         pr1_min     = mas_pr1_min[n_TF];
         pr1_max     = mas_pr1_max[n_TF];
         pr0         = mas_pr0[n_TF];

         Out_Kanal(mas_TF[n_TF], mas_Fr_bars[n_TF], mas_extrem, n_TF, kol_mas_extr, 
                   mas_color[n_TF], Out_ZigZag, end_bar, beg_bar, time_line2, time_line1, 
                   mas_color[n_TF],tg, proboi,pr1_min, pr1_max, mas_Voln_end[n_TF], pr0);
                
         mas_kol_mas_extr[n_TF]  = kol_mas_extr;
         mas_end_bar[n_TF]       = end_bar;
         mas_beg_bar[n_TF]       = beg_bar;
         mas_time_line2[n_TF]    = time_line2;
         mas_time_line1[n_TF]    = time_line1;
         mas_tg[n_TF]            = tg;
         mas_proboi[n_TF]        = proboi;
         mas_pr1_min[n_TF]       = pr1_min;
         mas_pr1_max[n_TF]       = pr1_max;
         mas_pr0[n_TF]           = pr0;
      }
      else
         mas_out_TF[n_TF]=false;
      
   if  (comm)Out_Comm();
   return(0);
}
//+------------------------------------------------------------------+
void Out_Comm()
{
   string ccc="",s;
   ccc=ccc+"\n            ";
   for (int j=0;j<9;j++)ccc=ccc+str_TF(j)+" ";
   ccc=ccc+"    Êàíàë "+str_TF(nom_TF(Period()))+":";
   //------------------
   ccc=ccc+"\n"+"Òðåíä:    ";
   for (j=0;j<9;j++)
   {
      if (mas_out_TF[j])
      {
         bool t=mas_tg[j]>=0.0;
         s=DoubleToStr(t,0);
      }
      else
         s="`";
      ccc=ccc+s+"    ";
   }
   ccc=ccc+ "  Øèðèíà= "+ DoubleToStr((mas_pr1_max[nom_TF(Period())]-mas_pr1_min[nom_TF(Period())])/Point,0);
   //------------------
   ccc=ccc+"\n"+"Ïðîáîé:  ";
   for (j=0;j<9;j++)
   {
      if (mas_out_TF[j])
         if (mas_proboi[j]>0)
            s="1";
         else
            if (mas_proboi[j]<0)
               s="0";
            else
               s="`";
      else
         s="`";
      ccc=ccc+s+"    ";
   }
   ccc=ccc+ "  tg= "+DoubleToStr(mas_tg[nom_TF(Period())]/Point,2)+" StLv= "+DoubleToStr(MarketInfo(Symbol(),MODE_STOPLEVEL),0);
   //------------------
   Comment(ccc);
}
//==========================================================================
bool Put_mas_fract_and_extr(int TF,int Fractal_Bars, color col_UP,color col_DW,
                            int nom_ind, double& mas_extremum[][][], int& kol_mas_extr, bool Out_Graf, int kol_voln)
{
   int i;

   double long1 [Razm_Mas_Fract];
   double short1[Razm_Mas_Fract];
   int na4_bar,kol_bar;

   ArrayInitialize(long1,0);
   ArrayInitialize(short1,0);
//----
   
   if (Fractal_Bars<=0)Fractal_Bars=1;
   
   int HighBar = -1;
   int LowBar  = -1;
   
   //Èùåì ôðàêòàëû  
   int kol_bars=MathMin(Razm_Mas_Fract,iBars(Symbol(),TF)-1);
   
   int tek_kol_voln;
   for(i=Na4_Bar_Fract;i<=kol_bars;i++) // ïðîñìàòðèâàåì ñ òåê.âðåìåíè íàçàä
   {
      //Èùåì íèæíèé ôðàêòàë: èíäåêñ ìèí.çíà÷. îò i-Fractal_Bars íàçàä êîë.=Fractal_Bars*2+1, ò.å. i +- Fractal_Bars
      na4_bar=i-Fractal_Bars;
      if (na4_bar<0)
      {
         continue;
//         kol_bar=Fractal_Bars*2+1+na4_bar;
//         na4_bar=0;
      }
      else
         kol_bar=Fractal_Bars*2+1;
      if (i==iLowest(Symbol(),TF,MODE_LOW,kol_bar,na4_bar))  
      {
         switch(Get_HighLow(LowBar,HighBar))
         {
            case -1:
            {
               if (NormalizeDouble(iLow(Symbol(),TF,i),Digits)<NormalizeDouble(iLow(Symbol(),TF,LowBar),Digits))
               {
                  long1[i]=iLow(Symbol(),TF,i);
                  long1[LowBar]=0;
                  LowBar=i;
//                  tek_kol_voln++;
               }
               break;
            }
            case 1:  // íîâûé íèç
            {
               if (NormalizeDouble(iLow(Symbol(),TF,i),Digits)<NormalizeDouble(iHigh(Symbol(),TF,HighBar),Digits))
               {
                  long1[i]=iLow(Symbol(),TF,i);
                  LowBar=i;
                  tek_kol_voln++;
               }
               break;
            }
            case 0:    // ïåðâûé ìèí.
            {
               long1[i]=iLow(Symbol(),TF,i);
               LowBar=i;
               tek_kol_voln++;
               break;
            }
         }
      }
      //Èùåì âåðõíèé ôðàêòàë
      na4_bar=i-Fractal_Bars;
      if (na4_bar<0)
      {
         kol_bar=Fractal_Bars*2+1+na4_bar;
         na4_bar=0;
      }
      else
         kol_bar=Fractal_Bars*2+1;
      if (i==iHighest(Symbol(),TF,MODE_HIGH,kol_bar,na4_bar) && long1[i]==0)  
      {
         switch(Get_HighLow(LowBar,HighBar))
         {
            case 1:  // íîâûé âåðõ 
            {
               if (NormalizeDouble(iHigh(Symbol(),TF,i),Digits)>NormalizeDouble(iHigh(Symbol(),TF,HighBar),Digits))
               {
                  short1[i]=iHigh(Symbol(),TF,i);
                  short1[HighBar]=0;
                  HighBar=i;
//                  tek_kol_voln++;
               }
               break;
            }
            case -1:
            {
               if (NormalizeDouble(iHigh(Symbol(),TF,i),Digits)>NormalizeDouble(iLow(Symbol(),TF,LowBar),Digits))
               {
                  short1[i]=iHigh(Symbol(),TF,i);
                  HighBar=i;
                  tek_kol_voln++;
               }
               break;
            }
            case 0:  // ïåðâûé ìàêñ.
            {
               short1[i]=iHigh(Symbol(),TF,i);
               HighBar=i;
               tek_kol_voln++;
               break;
            }
         }
      }
      if (tek_kol_voln>kol_voln)break;
   }

   kol_bars=i;
   if (Out_Graf) //Ðèñóåì ëîìàíóþ
   {
      if (Period()<=TF)
      {
         del_obj(nom_ind);
         int LastExtremumBar     = -1;
         for(i=kol_bars;i>=Na4_Bar_Fract;i--)
         {
            if (long1[i]!=0 || short1[i]!=0)
            {
               if (LastExtremumBar!=-1)
               {
                  if (long1[i]!=0)
                  {
                     int Nom_Bar1= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,LastExtremumBar));
                     int Nom_Bar12= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,LastExtremumBar-1));
                     if (LastExtremumBar==0)Nom_Bar12=0;
                     int j1=Nom_Bar1;
                     if (Nom_Bar1<=MathMin(kol_bars,Bars-1))
                     {
                        for (j1=Nom_Bar1;j1>=Nom_Bar12;j1--)if (short1[LastExtremumBar]==High[j1])break;
                        if (j1<Nom_Bar12)j1=Nom_Bar1;
                     }
                  
                     int Nom_Bar2= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,i));
                     Nom_Bar12= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,i-1));
                     if (i==0)Nom_Bar12=0;
                     int j2=Nom_Bar2;
                     if (Nom_Bar2<=MathMin(kol_bars,Bars-1))
                     {
                        for (j2=Nom_Bar2;j2>=Nom_Bar12;j2--)if (long1[i]==Low[j2])break;
                        if (j2<Nom_Bar12)j2=Nom_Bar2;
                     }
                  
                     ObjectCreate(StringConcatenate("Trend_",nom_ind,"_",i),OBJ_TREND,0,
                        Time[j1],short1[LastExtremumBar],Time[j2],long1[i]);
                     ObjectSet(StringConcatenate("Trend_",nom_ind,"_",i),OBJPROP_COLOR,col_DW);
                  }
                  if (short1[i]!=0)
                  {
                     Nom_Bar1= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,LastExtremumBar));
                     Nom_Bar12= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,LastExtremumBar-1));
                     if (LastExtremumBar==0)Nom_Bar12=0;
                     j1=Nom_Bar1;
                     if (Nom_Bar1<=MathMin(kol_bars,Bars-1))
                     {
                        for (j1=Nom_Bar1;j1>=Nom_Bar12;j1--)if (long1[LastExtremumBar]==Low[j1])break;
                        if (j1<Nom_Bar12)j1=Nom_Bar1;
                     }
                     
                     Nom_Bar2= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,i));
                     Nom_Bar12= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,i-1));
                     if (i==0)Nom_Bar12=0;
                     j2=Nom_Bar2;
                     if (Nom_Bar2<=MathMin(kol_bars,Bars-1))
                     {
                        for (j2=Nom_Bar2;j2>=Nom_Bar12;j2--)if (short1[i]==High[j2])break;
                        if (j2<Nom_Bar12)j2=Nom_Bar2;
                     }

                     ObjectCreate(StringConcatenate("Trend_",nom_ind,"_",i),OBJ_TREND,0,
                        Time[j1],long1[LastExtremumBar],Time[j2],short1[i]);
                     ObjectSet(StringConcatenate("Trend_",nom_ind,"_",i),OBJPROP_COLOR,col_UP);
                  }
                  ObjectSet(StringConcatenate("Trend_",nom_ind,"_",i),OBJPROP_RAY,0);
                  ObjectSet(StringConcatenate("Trend_",nom_ind,"_",i),OBJPROP_WIDTH,1);
               }
               LastExtremumBar=i;
            }
         }
      }
   }
   else
      del_obj(nom_ind);
   
   for(i=0;i<Razm_Mas_Fract;i++)
   {
      if (short1[i]!=0) long1[i]=short1[i];
      mas_extremum[i][0][nom_ind]=0.0;
      mas_extremum[i][1][nom_ind]=0.0;
   }
   
   kol_mas_extr=0;
   for(i=0;i<Razm_Mas_Fract;i++)
      if (long1[i]!=0)
      {
         mas_extremum[kol_mas_extr][0][nom_ind]=NormalizeDouble(long1[i],Digits);
         mas_extremum[kol_mas_extr][1][nom_ind]=NormalizeDouble(i,0);
         kol_mas_extr++;
      }
      
   return(0);
}
//+------------------------------------------------------------------+
int Get_HighLow(int L, int H)
{
         // íà÷àëî ãðàôèêà
   if (L == -1 && H >=  0) return(1);  // íèçà  åù¸ íå áûëî, à âåðõ óæå áûë, ýòî íîâûé âåðõ
   if (L >=  0 && H == -1) return(-1); // âåðõà åù¸ íå áûëî, à íèç  óæå áûë, ýòî íîâûé íèç
         // ïðîäîëæåíèå ãðàôèêà
   if (L >=  0 && H >=  0)
   {
      if (L < H) return(1);   // íàéäåí âåðõ èëè íèç
      if (L > H) return(-1);  // íàéäåí âåðõ èëè íèç
   }
   return(0);  // (L==-1 è H==-1) ïåðâûé ìàõ. èëè ìèí. - íà÷àëî ãðàôèêà
}
//------------------------------------------------------------------------
void del_obj(int nom)
{
   for(int i=Razm_Mas_Fract;i>=0;i--)
      if (ObjectFind(StringConcatenate("Trend_",nom,"_",i))!=-1)
         ObjectDelete(StringConcatenate("Trend_",nom,"_",i));
}
//=============================================================
bool Out_Kanal(int TF, int Fr_Bars, double& mas_ext[][][], int nom_graf, int& kol_mas_ext, color col_fract, bool out_gr,
               int& end_bar, int& beg_bar, datetime& time2, datetime& time1, color col_kanal, 
               double& tg, int& proboi, double& pr1_min, double& pr1_max, int nom_voln_end, double& pr0)
{   
   // ñôîðìèðîâàòü ìàññèâ ôðàêòàëîâ
   Put_mas_fract_and_extr(TF, Fr_Bars, col_fract,col_fract,nom_graf, mas_ext,kol_mas_ext, out_gr, nom_voln_end+Dop_Voln_end);

   beg_bar=mas_ext[0][1][nom_graf];
   time1=iTime(Symbol(),TF,beg_bar);
   end_bar=mas_ext[nom_voln_end][1][nom_graf];
   time2=iTime(Symbol(),TF,end_bar);
   
   opred_gran_kanala(TF, nom_graf, end_bar, beg_bar, tg, time2, time1,col_kanal, pr1_min, pr1_max, proboi, pr0);
   
   return(0);
}
//+------------------------------------------------------------------+
bool opred_gran_kanala(int TF, int k, int& end_bar, int& beg_bar, double& tg,
                       datetime& time_line2, datetime& time_line1, color col_kan,
                       double& pr1_min, double& pr1_max, int& proboi, double& pr0)
{ 
   bool out;
   double pr_min, pr_max;
   double pr1, pr2, max_d_up, max_d_dw;
       
   while (true) 
   {
      out=form_channel(TF, k, end_bar, beg_bar, time_line2, time_line1, tg, pr1_min, pr1_max, 
                       col_kan, pr0, pr_min, pr_max, pr1, pr2, max_d_up, max_d_dw);
      
      proboi=proboi_kanala(TF,  beg_bar, pr_min, pr_max);
      
      if (proboi!=0)break;  // åñëè êàíàë ïðîáèò, âûõîä
      if (beg_bar<=1)
      {
         if (beg_bar<1)
         {
            beg_bar=1;
            out=form_channel(TF, k, end_bar, beg_bar, time_line2, time_line1, tg, pr1_min, pr1_max, col_kan, 
                             pr0, pr_min, pr_max, pr1, pr2, max_d_up, max_d_dw);
         }
         break;
      }
      beg_bar--;
      time_line1=iTime(Symbol(),TF,beg_bar);
   }
         // âûâåñòè êàíàë íà ýêðàí
   if (out)out_channel(TF, k, pr1, pr2, max_d_up, max_d_dw, time_line1, time_line2, col_kan);

   return(out);
}
//+------------------------------------------------------------------+
int proboi_kanala(int TF, int beg_bar, double pr_min, double pr_max)
{
   int out=0;
   if (beg_bar >= 1)
   {
      if (iClose(Symbol(),TF,beg_bar-1)>pr_max)
         out =  1;
      else
         if (iClose(Symbol(),TF,beg_bar-1)<pr_min)
            out = -1;
   }
   return(out);
}
//+------------------------------------------------------------------+
bool form_channel(int TF, int n, int& end_bar, int& beg_bar, datetime& time_line2, datetime& time_line1, double& tg,
               double& pr0_min, double& pr0_max, color col_kanl, double& pr0, double& pr_min, double& pr_max,
               double& pr1, double& pr2, double& max_d_up, double& max_d_dw)
{
   pr1=0.0; // êîîðäèíàòû ñðåäíåé ëèíèè
   pr2=0.0; // pr1 - ïðàâàÿ öåíà, áëèæíÿÿ ê íóëåâîìó áàðó; pr2 - äàëüíÿÿ
   
         // åñëè ïðàâàÿ ãðàíèöà êàíàëà çàøëà çà ëåâóþ, óñòàíîâèòü ïðàâóþ íà ìåñòî
   if (time_line1<=time_line2)time_line1=iTime(Symbol(),TF,1);

   beg_bar=iBarShift(Symbol(),TF,time_line1);
   end_bar=iBarShift(Symbol(),TF,time_line2);
   
        // ñôîðìèðîâàòü ñðåäíþþ ëèíèþ êàíàëà
   if (HighLow)
   {
      if  (!opred_MNK_HL(TF, beg_bar, end_bar, pr1, pr2))return(0); // êàíàë íå ñôîðìèðîâàí
   }
   else
   {
      if  (!opred_MNK   (TF, beg_bar, end_bar, pr1, pr2))return(0); // êàíàë íå ñôîðìèðîâàí
   }
      
      // îïðåäåëèòü íàêëîí êàíàëà
   tg=(pr1-pr2)/(end_bar-beg_bar); // >0 - íàêëîí ââåðõ, <0 - íàêëîí âíèç
   
      // îïðåäåëèòü äèàïàçîí êàíàëà (ìàêñèìàëüíîå îòêëîíåíèå îò ñðåäíåé ëèíèè): max_d
   double d, pr_bar;
   double max_d=0;
   max_d_up=0;
   max_d_dw=0;
   for(int i=beg_bar;i<=end_bar;i++)
   {
      pr_bar=pr1+tg*(beg_bar-i);  // öåíà ïåðåñå÷åíèÿ ñðåäíåé ëèíèè êàíàëà ñ âåðòèêàëüíîé ëèíèåé i-ãî áàðà
      if (HighLow)
      {
         d=MathAbs(pr_bar-iHigh(Symbol(),TF,i));
         if (d>max_d_up)max_d_up=d;
         d=MathAbs(pr_bar-iLow(Symbol(),TF,i));
         if (d>max_d_dw)max_d_dw=d;
      }
      else
      {
         d=MathAbs(pr_bar-iClose(Symbol(),TF,i));
         if (d>max_d)max_d=d;
      }
   }
      //---------------------------
         // îïðåäåëèòü ìàêñ è ìèí. çíà÷åíèÿ ïðàâîé ãðàíèöû êàíàëà äëÿ âûâîäà ÒË
   if (!HighLow)
   {
      max_d_up=max_d;
      max_d_dw=max_d;
   }
   
   pr_max=pr1+max_d_up;
   pr_min=pr1-max_d_dw;
   
   pr0_max=pr_max;
   pr0_min=pr_min;

   return(1);
}
//---------------------------
void out_channel(int TF, int n, double pr1, double pr2, double max_d_up, double max_d_dw,
                 double time_line1, double time_line2, color col_kanl)
{
      // ïðàâûå êîîðäèíàòû êàíàëà
   double pr1_max=pr1+max_d_up;
   double pr1_min=pr1-max_d_dw;
   
      // ëåâûå êîîðäèíàòû êàíàëà 
   double pr2_max=pr2+max_d_up;
   double pr2_min=pr2-max_d_dw;
   
   if (!Del_mlad_TF || Period() <= TF)
   {
      if (Percent_Add_Line>0)
      {
         double p11=pr1+(pr1_max-pr1)*Percent_Add_Line/100.0;
         double p21=pr2+(pr2_max-pr2)*Percent_Add_Line/100.0;
         double p12=pr1-(pr1-pr1_min)*Percent_Add_Line/100.0;
         double p22=pr2-(pr2-pr2_min)*Percent_Add_Line/100.0;
         out_TL("TL_in_up"+str_TF(n), p11, p21, time_line1, time_line2, col_kanl, 1, STYLE_DASHDOT);
         out_TL("TL_in_dw"+str_TF(n), p12, p22, time_line1, time_line2, col_kanl, 1, STYLE_DASHDOT);
      }
      else
      {
         ObjectDelete("TL_in_up" +str_TF(n));
         ObjectDelete("TL_in_dw" +str_TF(n));
      }
      out_TL("TL_max" +str_TF(n), pr1_max, pr2_max, time_line1, time_line2, col_kanl, 2, STYLE_SOLID);
      out_TL("TL_cenr"+str_TF(n), pr1,     pr2,     time_line1, time_line2, col_kanl, 1, STYLE_DASH);
      out_TL("TL_min" +str_TF(n), pr1_min, pr2_min, time_line1, time_line2, col_kanl, 1, STYLE_SOLID);
   }
   else
   {
      del_obj(n);
      ObjectDelete("TL_in_up" +str_TF(n));
      ObjectDelete("TL_in_dw" +str_TF(n));
      ObjectDelete("TL_max" +str_TF(n));
      ObjectDelete("TL_cenr"+str_TF(n));
      ObjectDelete("TL_min" +str_TF(n));
   }
}
//---------------------------
void out_TL(string name, double pr1, double pr2, datetime t1, datetime t2, color col, int width, int style)
{
   if (ObjectFind(name)<0)ObjectCreate(name, OBJ_TREND, 0, t2, pr2, t1, pr2);
   ObjectSet(name,OBJPROP_COLOR, col);
   ObjectSet(name,OBJPROP_RAY, true);
   ObjectSet(name,OBJPROP_WIDTH, width);
   ObjectSet(name,OBJPROP_STYLE, style);
   ObjectSet(name,OBJPROP_TIME1, t2);
   ObjectSet(name,OBJPROP_TIME2, t1);
   ObjectSet(name,OBJPROP_PRICE1,pr2);
   ObjectSet(name,OBJPROP_PRICE2,pr1);
}
//--------------------------------------
string str_TF(int n)
{
   switch(n)
   {
      case 0: return("M1");
      case 1: return("M5");
      case 2: return("M15");
      case 3: return("M30");
      case 4: return("H1");
      case 5: return("H4");
      case 6: return("D1");
      case 7: return("W1");
      case 8: return("MN");
   }
   return("??");
}
//--------------------------------------
int nom_TF(int TF)
{
   switch(TF)
   {
      case PERIOD_M1 : return(0);
      case PERIOD_M5 : return(1);
      case PERIOD_M15: return(2);
      case PERIOD_M30: return(3);
      case PERIOD_H1 : return(4);
      case PERIOD_H4 : return(5);
      case PERIOD_D1 : return(6);
      case PERIOD_W1 : return(7);
      case PERIOD_MN1: return(8);
   }
   return(-1);
}
//----------------------------
bool opred_MNK(int TF, int bar_na4, int bar_kon, double& pr1, double& pr2)
{     // âû÷èñëèòü êîîðäèíàòû ëèíèè ïî Ìåòîäó Íàèìåíüøèõ Êâàäðàòîâ (MNK) http://multitest.semico.ru/mnk.htm
      // ò.å. äëÿ óðàâíåíèÿ y=a*x+b íóæíî ðåøèòü ñèñòåìó óðàâíåíèé Sxy=a*Sx2+b*Sx, Sy=a*Sx+n*b
   bool revers;
   if (bar_na4>bar_kon)
   {
      int k=bar_na4;
      bar_na4=bar_kon;
      bar_kon=k;
      revers=true;
   }
   double sum_x=0,sum_y=0,sum_x2=0,sum_xy=0,n=0;
   for (int x=bar_na4;x<=bar_kon;x++)
   {
      sum_x  += 1.0*x;                    // Sx
      sum_x2 += 1.0*x*x;                  // Sx2
      sum_y  += iClose(Symbol(),TF,x);    // Sy
      sum_xy += iClose(Symbol(),TF,x)*x;  // Sxy
      n++;     // êîëè÷åñòâî áàðîâ
   }
   
   if (n==0 || (n*sum_x2-sum_x*sum_x)==0.0)return(0);
   
      // èç ñèñòåìû óðàâíåíèé âû÷èñëÿåì êîýô. äëÿ ëèíèè y=a*x+b
   double a=(n*sum_xy-sum_x*sum_y)/(n*sum_x2-sum_x*sum_x);
   double b=(sum_y-a*sum_x)/n;
      // âû÷èñëÿåì âûõîäíûå öåíû
   pr1=a*bar_na4+b;
   pr2=a*bar_kon+b;
   if (revers)
   {
      double m=pr1;
      pr1=pr2;
      pr2=m;
   }
   return(1);
}
//----------------------------
bool opred_MNK_HL(int TF, int bar_na4, int bar_kon, double& pr1, double& pr2)
{     // âû÷èñëèòü êîîðäèíàòû ëèíèè ïî Ìåòîäó Íàèìåíüøèõ Êâàäðàòîâ (MNK) http://multitest.semico.ru/mnk.htm
      // ò.å. äëÿ óðàâíåíèÿ y=a*x+b íóæíî ðåøèòü ñèñòåìó óðàâíåíèé Sxy=a*Sx2+b*Sx, Sy=a*Sx+n*b
   bool revers;
   if (bar_na4>bar_kon)
   {
      int k=bar_na4;
      bar_na4=bar_kon;
      bar_kon=k;
      revers=true;
   }
   double sum_x=0,sum_y=0,sum_x2=0,sum_xy=0,n=0;
   for (int x=bar_na4;x<=bar_kon;x++)
   {
      sum_x  += 1.0*x;                    // Sx
      sum_x2 += 1.0*x*x;                  // Sx2
      sum_y  += iLow(Symbol(),TF,x);    // Sy
      sum_xy += iLow(Symbol(),TF,x)*x;  // Sxy
      n++;
      
      sum_x  += 1.0*x;                    // Sx
      sum_x2 += 1.0*x*x;                  // Sx2
      sum_y  += iHigh(Symbol(),TF,x);    // Sy
      sum_xy += iHigh(Symbol(),TF,x)*x;  // Sxy
      n++;     // êîëè÷åñòâî áàðîâ
   }
   
   if (n==0 || (n*sum_x2-sum_x*sum_x)==0.0)return(0);
   
      // èç ñèñòåìû óðàâíåíèé âû÷èñëÿåì êîýô. äëÿ ëèíèè y=a*x+b
   double a=(n*sum_xy-sum_x*sum_y)/(n*sum_x2-sum_x*sum_x);
   double b=(sum_y-a*sum_x)/n;
      // âû÷èñëÿåì âûõîäíûå öåíû
   pr1=a*bar_na4+b;
   pr2=a*bar_kon+b;
   if (revers)
   {
      double m=pr1;
      pr1=pr2;
      pr2=m;
   }
   return(1);
}
//----------------------------
void out_color_TF()
{
   string name,str;
//   int mas_sdv[9]={0,30,60,100,140,170,200,226,260};
   int mas_sdv[9]={0,30,60,90,120,150,190,230,260};
   for (int i=0;i<=8;i++)
   {
      str=str_TF(8-i);
      name="colorA_"+str;
      if (ObjectFind(name)<0)ObjectCreate(name,OBJ_LABEL,0,0,0);
      ObjectSet(name, OBJPROP_CORNER,3);
      ObjectSet(name,OBJPROP_XDISTANCE,mas_sdv[i]+10);
      ObjectSet(name,OBJPROP_YDISTANCE,20);
      ObjectSetText(name, str, 10,"Arial Black", mas_color[8-i]);
   }
 }
//----------------------------
void del_color_TF()
{
   string name,str;
   for (int i=0;i<=8;i++)
   {
      str=str_TF(i);
      name="colorA_"+str;
      if (ObjectFind(name)>=0)ObjectDelete(name);
   }
 }
//===========================================================

Comments