советник каналов

 
я решил написать саветник каторый рисует канал линию патдержки с сапротивления по точкам . Написал условие поиска верхней точки и нижней точки  саздал 4 точки  назвал их а,b,c,d   у меня награфике он находит 3 точки и рисует паралельную линию канала .Подскажите пажалусто какую фунуцию использовать   штобы найти  когда точка 4  касается цены линии канала, линии потдержки или сапротивления  последняя точка 4 служит для падтверждения што это паралельный канал васходящий или несходящий. Памогите как это правильно написать и какие функции использовать.
 

//+------------------------------------------------------------------+
//|                                           построения каналов.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
 
double   V,Bar1,Bar2;
int      I,k;
int      Bar,Bar_2;
double   A, B, C, D;
datetime TA,TB,TC,TD;
int Новый_Канал;
int Тип_Канала;
//+------------------------------------------------------------------+
//| Мои функции                                                      |
//+------------------------------------------------------------------+
 double PT(int Br){ // Поиск точки
   double B1,B2;
   double Точка;
   Точка = 0;
   I = Br;
   while (I!=0){
   Bar1 = High[I];
   Bar2 = High[I+1];
   if (Bar1 < Bar2) {Точка = Bar2; Bar = I+1;}
   B1 = High[I+2];
   B2 = High[I+3];
   if (B1>=B2 && B1<Точка) break;
   I = I + 1; }
 return(Точка);
 } 

 double PNT(int Br){
   double B1,B2;
   double Точка;
   Точка = 0;
   I = Br;
   while (I!=0){
   Bar1 = Low[I];
   Bar2 = Low[I+1];
   if (Bar1 > Bar2) {Точка = Bar2; Bar = I+1;}
   B1 = Low[I+2];
   B2 = Low[I+3];
   if (B1<=B2 && B1>Точка) break;
   I = I + 1; }
 return(Точка);
 } 

double Диапозон_Канала(double Число_1,double Число_2){
 double Результат = 0;
// основной код
 Результат = Число_1-Число_2;
//---
 return(Результат);}
   

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Зачистка ---  
   ObjectDelete("Точка_A");
   ObjectDelete("Точка_B");
   ObjectDelete("Точка_C");
   ObjectDelete("Точка_D"); 
   ObjectDelete("K2");
   ObjectDelete("восходящий канал");
   ObjectDelete("нисходящий канал");
   ObjectDelete("Тренд");
   ObjectDelete("Тренд2");
 
  
//--- Выбор канала ---
double Точка_А = PT(1);
datetime Время_А = Time[Bar];
double Точка_Б = PNT(1);
datetime Время_Б = Time[Bar];
if(Время_А > Время_Б) Новый_Канал = 1;

if(Время_А < Время_Б) Новый_Канал = 2;

//--- Две верхние точки и одна нижняя
if (Новый_Канал == 1){
 A = PT(1);
 TA = Time[Bar];
 ObjectCreate("Точка_A",OBJ_ARROW_DOWN,0,TA,A); 

 B = PNT(Bar);
 TB = Time[Bar];
 ObjectCreate("Точка_B",OBJ_ARROW_DOWN,0,TB,B);

 C = PT(Bar);
 TC = Time[Bar];
 ObjectCreate("Точка_C",OBJ_ARROW_DOWN,0,TC,C);

 D = PNT(Bar);
 TD = Time[Bar];
 ObjectCreate("Точка_D",OBJ_ARROW_DOWN,0,TD,D);
} 
//--- Две верхние точки и одна нижняя

if (Новый_Канал == 2){

 A = PNT(1);
 TA = Time[Bar];
 ObjectCreate("Точка_A",OBJ_ARROW_DOWN,0,TA,A);
 
 B = PT(Bar);
 TB = Time[Bar];
 ObjectCreate("Точка_B",OBJ_ARROW_DOWN,0,TB,B);

 C = PNT(Bar);
 TC = Time[Bar];
 ObjectCreate("Точка_C",OBJ_ARROW_DOWN,0,TC,C);

 D = PT(Bar);
 TD = Time[Bar];
 ObjectCreate("Точка_D",OBJ_ARROW_DOWN,0,TD,D);
}

if(A!=0 || B!=0 || C!=0){ 
//-- Линия тренда ---
ObjectCreate(0,"Тренд",OBJ_CHANNEL,0,TC,C,TA,A,TB,B); // приоритет на нажатие мышью
ObjectSet("Тренд",OBJPROP_RAY,False);
ObjectSet("Тренд",OBJPROP_WIDTH,1);
ObjectSet("Тренд",OBJPROP_FILL,true);
ObjectSet("Тренд",OBJPROP_RAY_RIGHT,True);
ObjectSetInteger(0,"Тренд",OBJPROP_COLOR,clrRed);
//---
//--- Старый канал синий
ObjectCreate(0,"Тренд2",OBJ_CHANNEL,0,TD,D,TB,B,TC,C); // приоритет на нажатие мышью
ObjectSet("Тренд2",OBJPROP_RAY,False);
ObjectSet("Тренд2",OBJPROP_WIDTH,1);
ObjectSet("Тренд2",OBJPROP_FILL,true);
ObjectSet("Тренд2",OBJPROP_RAY_RIGHT,True);
ObjectSetInteger(0,"Тренд2",OBJPROP_COLOR,clrBlue);
//---

if(C>B) V = Диапозон_Канала(C,B);
if(C<B) V = Диапозон_Канала(B,C);

V = NormalizeDouble(V,5)*100000;
if (V >= 150){Comment("Ширина канала = ",V);}
if (V < 150){Comment("Ширина канала = ",V);}
//---


 //  if(A == B) { Найти пересечение линии канала с ценой в интернете и поставить в условие
   if( A<C ){
   if( B>C || B<C){
   Тип_Канала = 1;

   ObjectCreate("нисходящий канал",OBJ_LABEL,0,0,0);
   ObjectSetInteger(0,"нисходящий канал",OBJPROP_FONTSIZE,24);
   ObjectSetString(0,"нисходящий канал",OBJPROP_TEXT,"Нисходящий канал");
   ObjectSetInteger(0,"нисходящий канал",OBJPROP_XDISTANCE,20);
   ObjectSetInteger(0,"нисходящий канал",OBJPROP_YDISTANCE,30);
   ObjectSetInteger(0,"нисходящий канал",OBJPROP_COLOR,clrRed);
   Sleep(500);
   ObjectSetInteger(0,"нисходящий канал",OBJPROP_COLOR,clrMediumBlue);
   Sleep(500);
   }}
 //  }
   
//---

 //  if(A == B) { 

   if( A>C ){
   if( B>C || B<C ){ 
   Тип_Канала = 2;
   
   ObjectCreate("восходящий канал",OBJ_LABEL,0,0,0);
   ObjectSetInteger(0,"восходящий канал",OBJPROP_FONTSIZE,24);
   ObjectSetString(0,"восходящий канал",OBJPROP_TEXT,"Восходящий канал");
   ObjectSetInteger(0,"восходящий канал",OBJPROP_XDISTANCE,20);
   ObjectSetInteger(0,"восходящий канал",OBJPROP_YDISTANCE,30);
   ObjectSetInteger(0,"восходящий канал",OBJPROP_COLOR,clrRed);
   Sleep(500);
   ObjectSetInteger(0,"восходящий канал",OBJPROP_COLOR,clrMediumBlue);
   Sleep(500);
   }}
 //   }
   }   
   else {
   ObjectCreate("K2",OBJ_LABEL,0,0,0);
   ObjectSetInteger(0,"K2",OBJPROP_FONTSIZE,24);
   ObjectSetString(0,"K2",OBJPROP_TEXT,"КАНАЛ НЕВОЗМОЖНО ПОСТРОИТЬ НЕХВАТАЕТ ОДНОЙ ИЗ ТОЧЕК");
   ObjectSetInteger(0,"K2",OBJPROP_XDISTANCE,20);
   ObjectSetInteger(0,"K2",OBJPROP_YDISTANCE,30);
   ObjectSetInteger(0,"K2",OBJPROP_COLOR,clrRed);}


/*Comment("D = ",D,"\n",
          "C = ",C,"\n",
          "B = ",B,"\n",
          "A = ",A); */  

//--- 
 }
 

 

Причина обращения: