Пишу код индикатора. Прошу помочь при возникших проблемах. - страница 2

 
Вставляем это в старт функцию. Сразу вставил и код для падающего луча.
int start()
{
  double zz_0,                                       //цена первой наиденой вершины
       zz_1;                                       //цена второй наиденой вершины
int    h_index,                                    //индексы верхних екстремумов
       l_index;                                    //индексы нижних екстремумов
int    h_bar[50],                                  //бары верхних екстремумов
       l_bar[50];                                  //бары нижних екстремумов
double h_price[50],                                //цены верхних екстремумов
       l_price[50];                                //цены нижних екстремумов
int    limit;
int    peak;                                        //направвение луча
double h_max,                                       //максимум из найденых екстремумов
       l_min;                                      //минимум из наиденых екстремумов



int    counted_bars=IndicatorCounted();
      if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- main loop
   for(int i=0; i<limit; i++)
    {
      zz_0=GetExtremumZZPrice(NULL, 0, 0, ZZ_dp, ZZ_dv, ZZ_bs);  //цена первой наиденой вершины
      zz_1=GetExtremumZZPrice(NULL, 0, 1, ZZ_dp, ZZ_dv, ZZ_bs);  //цена второй наиденой вершины

      if(zz_0 > zz_1)                                            //если цена первой вершины больше цены второй вершины
        {                                                        //последдний луч поднимается    
         peak = 1;                                               //пик-вершина
        }
       else
        {
         if(zz_0 < zz_1)                                         //если цена первой вершины меньше цены второй вершины
             {                                                   //последдний луч падает      
              peak = -1;                                         //пик-низина
             }
         else 
         return(0);                                         //если обе вершины одной цены
        }     
        
        switch(peak)
         {
          case 1: 
                {
                  h_index = 0;                                   // первый индекс верхних екстремумов
                  l_index = 1;                                   // первый индекс нижних екстремумов
    
                  while(h_index <= ZZ_count)                     //пока индекс мен;ше масимума екстремумов
                    {                                            //ищем бары верхних екстремумов

                      h_bar[h_index] = GetExtremumZZBar(NULL, 0, h_index, ZZ_dp, ZZ_dv, ZZ_bs);

                                                                  //ищем цены верхних екстремумов

                      h_price[h_index] = GetExtremumZZPrice(NULL, 0, h_bar[h_index], ZZ_dp, ZZ_dv, ZZ_bs);

                                                                 //ищем максимальную цену среди наиденых цен
                      h_max = ArrayMax(h_price);                 //максимальная цена из наиденых цен
                      Ch_ZZ_h[i] = h_max;                        //записываем в буфер
            
                      h_index = h_index+2;                       //перебор через каждыи второй ексремум
                     }
                    while(l_index <= ZZ_count)
                     {
                      l_bar[l_index] = GetExtremumZZBar(NULL, 0, l_index, ZZ_dp, ZZ_dv, ZZ_bs);
                      l_price[l_index] = GetExtremumZZPrice(NULL, 0, l_bar[l_index], ZZ_dp, ZZ_dv, ZZ_bs);
                      l_min = ArrayMin(l_price);
                      Ch_ZZ_l[i] = l_min;
            
                      l_index = l_index+2
                     }
                   }
            break;
            case -1: 
                   {
                      h_index = 1;                               // первый индекс верхних екстремумов
                      l_index = 0;                               // первый индекс нижних екстремумов
                     while(h_index <= ZZ_count)                     //пока индекс мен;ше масимума екстремумов
                    {                                            //ищем бары верхних екстремумов

                      h_bar[h_index] = GetExtremumZZBar(NULL, 0, h_index, ZZ_dp, ZZ_dv, ZZ_bs);

                                                                  //ищем цены верхних екстремумов

                      h_price[h_index] = GetExtremumZZPrice(NULL, 0, h_bar[h_index], ZZ_dp, ZZ_dv, ZZ_bs);

                                                                 //ищем максимальную цену среди наиденых цен
                      h_max = ArrayMax(h_price);                 //максимальная цена из наиденых цен
                      Ch_ZZ_h[i] = h_max;                        //записываем в буфер
            
                      h_index = h_index+2;                       //перебор через каждыи второй ексремум
                     }
                    while(l_index <= ZZ_count)
                     {
                      l_bar[l_index] = GetExtremumZZBar(NULL, 0, l_index, ZZ_dp, ZZ_dv, ZZ_bs);
                      l_price[l_index] = GetExtremumZZPrice(NULL, 0, l_bar[l_index], ZZ_dp, ZZ_dv, ZZ_bs);
                      l_min = ArrayMin(l_price);
                      Ch_ZZ_l[i] = l_min;
            
                      l_index = l_index+2
                     }
                   }
             break;
      }   
  }
}

Поправил    }
 
Несколько ошибок уже нашел. Не все покозал. Покозать придумал после того как исправил.
 
Может есть замечания или наидены ашибки в логике или синтаксисе. Пишите.
 

Сейчас надо начать занятся рисованием. Перед рисованием надо проверить, есть ли канал соответствующий требованиям заданым в настройках. 

Канал соответствует требованиям если высота канала меньше ZZ_ch=300 за ZZ_count=6 преведущих вершин. Чертить надо вехнюю линию по цене h_max, а нижнюю по цене l_min. Начало обеих линий от  ZZ_count вершины. Она может быть так нижней, так и верхней вершиной. Конец линий Тime[0]. Так получается канал. Канал должен перерисовыватся до тех пор, пока цена пробьет его, но при этом он должен соответствовать ране оговореным требованиям  ( высота канала меньше ZZ_ch=300 за ZZ_count=6 преведущих вершин) .

 

Начало линии   bar_start = GetExtremumZZBar(NULL, 0, ZZ_count, ZZ_dp, ZZ_dv, ZZ_bs); Time[bar_start]

Конец линии     Time[0]

 if (h_max_price - l_min_price < ZZ_ch)
{

bar_start = GetExtremumZZBar(NULL, 0, ZZ_count, ZZ_dp, ZZ_dv, ZZ_bs);
SetTLine(Blue, "UP", Time[bar_start], h_max_price, Time[0], h_max_price, /*spindulys*/False);
SetTLine(Red, "DN", Time[bar_start], l_min_price, Time[0], l_min_price, /*spindulys*/False);
}

 

 

Вот тут и застрял

int start()
{
  double zz_0,                                       //цена первой наиденой вершины
       zz_1;                                       //цена второй наиденой вершины
int    h_index,                                    //индексы верхних екстремумов
       l_index;                                    //индексы нижних екстремумов
int    h_bar[50],                                  //бары верхних екстремумов
       l_bar[50];                                  //бары нижних екстремумов
double h_price[50],                                //цены верхних екстремумов
       l_price[50];                                //цены нижних екстремумов
int    limit;
int    peak;                                        //направвение луча
double h_max,                                       //максимум из найденых екстремумов
       l_min;                                      //минимум из наиденых екстремумов



int    counted_bars=IndicatorCounted();
      if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- main loop
   for(int i=0; i<limit; i++)
    {
      zz_0=GetExtremumZZPrice(NULL, 0, 0, ZZ_dp, ZZ_dv, ZZ_bs);  //цена первой наиденой вершины
      zz_1=GetExtremumZZPrice(NULL, 0, 1, ZZ_dp, ZZ_dv, ZZ_bs);  //цена второй наиденой вершины

      if(zz_0 > zz_1)                                            //если цена первой вершины больше цены второй вершины
        {                                                        //последдний луч поднимается    
         peak = 1;                                               //пик-вершина
        }
       else
        {
         if(zz_0 < zz_1)                                         //если цена первой вершины меньше цены второй вершины
             {                                                   //последдний луч падает      
              peak = -1;                                         //пик-низина
             }
         else 
         return(0);                                         //если обе вершины одной цены
        }     
        
        switch(peak)
         {
          case 1: 
                {
                  h_index = 0;                                   // первый индекс верхних екстремумов
                  l_index = 1;                                   // первый индекс нижних екстремумов
    
                  while(h_index <= ZZ_count)                     //пока индекс мен;ше масимума екстремумов
                    {                                            //ищем бары верхних екстремумов

                      h_bar[h_index] = GetExtremumZZBar(NULL, 0, h_index, ZZ_dp, ZZ_dv, ZZ_bs);

                                                                  //ищем цены верхних екстремумов

                      h_price[h_index] = GetExtremumZZPrice(NULL, 0, h_bar[h_index], ZZ_dp, ZZ_dv, ZZ_bs);

                                                                 //ищем максимальную цену среди наиденых цен
                      h_max = ArrayMax(h_price);                 //максимальная цена из наиденых цен
                      Ch_ZZ_h[i] = h_max;                        //записываем в буфер
            
                      h_index = h_index+2;                       //перебор через каждыи второй ексремум
                     }
                    while(l_index <= ZZ_count)
                     {
                      l_bar[l_index] = GetExtremumZZBar(NULL, 0, l_index, ZZ_dp, ZZ_dv, ZZ_bs);
                      l_price[l_index] = GetExtremumZZPrice(NULL, 0, l_bar[l_index], ZZ_dp, ZZ_dv, ZZ_bs);
                      l_min = ArrayMin(l_price);
                      Ch_ZZ_l[i] = l_min;
            
                      l_index = l_index+2
                     }
                   }
            break;
            case -1: 
                   {
                      h_index = 1;                               // первый индекс верхних екстремумов
                      l_index = 0;                               // первый индекс нижних екстремумов
                     while(h_index <= ZZ_count)                     //пока индекс мен;ше масимума екстремумов
                    {                                            //ищем бары верхних екстремумов

                      h_bar[h_index] = GetExtremumZZBar(NULL, 0, h_index, ZZ_dp, ZZ_dv, ZZ_bs);

                                                                  //ищем цены верхних екстремумов

                      h_price[h_index] = GetExtremumZZPrice(NULL, 0, h_bar[h_index], ZZ_dp, ZZ_dv, ZZ_bs);

                                                                 //ищем максимальную цену среди наиденых цен
                      h_max = ArrayMax(h_price);                 //максимальная цена из наиденых цен
                      Ch_ZZ_h[i] = h_max;                        //записываем в буфер
            
                      h_index = h_index+2;                       //перебор через каждыи второй ексремум
                     }
                    while(l_index <= ZZ_count)
                     {
                      l_bar[l_index] = GetExtremumZZBar(NULL, 0, l_index, ZZ_dp, ZZ_dv, ZZ_bs);
                      l_price[l_index] = GetExtremumZZPrice(NULL, 0, l_bar[l_index], ZZ_dp, ZZ_dv, ZZ_bs);
                      l_min = ArrayMin(l_price);
                      Ch_ZZ_l[i] = l_min;
            
                      l_index = l_index+2
                     }
                   }
             break;
      }   
  if (h_max_price - l_min_price < ZZ_ch)
 {

bar_start = GetExtremumZZBar(NULL, 0, ZZ_count, ZZ_dp, ZZ_dv, ZZ_bs);
 SetTLine(Blue, "UP", Time[bar_start], h_max_price, Time[0], h_max_price, /*spindulys*/False);
 SetTLine(Red, "DN", Time[bar_start], l_min_price, Time[0], l_min_price, /*spindulys*/False);
 }


}

return(0);
}







 
 
Получилось вот такой индюк. Рисует неправильно. Помоему код некудышный - работает медлено. Кто может поправить  ?
Файлы:
zzzbandymas.mq4  14 kb
 
zz_0=GetExtremumZZPrice(NULL, 0, 0, ZZ_dp, ZZ_dv, ZZ_bs);  //???? ?????? ???????? ???????
zz_1=GetExtremumZZPrice(NULL, 0, 1, ZZ_dp, ZZ_dv, ZZ_bs);  //???? ?????? ???????? ???????

      if(zz_0 > zz_1)                                            //???? ???? ?????? ??????? ?????? ???? ?????? ???????
        {                                                        //?????????? ??? ???????????    
         peak = 1;                                               //???-???????
        }
       
      if(zz_0 < zz_1)                                         //???? ???? ?????? ??????? ?????? ???? ?????? ???????
        {                                                   //?????????? ??? ??????      
         peak = -1;                                         //???-??????
        }
                                                 //???? ??? ??????? ????? ????
            
Comment("\n","\n","zz_0 = ",zz_0,"  zz_1 = ",zz_1,"  peak = ",peak);
На тестере в этом блоке или ничего или -1. Почему так ? Наидите мою ошибку.
 

Прогромисты, помогите  пожалуйста найти мне мои ошибки.

Хочетса до конца дописать индикатор и выяснить свои ошибки. Как иначе научится програмировать. Незнаю, поможет ли этот индюк в торговле, но закончить все равно его хочу.

 
gince:

Прогромисты, помогите пожалуйста найти мне мои ошибки.

Хочетса до конца дописать индикатор и выяснить свои ошибки. Как иначе научится програмировать. Незнаю, поможет ли этот индюк в торговле, но закончить все равно его хочу.

Обратись на форум https://forum.mql4.com/ru/15972 - там тебе быстрей помогут
 
Эта часть работает нормально
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
  double zz_0,                                       //???? ?????? ???????? ???????
       zz_1;                                       //???? ?????? ???????? ???????
int    h_index,                                    //??????? ??????? ???????????
       l_index;                                    //??????? ?????? ???????????
int    h_bar[50],                                  //???? ??????? ???????????
       l_bar[50];                                  //???? ?????? ???????????
double h_price[50],                                //???? ??????? ???????????
       l_price[50];                                //???? ?????? ???????????
int    limit;
int    peak;                                        //??????????? ????
double h_max,                                       //???????? ?? ???????? ???????????
       l_min;                                      //??????? ?? ???????? ???????????
/*


int    counted_bars=IndicatorCounted();
      if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- main loop
   for(int i=0; i<limit; i++)
    {*/
    limit=Bars-IndicatorCounted()-1;

            for(int i=limit;i>=0;i--)
            {
    //------------------------------------------------------------------------------------------------------------------------1
      zz_0=GetExtremumZZPrice(NULL, 0, 0, ZZ_dp, ZZ_dv, ZZ_bs); 
      zz_1=GetExtremumZZPrice(NULL, 0, 1, ZZ_dp, ZZ_dv, ZZ_bs);  
Comment("zz_0 = ",zz_0,"  zz_1 = ",zz_1);
      if(zz_0 > zz_1)      peak = 1;   
      else peak = -1;              
Comment("\n","\n","zz_0 = ",zz_0,"  zz_1 = ",zz_1,"  peak = ",peak);
        //--------------------------------------------------------------------------------------------------------------------2
       switch(peak)
         {
          case 1: 
                {
                  h_index = 0;                                   
                  l_index = 1;   
                                                 
               }
            break;
            //---------------------------------------------------------------------------------------------------------------3
            case -1: 
                   {
                      h_index = 1;                               
                      l_index = 0; 
                                                    
                   }  
             break;
             //---------------------------------------------------------------------------------------------------------4
         }
Comment("peak = ",peak,"  h_index = " ,h_index, "  l_index = ", l_index);
         }

return(0);
}