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

 

Индикатор должен рисовать канал по вершинам ЗигЗага. Во внешних переменных задается количество вершин и максимальная высота канала. Также во внешних переменных задается переменные ЗидЗага.

extern int ZZ_count=6;                  //Количество вершин
extern int ZZ_ch=300;                   //Максимальная высота канала

extern string ZigZag="Indicator Values"; //Данные ЗигЗага
extern int ZZ_dp=12;
extern int ZZ_dv=5;
extern int ZZ_bs=3;

double Ch_ZZ_h[];                       //буфер верхней границы канала
double Ch_ZZ_l[];                       //буфер нижней границы канала
 

Буду пользаватся функциями KimIV:

GetExtremumZZBar() - Эта функция выполняет поиск экстремума стандартного пользовательского индикатора ZigZag и возвращает номер бара. Функция принимает следующие необязательные параметры: GetExtremumZZPrice().- Эта функция выполняет поиск экстремума стандартного пользовательского индикатора ZigZag и возвращает его ценовой уровень. Функция принимает следующие необязательные параметры

SetTLine() - Эта функция выполняет установку объекта OBJ_TREND трендовая линия на текущем графике 

 

Идея хорошая, поделись посля индикатором...

 

По началу надо определить какой был последний луч ЗигЗага (падающий или поднимающийся). Если неправильно, поправте меня.

 

double zz_0,zz_1;
int    h_index,l_index;

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;          //пик-низина
    }
    еlse 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, up_bar[up_index], ZZ_dp, ZZ_dv, ZZ_bs);
                                                          //ищем максимальную цену среди наиденых цен
               h_max = ArrayMax(h_price);                 //максимальная цена из наиденых цен
               Ch_ZZ_h[i] = h_max;                        //записываем в буфер
            
               h_index = h_index+2;     //перебор через каждыи второй ексремум

        }
        break;
   case -1: 
       {
          h_index = 1;        // первый индекс верхних екстремумов
          l_index = 0;        // первый индекс нижних екстремумов

       }
        break;
   default: операторы
  }
 
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    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;                                         //пик-низина
             }
         еlse 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;                       //перебор через каждыи второй ексремум
                     }
                   }
            break;
            case -1: 
                   {
                      h_index = 1;                               // первый индекс верхних екстремумов
                      l_index = 0;                               // первый индекс нижних екстремумов

                   }
            break;
   
  }
}

Тут начало функции int start()

Может кто то сразу видет ошибки - поправте меня и если нетрудно обьясните ошибки. A я буду писать дальше.

 
sever30:

Идея хорошая, поделись посля индикатором...



Если получится закончить, то в конце темы он и дудет.
 
DDFedor:

поправьте опечатку в названии темы. ( если это опечатка... )



За ошибки извеняюсь. Я не русский и клава фонетическая. Иногда будут ошибки.
 

Господа модераторы, почему посты удаляем?

 
gince:


За ошибки извеняюсь. Я не русский и клава фонетическая. Иногда будут ошибки.

без проблем. я понял. тогда лучше лишний раз предупредите общественность.
 

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

 

            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
             }
Причина обращения: