TAACH_Chanels

Download script
Author: Denis Orlov
TAACH_Chanels

This script is designed to automatically identify and draw trend channels and related trading levels on a financial chart based on "fractals"—specific high or low points in price action that represent potential structural turning points.

Core Functionality

The logic operates by scanning the market history for these fractal points to establish geometric trend lines. Instead of relying on arbitrary manual drawing, it uses mathematical identification of peaks and troughs to construct "channels."

Key components of the logic include:

  • Fractal Identification: The script searches back through previous price bars to find local highs and lows. It uses these points as anchors for drawing both upper (resistance) and lower (support) trend lines.
  • Dynamic Channel Construction: Based on the identified fractals, the script calculates the trajectory of the price movement. It determines the slope of the trend to project where future support and resistance levels might occur.
  • Visual Feedback System: The tool includes an interactive "Control Panel" directly on the chart. This allows you to toggle specific channels on or off, adjust the length of the lines, and shift the data horizontally to align with different market structures without needing to rewrite any settings.

Advanced Technical Layers

Beyond basic trend lines, the script applies several layers of analysis to each channel:

  • Fibonacci Integration: It can automatically calculate and project Fibonacci-based retracement levels from the established trend lines, providing specific price targets based on common harmonic ratios.
  • Proportional Level Marking: The logic calculates the "width" of a channel and projects additional percentage-based levels (such as 10% or 50% offsets). These represent extended zones of support or resistance relative to the current trend's geometry.
  • Adaptive Projection: Depending on whether a fractal is identified as a "low base" or a "high base," the script adjusts its calculations to ensure that the projected levels stay proportional to the current market volatility and trend direction.

User Experience

For a non-technical user, this means the tool acts as an automated geometric analyst. It identifies the "skeleton" of the market trend using fractals and then automatically overlays a map of potential price targets (Fibonacci levels and percentage offsets), allowing for a more structured view of where the price might move next.

Price Data Components
Series array that contains the lowest prices of each barSeries array that contains the highest prices of each bar
Indicators Used
Fractals
Miscellaneous
It issuies visual alerts to the screen
9 Views
0 Downloads
0 Favorites
TAACH_Chanels
//+------------------------------------------------------------------+
//|                                             ChanelByFractals.mq4 |
//|                                                      Denis Orlov |
//|                                    http://denis-or-love.narod.ru |
//|                  Ïîñòðîåíèå êàíàëîâ è ôèáî-óðîâíåé ïî ôðàêòàëàì  |
//|                                  
//+------------------------------------------------------------------+
#property copyright "Denis Orlov"
#property link      "http://denis-or-love.narod.ru"

#property indicator_separate_window

#include <WinUser32.mqh>

#property indicator_level1 0
#property indicator_minimum -25
#property indicator_maximum 15
#property indicator_levelstyle STYLE_DOT
#property indicator_levelcolor Coral

#property show_inputs 

//extern string On_Off?="Âûêëþ÷àòåëü:";
//extern bool On_Off=True;
//extern string ChanelMin?="Ìèíèìàëüíàÿ øèðèíà êàíàëà:";
//extern int ChanelMin=0;

//extern string Bar?="Ðàñ÷èòàòü îò êàêîãî áàðà:";
//extern int Bar=0;
//extern string Shift?="Çàïàçäûâàíèå êàíàëîâ:";
//extern 
int Shift=0;
//extern string Long?="Äëèííà êàíàëîâ:";
//extern 
int Long=3;

//extern string Save_Chanels?="Ñîõðàíèòü ñòàðûõ êàíàëîâ:";
//extern int Save_Chanels=3;


bool ByLowFraclals=True;
string MX;//ñòðîêîâàÿ ìàòðèöà äëÿ ïðîâåðêè ïàíåëè
int PX=100,PYH=0,PYL=15, PYTresh=3, FSize=14;//ïàðàìåòðû ïàíåëè
int EraserX=500, ShowChX=200, 
FiboX=310, AddLevelX=370, ShiftX=235, LongX=275, ChanelMinX=275, stepX=15;

int per;
int ChanelN=0;//òåêóùèé êàíàë äëÿ ïåðåíîñà âïåðåä
datetime BH1T, BL1T;
bool Fibo,AddLevel,Fibo_old,AddLevel_old;

bool initDone=False;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorShortName("Control Panel");
   
   int Win=WindowFind("Control Panel");
   
   DrawLabels("All", 1, PX, PYH, "All_On", Red,Win, FSize);
   DrawLabels("Help", 1, PX-60, PYL, "Help", SaddleBrown,Win, FSize);
   DrawLabels("Eraser", 1, PX+EraserX, PYL, "Del", Red,Win, FSize);
  
  
   for(int i=0;i<=9;i++)
      {
       if(i==0)
       DrawLabels("ShowChanel "+i, 1, PX+ShowChX-i*stepX, PYH, i, Green,Win, FSize);
         else
       DrawLabels("ShowChanel "+i, 1, PX+ShowChX-i*stepX, PYL, i, Red, Win, FSize);
      }
      
   DrawLabels("Shift", 1, PX+ShiftX, PYH, Shift, Blue ,Win, FSize);   
   //DrawLabels("ChanelMin", 1, PX+ChanelMinX, PYH, ChanelMin, Blue ,Win, FSize); 
   DrawLabels("Long", 1, PX+LongX, PYH+(Long-1)*3, Long, Blue ,Win, FSize); 
   DrawLabels("Fibo", 1, PX+FiboX, PYL, "FIBO", Red ,Win, FSize); 
   DrawLabels("AddLevel", 1, PX+AddLevelX, PYL, "Levels", Red ,Win, FSize); 
      
   //Panel();
  // AlertHelp();
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
    Delete_My_Obj("Chanels_Line");
    Delete_My_Obj("On_Off");
    Delete_My_Obj("Digit");

   return(0);
  }
//----  
int start()
  {
   if(initDone==False)
      {
         init(); initDone=True;
      }
//----
  Panel();
  
 // if(On_Off!=True) return; 
  if (per == Time[0]) return; // îäèí ðàç â áàð
     per = Time[0];
      //----
     //for(int i=0; i<=9;i++) 
        // if(ObjectGet("Digit "+i,OBJPROP_PRICE1)>0)
        // {
           //DrawChanel(i);
         //}

  
//----
   return(0);
  }
void Panel()
   {
      int Win=WindowFind("Control Panel");
      
      
       if(ObjectGet("Eraser",OBJPROP_YDISTANCE)<=PYTresh) 
       {
        // DrawLabels("Eraser", 1, PX+EraserX, PYTresh, "Del", Green,Win, FSize);
        DrawLabels("Eraser", 1, PX+EraserX, PYL, "Del", Red,Win, FSize);
         Delete_My_Obj("Chanels_Line");
         DrawLabels("All", 1, PX, PYH, "All_On", Red,Win, FSize);
       }  
      
      int y=ObjectGet("Fibo",OBJPROP_YDISTANCE);
       if(y<=PYTresh) {Fibo=True; color clr=Green; y=PYH; }
       else {Fibo=False; clr=Red;  y=PYL;}   
   DrawLabels("Fibo", 1, PX+FiboX, y, "FIBO", clr ,Win, FSize);
   
    y=ObjectGet("AddLevel",OBJPROP_YDISTANCE);
       if(y<=PYTresh) {AddLevel=True; clr=Green; y=PYH;}
       else {AddLevel=False; clr=Red;  y=PYL;} 
   DrawLabels("AddLevel", 1, PX+AddLevelX, y, "Levels", clr ,Win, FSize);
   
   if (Fibo_old!=Fibo || AddLevel_old!=AddLevel)
      {
         Fibo_old=Fibo; AddLevel_old=AddLevel;
         for(int i=0;i<=9;i++)
            {
             y=ObjectGet("ShowChanel "+i,OBJPROP_YDISTANCE); 
                if(y<=PYTresh)
                DrawAddLines(i);       
            }
         
      }
    
   //=========All, Help
     /* y=ObjectGet("On_Off",OBJPROP_YDISTANCE);
      if(y<=PYTresh) 
       {
         On_Off=True; DrawLabels("On_Off", 1, PX+0, PYH, "OFF", Green,Win, FSize);
       }
       else
       {
         On_Off=False; DrawLabels("On_Off", 1, PX+0, PYL, "ON", Red,Win, FSize);
       }
       
       if(On_Off!=True) return; */
       y=ObjectGet("All",OBJPROP_YDISTANCE);
      if(y>=PYL)
         {
           DrawLabels("All", 1, PX, PYL, "All", SaddleBrown,Win, FSize);
         }
         else  
      if(y<=PYTresh) 
       {
         DrawLabels("All", 1, PX, PYH, "All_On", Green,Win, FSize);
         for( i=0;i<=9;i++)
            {
             if(i==0)
             DrawLabels("ShowChanel "+i, 1, PX+ShowChX-i*stepX, PYH, i, Green,Win, FSize);
               else
             DrawLabels("ShowChanel "+i, 1, PX+ShowChX-i*stepX, PYL, i, Red, Win, FSize);
            }
         DrawLabels("All", 1, PX, PYL, "All", SaddleBrown,Win, FSize);
       }
       else
       {
         DrawLabels("All", 1, PX, PYL, "All_Off", Red,Win, FSize);
         for( i=0;i<=9;i++)
            {
             if(i!=0)
             DrawLabels("ShowChanel "+i, 1, PX+ShowChX-i*stepX, PYH, i, Green,Win, FSize);
               else
             DrawLabels("ShowChanel "+i, 1, PX+ShowChX-i*stepX, PYL, i, Red, Win, FSize);
            }
            
          DrawLabels("All", 1, PX, PYL, "All", SaddleBrown,Win, FSize);
       }
       
     if(ObjectGet("Help",OBJPROP_YDISTANCE)<=PYTresh) 
       {
         DrawLabels("Help", 1, PX-60, PYL, "Help", SaddleBrown,Win, FSize);
         AlertHelp();
       }  
     //=========All, Help 
     
      string mx="";
      
      for(i=0;i<=9;i++)
      {
       y=ObjectGet("ShowChanel "+i,OBJPROP_YDISTANCE);
       if(y<=PYTresh) {mx=mx+"1"; clr=Green; y=PYH;} 
          else {mx=mx+"0"; clr=Red; y=PYL;}
       DrawLabels("ShowChanel "+i, 1, PX+ShowChX-i*stepX, y, i, clr,Win, FSize); 
      }
 
    Shift=StrToInteger( ObjectDescription("Shift") );
    DrawLabels("Shift", 1, PX+ShiftX, PYH, Shift, Blue ,Win, FSize); 
    
    //ChanelMin=StrToInteger( ObjectDescription("ChanelMin") );
    //DrawLabels("ChanelMin", 1, PX+ChanelMinX, PYH, ChanelMin, Blue ,Win, FSize);
    Long=MathRound(ObjectGet("Long",OBJPROP_YDISTANCE)/3)+1;
    DrawLabels("Long", 1, PX+LongX, PYH+(Long-1)*3, Long, Blue ,Win, FSize); 
    
    mx=mx+Shift+Long;//+ChanelMin;  
    
      if(MX!=mx)
         { 
            MX="";
            for(i=0;i<=9;i++)
               {
                y=ObjectGet("ShowChanel "+i,OBJPROP_YDISTANCE);
                
                if(y<=PYTresh)
                  {
                  DrawChanel(i);
                  DrawAddLines(i);
                  MX=MX+"1"; 
                  }
                  else
                  {
                  Delete_My_Obj("Chanels_LineH "+i);
                  Delete_My_Obj("Chanels_LineL "+i);
                  MX=MX+"0";  
                  }  
               }
         MX=MX+Shift+Long;//+ChanelMin; 
         }
       
      /* bool ResFound=False;
      for(int i=0;i<=9;i++)
      {
       int t=12,p=-4;
       if(i>4){t=22; p=-14;}
       if( ObjectGet("Digit "+i,OBJPROP_PRICE1)>0) 
         {
          color clr=Green; Save_Chanels=i; ResFound=True;
            for(int j=i-1;j>=0;j--)
                  {
                   t=12;p=-4;
                   if(j>4){t=22; p=-14;}
                   DrawArrows("Digit "+j, Time[t-j*2], p, 139+j, Red, Win, 
                  "Çíà÷åíèå äëÿ Save_Chanels");
                 // break;
                   }
         }
         else
         {
           clr=Red; 
         }
         t=12;
       if(i>4)t=22;
       DrawArrows("Digit "+i, Time[t-i*2], ObjectGet("Digit "+i,OBJPROP_PRICE1), 139+i, clr, Win, 
       "Çíà÷åíèå äëÿ Save_Chanels");
      } 
      if(ResFound!=True)
         {Save_Chanels=0;
            t=12;p=10;
   DrawArrows("Digit "+0, Time[t], p, 139, Green, Win, 
       "Çíà÷åíèå äëÿ Save_Chanels");
         for(i=1;i<=9;i++)
            {
             p=-4;
             if(i>4){t=22; p=-14;}
             DrawArrows("Digit "+i, Time[t-i*2], p, 139+i, Red, Win, 
             "Çíà÷åíèå äëÿ Save_Chanels");
            }
         }*/
         
        
   }
   
   
int FindFractByNumber(int FractN)
   {
   double Fr=0;     // çíà÷åíèå ôðàêòàëîâ
   int BarN=1; // íîìåðà áàðîâ,òàê ÷òîáû ïîèñê íà÷àòü ñî 2-ãî(1 è 0 äëÿ ïðîâåðêè ôðàêòàëüíîñòè)
  
  for(int i=0;i<=FractN;i++)//ñ÷åò÷èê ïîèñêà
    {
       Fr=0; 
      while(Fr==0)      //ïîèñê ñëåä.ôðàêòàëà îò BarN
        {  
           BarN++;//áåðåì ñëåä. áàð
           Fr=iFractals(NULL,0,MODE_LOWER,BarN);
           if(Fr==0)
           Fr=iFractals(NULL,0,MODE_UPPER,BarN);
        }
    }
      return(BarN);
   }
   
int DrawChanel(int FracN)
   {
      double FH1=0, FH3=0, FL1=0, FL3=0, F13;    // íîìåðà ôðàêòàëîâ
  int  BH1, BH3, BL1, BL3, SR, bar2; //=Bar+2              // íîìåðà áàðîâ
  
  SR=FindFractByNumber(FracN+Shift);//
  
  while(FL3==0 || FH3==0)                       //ïîèñê ôðàêòàëîâ
  {
    F13=iFractals(NULL,0,MODE_LOWER,SR);
    if (F13!=0) 
    {
      while(iLow(NULL,0,SR)==iLow(NULL,0,SR+1)) SR++;

      if      (FL1==0){BL1=SR; FL1=F13;}
      else if (FL3==0){BL3=SR; FL3=F13;}
    }
    F13=iFractals(NULL,0,MODE_UPPER,SR);
    if (F13!=0) 
    {
      while(iHigh(NULL,0,SR)==iHigh(NULL,0,SR+1)) SR++;
      
      if      (FH1==0){BH1=SR; FH1=F13;}
      else if (FH3==0){BH3=SR; FH3=F13;}
    }
    
    SR++; 
  }
    //if( (High[BH1]-Low[BL1])/Point<ChanelMin ) return;
    
    /*if(BH1T==iTime(NULL,0,BH1) && BL1T==iTime(NULL,0,BL1)) return;
    else
     {
       BH1T=iTime(NULL,0,BH1); BL1T=iTime(NULL,0,BL1);
     }
  
   if(Save_Chanels==0)//(Delete_Old_Lines)
      Delete_My_Obj("ChanelByFractals");
      else
      {
       ChanelN++; 
       if(ChanelN>Save_Chanels+1) ChanelN=1;        
      }*/
      
   string nameH="Chanels_LineH "+FracN,//ChanelN
         nameL="Chanels_LineL "+FracN;//ChanelN
         
       Delete_My_Obj(nameH);
       Delete_My_Obj(nameL);
       
   if(BL1<BH1) ByLowFraclals=True; else ByLowFraclals=False;
   
         
   if(ByLowFraclals)
      {
    datetime t2=iTime(NULL,0,BL1)+(iTime(NULL,0,BL1)-iTime(NULL,0,BL3))*Long;
    double p2=iLow(NULL,0,BL1)+(iLow(NULL,0,BL1)-iLow(NULL,0,BL3))*Long;
    
    DrawTrends(nameL, iTime(NULL,0,BL3),iLow(NULL,0,BL3),t2,p2,Green,2,"");  
    
   /* ObjectCreate(nameL, OBJ_TREND, 0,0,0,0,0);//ñîçäàíèå òðåíäîâîé ëèíèè
    ObjectSet(nameL, OBJPROP_TIME1 ,iTime(NULL,0,BL3));
    ObjectSet(nameL, OBJPROP_PRICE1,iLow(NULL,0,BL3));
    ObjectSet(nameL, OBJPROP_TIME2 ,t2);
    ObjectSet(nameL, OBJPROP_PRICE2,p2);
    ObjectSet(nameL, OBJPROP_RAY   , false);
    ObjectSet(nameL, OBJPROP_COLOR   , Green);
    ObjectSet(nameL, OBJPROP_WIDTH   , 2);*/
    
   // Alert(TrendLToBar(nameL, BH1)+"; "+BH1+"; "+BarOfTrendL(nameL, BH3)+"; "+BH3);
    
    if (iHigh(NULL,0,BH1)>=iHigh(NULL,0,BH3) || iTime(NULL,0,BH3)<iTime(NULL,0,BL3)) 
      bar2=BH1; else bar2=BH3;//(BL3>=BH3 && BH3>=BL1)
    datetime t1=iTime(NULL,0,bar2)-(iTime(NULL,0,BL1)-iTime(NULL,0,BL3));
    double p1=iHigh(NULL,0,bar2)-(iLow(NULL,0,BL1)-iLow(NULL,0,BL3));
    t2=iTime(NULL,0,bar2)+(iTime(NULL,0,BL1)-iTime(NULL,0,BL3))*Long;
    p2=iHigh(NULL,0,bar2)+(iLow(NULL,0,BL1)-iLow(NULL,0,BL3))*Long;
 
    DrawTrends(nameH, t1,p1,t2,p2,Red,1,"") ; 
    /*ObjectCreate(nameH, OBJ_TREND, 0,0,0,0,0);//ñîçäàíèå òðåíäîâîé ëèíèè
    ObjectSet(nameH, OBJPROP_TIME1 ,t1);
    ObjectSet(nameH, OBJPROP_TIME2 ,t2);
    ObjectSet(nameH, OBJPROP_PRICE1,p1);
    ObjectSet(nameH, OBJPROP_PRICE2,p2);
    ObjectSet(nameH, OBJPROP_RAY   , false);
    ObjectSet(nameH, OBJPROP_COLOR   , Red);*/
    
    }
    
 if(ByLowFraclals!=True)
      {
     t2=iTime(NULL,0,BH1)+(iTime(NULL,0,BH1)-iTime(NULL,0,BH3))*Long;
     p2=iHigh(NULL,0,BH1)+(iHigh(NULL,0,BH1)-iHigh(NULL,0,BH3))*Long; 
     
     DrawTrends(nameH,iTime(NULL,0,BH3),iHigh(NULL,0,BH3),t2,p2,Red,2,""); 
   /*ObjectCreate(nameH, OBJ_TREND, 0,0,0,0,0);//ñîçäàíèå òðåíäîâîé ëèíèè
    ObjectSet(nameH, OBJPROP_TIME1 ,iTime(NULL,0,BH3));
    ObjectSet(nameH, OBJPROP_PRICE1,iHigh(NULL,0,BH3));
    ObjectSet(nameH, OBJPROP_TIME2 ,t2);
    ObjectSet(nameH, OBJPROP_PRICE2,p2);
    ObjectSet(nameH, OBJPROP_RAY   , false);
    ObjectSet(nameH, OBJPROP_COLOR   , Red);
    ObjectSet(nameH, OBJPROP_WIDTH   , 2);*/
    
   if (iLow(NULL,0,BL1)<=iLow(NULL,0,BL3) || iTime(NULL,0,BL3)<iTime(NULL,0,BH3)) 
      bar2=BL1; else bar2=BL3;//(BH3>=BL3 && BL3>=BH1)
     t1=iTime(NULL,0,bar2)-(iTime(NULL,0,BH1)-iTime(NULL,0,BH3));
     p1=iLow(NULL,0,bar2)-(iHigh(NULL,0,BH1)-iHigh(NULL,0,BH3));
     t2=iTime(NULL,0,bar2)+(iTime(NULL,0,BH1)-iTime(NULL,0,BH3))*Long;
     p2=iLow(NULL,0,bar2)+(iHigh(NULL,0,BH1)-iHigh(NULL,0,BH3))*Long;
     
     DrawTrends(nameL, t1,p1,t2,p2,Green,1,"");  
     /*ObjectCreate(nameL, OBJ_TREND, 0,0,0,0,0);//ñîçäàíèå òðåíäîâîé ëèíèè
    ObjectSet(nameL, OBJPROP_TIME1 ,t1);
    ObjectSet(nameL, OBJPROP_TIME2 ,t2);
    ObjectSet(nameL, OBJPROP_PRICE1,p1);
    ObjectSet(nameL, OBJPROP_PRICE2,p2);
    ObjectSet(nameL, OBJPROP_RAY   , false);
    ObjectSet(nameL, OBJPROP_COLOR   , Green);*/
     }
   }
//+------------------------------------------------------------------+
int DrawAddLines(int ChanelN)
   { 
      string nameH="Chanels_LineH "+ChanelN, nameL="Chanels_LineL "+ChanelN;
       if (ObjectFind(nameH)<0) return;
       
      datetime 
      th1=ObjectGet(nameH, OBJPROP_TIME1),
      th2=ObjectGet(nameH, OBJPROP_TIME2),
      tl1=ObjectGet(nameL, OBJPROP_TIME1),
      tl2=ObjectGet(nameL, OBJPROP_TIME2), tf1,tf2;
      
      double
      ph1=ObjectGet(nameH, OBJPROP_PRICE1),
      ph2=ObjectGet(nameH, OBJPROP_PRICE2),
      pl1=ObjectGet(nameL, OBJPROP_PRICE1),
      pl2=ObjectGet(nameL, OBJPROP_PRICE2), pf1,pf2;
      
      int leftbar=TimeToBar(th1);
      double ChanelW=TrendLToBar(nameH, leftbar)-TrendLToBar(nameL, leftbar);
      
      bool LowBase=ObjectGet(nameL, OBJPROP_WIDTH)>ObjectGet(nameH, OBJPROP_WIDTH);
      
      Comment(ChanelW);
         
      if(AddLevel) 
      {
         if(LowBase)
            {
            DrawTrends(nameL+" -90%", tl1,pl1-ChanelW*0.9,tl2,pl2-ChanelW*0.9,Green,1,"");
         ObjectSet(nameL+" -90%",OBJPROP_STYLE,2);
            DrawTrends(nameL+" -100%", tl1,pl1-ChanelW,tl2,pl2-ChanelW,Green,1,"");
         ObjectSet(nameL+" -100%",OBJPROP_STYLE,1);
         DrawTrends(nameL+" -10%", tl1,pl1-ChanelW*0.1,tl2,pl2-ChanelW*0.1,Red,1,"");
         ObjectSet(nameL+" -10%",OBJPROP_STYLE,2);
            }
            else
            {
            DrawTrends(nameH+" +90%", th1,ph1+ChanelW*0.9,th2,ph2+ChanelW*0.9,Red,1,"");
         ObjectSet(nameH+" +90%",OBJPROP_STYLE,2); 
            DrawTrends(nameH+" +100%", th1,ph1+ChanelW,th2,ph2+ChanelW,Red,1,"");
         ObjectSet(nameH+" +100%",OBJPROP_STYLE,1); 
         DrawTrends(nameH+" +10%", th1,ph1+ChanelW*0.1,th2,ph2+ChanelW*0.1,Green,1,"");
         ObjectSet(nameH+" +10%",OBJPROP_STYLE,2);
            }
         
         DrawTrends(nameH+" -10%", th1,ph1-ChanelW*0.1,th2,ph2-ChanelW*0.1,Red,1,"");
         ObjectSet(nameH+" -10%",OBJPROP_STYLE,2);
         DrawTrends(nameH+" 50%", th1,ph1-ChanelW*0.5,th2,ph2-ChanelW*0.5,Red,1,"");
         ObjectSet(nameH+" 50%",OBJPROP_STYLE,2) ;
         DrawTrends(nameL+" +10%", tl1,pl1+ChanelW*0.1,tl2,pl2+ChanelW*0.1,Green,1,"");
         ObjectSet(nameL+" +10%",OBJPROP_STYLE,2);
         
      }
      else
      {
         Delete_My_Obj(nameH+" ");
         Delete_My_Obj(nameL+" ");
      }
      
      if(Fibo)
      {  
         
         
         if(LowBase)
            {
            color clr=Red; //levclr=Red; 
            string fiboname=nameL+"Fibo";
            tf1=tl1; tf2=tl2; pf1=pl1; 
            //pf2=pl2;
            
            if(pl1<pl2)
            //double fiboLev=0.382; else fiboLev=-0.382; 
            pf2=pl2-((pl2-pl1)/61.8*23.6); else pf2=pl2-((pl1-pl2)/38.2*23.6);
            }
            else
            {
            clr=Green; //levclr=Green; 
            fiboname=nameH+"Fibo";
            tf1=th1; tf2=th2; pf1=ph1; 
            //pf2=ph2;  
            
            if(ph1<ph2)
            //fiboLev=-0.382; else fiboLev=0.382;
            pf2=ph2+((ph2-ph1)/38.2*23.6); else pf2=ph2+((ph1-ph2)/61.8*23.6); 
            }
     DrawTrends(fiboname, tf1,pf1,tf2,pf2,clr,1,"");
  /* ObjectCreate(fiboname,OBJ_FIBOFAN,0,tf1,pf1,tf2,pf2);
   ObjectSet(fiboname,OBJPROP_STYLE,0);
   ObjectSet(fiboname,OBJPROP_COLOR, clr);
   ObjectSet(fiboname,OBJPROP_LEVELCOLOR, levclr);
   ObjectSet(fiboname,OBJPROP_FIBOLEVELS,1);
   ObjectSet(fiboname,OBJPROP_FIRSTLEVEL+0,fiboLev);*/
      }
      else
      {
         Delete_My_Obj(nameH+"Fibo");
         Delete_My_Obj(nameL+"Fibo");
      }
     
   }
//---------------
//--------------
int DrawLabels(string name, int corn, int X, int Y, string Text, color Clr=Green, int Win=0, int FSize=10)
   {
     int Error=ObjectFind(name);// Çàïðîñ 
   if (Error!=Win)// Åñëè îáúåêòà â óê. îêíå íåò :(
    {  
      ObjectCreate(name,OBJ_LABEL,Win, 0,0); // Ñîçäàíèå îáúåêòà
    }
     
     ObjectSet(name, OBJPROP_CORNER, corn);     // Ïðèâÿçêà ê óãëó   
     ObjectSet(name, OBJPROP_XDISTANCE, X);  // Êîîðäèíàòà Õ   
     ObjectSet(name,OBJPROP_YDISTANCE,Y);// Êîîðäèíàòà Y   
     ObjectSetText(name,Text,FSize,"Arial",Clr);
   }
//---------------
//------------------------------------- 
int DrawTrends(string name, datetime T1, double P1, datetime T2, double P2, color Clr, int W=1, string Text="", bool ray=false, int Win=0)
   {
     int Error=ObjectFind(name);// Çàïðîñ 
   if (Error!=Win)// Åñëè îáúåêòà â óê. îêíå íåò :(
    {  
      ObjectCreate(name, OBJ_TREND, Win,T1,P1,T2,P2);//ñîçäàíèå òðåíäîâîé ëèíèè
    }
     
    ObjectSet(name, OBJPROP_TIME1 ,T1);
    ObjectSet(name, OBJPROP_PRICE1,P1);
    ObjectSet(name, OBJPROP_TIME2 ,T2);
    ObjectSet(name, OBJPROP_PRICE2,P2);
    ObjectSet(name, OBJPROP_RAY , ray);
    ObjectSet(name, OBJPROP_COLOR , Clr);
    ObjectSet(name, OBJPROP_WIDTH , W);
    ObjectSetText(name,Text);
   // WindowRedraw();
   }  
//-------------------------------------
void Delete_My_Obj(string Prefix)
   {//Alert(ObjectsTotal());
   for(int k=ObjectsTotal()-1; k>=0; k--)  // Ïî êîëè÷åñòâó âñåõ îáúåêòîâ 
     {
      string Obj_Name=ObjectName(k);   // Çàïðàøèâàåì èìÿ îáúåêòà
      string Head=StringSubstr(Obj_Name,0,StringLen(Prefix));// Èçâëåêàåì ïåðâûå ñèì

      if (Head==Prefix)// Íàéäåí îáúåêò, ..
         {
         ObjectDelete(Obj_Name);
         //Alert(Head+";"+Prefix);
         }                
        
     }
   }
//-------------------------------------    
//-------------------------------------   
double TrendLToBar(string name, int BarN)
   {
         datetime T1=ObjectGet(name,OBJPROP_TIME1), T2=ObjectGet(name,OBJPROP_TIME2);
         double P1=ObjectGet(name,OBJPROP_PRICE1), P2=ObjectGet(name,OBJPROP_PRICE2);

     double Step=(P2-P1)/(T2-T1),
            Res=P1+((Time[BarN]-T1)*Step); 
     return(Res);
   }   
int TimeToBar(datetime T)
   {  
     int i=0;
     while(Time[i]>=T) i++;
     if(T-Time[i]<Time[i-1]-T)
      return(i); else return(i-1); 
   }
//-------------------------------------    
//-------------------------------------  
void AlertHelp()
   {
      string text=
      "*****"+"ÑÏÐÀÂÊÀ ÏÎ ÈÍÄÈÊÀÒÎÐÓ TAACH_CHANELS."+"*****\n"+
      "\t"+"Àâòîð :"+"\t"+"Äåíèñ Îðëîâ"+"\n"+
      "\t"+"http://denis-or-love.narod.ru"+"\n"+
      "\t"+"http://vkontakte.ru/club3368806"+"\n"+"\n"+
      
      "\t"+"ÎÏÈÑÀÍÈÅ."+"\n"+
      "Ïîñòðîåíèå êàíàëîâ è ôèáî-óðîâíåé ïî ôðàêòàëàì ïî ìåòîäó \"ÒÀÀ×\" Ñ.×óâàøîâà."+"\n"+"\n"+
      
      "Âñå ôóíêöèè êðîìå Shift óïðàâëÿþòñÿ âûäåëåíèåì(äâîéíûì ùåë÷êîì)"+"\n"+
      "è ñäâèãàíèåì ââåðõ-âíèç ïî Control Panel."+"\n"+"\n"+
      
      "Del :"+"\t"+"Î÷èñòèòü ãðàôèê îò îáúåêòîâ èíäèêàòîðà"+"\n"+
      "Levels:"+"\t"+"Íàðèñîâàòü/Ñòåðåòü äîáàâî÷íûå óðîâíè êàíàëîâ."+"\n"+
      "FIBO :"+"\t"+"Íàðèñîâàòü/Ñòåðåòü ôèáî-óðîâåíü îò ðàáî÷åé ëèíèè êàíàëà."+"\n"+
      "Long :"+"\t"+"Èçìåíèòü äëèííó ëèíèé êàíàëîâ."+"\n"+
      "Shift :"+"\t"+"Ñäâèã êàíàëîâ ïî ôðàêòàëàì âëåâî."+"\n"+
      "\t"+"(óïðàâëÿåòñÿ ÷åðåç ñâîéñòâî îáúåêòà \"Òåêñò\")"+"\n"+
      "0-9 :"+"\t"+"Íàðèñîâàòü/Ñòåðåòü óêàçàííûé êàíàë."+"\n"+
      "All :"+"\t"+"Íàðèñîâàòü/Ñòåðåòü ÂÑÅ êàíàëû êðîìå ïåðâîãî."+"\n"+
      "\t"+"(íàâåðõ ÍÅ äî óïîðà/íàâåðõ äî óïîðà)"+"\n"+"\n"+
      
      "\t"+"*****\n"+
      "\t"+"ÏÎËÜÇÓÉÒÅÑÜ È ÏÐÎÖÂÅÒÀÉÒÅ!"+"\n"+"\n"+
      
      "\t"+"Âñå ìîè èíäèêàòîðû :"+"\n"+
      "\t"+"http://codebase.mql4.com/ru/author/denis_orlov";
      
      //MessageBox(text, "ÑÏÐÀÂÊÀ ÏÎ ÈÍÄÈÊÀÒÎÐÓ",MB_OK|MB_ICONINFORMATION );
      Alert(text);
   }

Comments