Помогите написать функцию. Фракталы...

 

Приветствую. Требуется помощ.  Пытаюсь написать подпрограмму чтоб она записывала в массив цену и номер бара первых 10 фракталов. 


Чтоб потом с ними можно было работать типа так: 

if(hk[1]<lk[1])   // hk[1],lk[1] - номер бара с фракталом.
     {                              
      A=hi[1]; B=lo[1];
      Ak=hk[1];Bk=lk[1];
     } 

Вот код MT4.. работает неправильно. я читал что в массиве первый записанный элемент хранится в конце. Вот у меня и получается что в hk[1] значение 147 а должно быть 3.  При этом он даже сигналы рисует на графике с отстованием около 147 баров. Как сделать правильно?

// Определяем наличие фракталов на 3 свече
   double fractalUp = iCustom( _Symbol, _Period, globIndName, 0, 3 );   // Значение фрактала вверх на 3 свече
   double fractalDn = iCustom( _Symbol, _Period, globIndName, 1, 3 );   // Значение фрактала вниз на 3 свече
   if(fractalUp==EMPTY_VALUE && fractalDn==EMPTY_VALUE) // Если оба фрактала отсутствуют
      return(-1); // возвр. -1

   double            lo[10]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};   // Массив - буфер фракталов вниз
   double            hi[10]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};   // Массив - буфер фракталов вверх
   int               lk[10]={0,0,0,0,0,0,0,0,0,0};   // Массив - буфер фракталов вниз
   int               hk[10]={0,0,0,0,0,0,0,0,0,0};   // Массив - буфер фракталов вверх
   if(fractalUp!=EMPTY_VALUE || fractalDn!=EMPTY_VALUE)
      CheckFractal( PERIOD_CURRENT,9,lo,hi,lk,hk);
  Print(__FUNCTION__,"  hk1 = ",hk[1],", hi1 =  ",hi[1],", lk1 = ",lk[1],
         ", lo1 = ",lo[1]);
//+------------------------------------------------------------------+
//| Ищем и заносим в массив данные по фракталам                              |
//+------------------------------------------------------------------+
void CheckFractal(const ENUM_TIMEFRAMES period,// Используемый ТФ
                  const int count,// Сколько копировать элементов
                  double            &lo[],// Массив - буфер фракталов вниз (цены)
                  double            &hi[],   // Массив - буфер фракталов вверх (цены)
                  int               &lk[],   // Массив - буфер фракталов вниз  (бары)
                  int               &hk[]    // Массив - буфер фракталов вверх (бары)
                  )
  {
   const int stop=150;
   int l=1;
   int h=1;
   for(int i=3; i<stop; i++) // Цикл поиска фрактала (начиная с 3 свечи)
     {
      double fractalUp=iCustom(_Symbol,_Period,globIndName,0,i);      // Значение фрактала верх на i свече
      double fractalDn=iCustom(_Symbol,_Period,globIndName,1,i);      // Значение фрактала вниз на i свече
      if(fractalUp==EMPTY_VALUE  &&  fractalDn==EMPTY_VALUE) continue;  //  Если фрактал не найден - переход. к след. свече
      if(fractalUp!=EMPTY_VALUE && h<count)
        {
         hi[h]=NormalizeDouble( fractalUp,_Digits);
         hk[h]=i;
         h=h++;
        }
      if(fractalDn!=EMPTY_VALUE && l<count)
        {
         lo[l]=NormalizeDouble( fractalDn,_Digits);
         lk[l]=i;
         l=l++;
        }                 
      }
  }

 
ForTorg:

Приветствую. Требуется помощ.  Пытаюсь написать подпрограмму чтоб она записывала в массив цену и номер бара первых 10 фракталов.  

Что бросилось в глаза:

  • нумерация в массивах - с нуля. Т.е. "int l=0;" и "int h=0;", соответственно, "if(hk[0]<lk[0])"
  • количество элементов - 10. Почему тогда используем count = 9?
  • распечатайте, что получается в результате выполнения этой операции: "h=h++;". Из-за этого и не записывается ничего, кроме первого элемента массива (и последним туда записывается последний найденный фрактал на баре №147)
  • если l и h стали = 9, цикл нужно прервать.
Как-то так. В остальном, должно работать ;)
 
komposter:

Что бросилось в глаза:

  • нумерация в массивах - с нуля. Т.е. "int l=0;" и "int h=0;", соответственно, "if(hk[0]<lk[0])"
  • количество элементов - 10. Почему тогда используем count = 9?
  • распечатайте, что получается в результате выполнения этой операции: "h=h++;". Из-за этого и не записывается ничего, кроме первого элемента массива (и последним туда записывается последний найденный фрактал на баре №147)
  • если l и h стали = 9, цикл нужно прервать.
Как-то так. В остальном, должно работать ;)

по первым двум пунктам...  у меня    int l=1; int h=1; запись начинается с 1 ячейки в массиве. Вот и выходит что 0 свободна. с 1 по 9 пишем. hk[1]<lk[1] так мне проще воспринимать код. Как то не очень звучит "нулевой фрактал", а вот "первый фрактал" самое то :-)  И того сохраняем 9 нижних и 9 верхних фракталов.

"h=h++;" А тут я протупил... должно быть h++;

 цикл остановил так if ( l==count && h==count)  break;

Спасибо за помощ. Все работает.