Определение и сравнение индексов минимума и максимума на младшем таймфрейме

 

Здравствуйте.

По условию требуется определить, что образовалось раньше - High или Low бара. Для этого

1) делаем цикл по барам текущего таймрейма (напр., D1).

2) Для каждого бара делаем вложенный цикл по барам младшего таймфрейма в его пределах и получаем индексы максимума и минимума с помощью iHighest и iLowest.

3) Значения полученных iHighest и iLowest записываем во временный массив или переменные int. 

4) Сравниваем эти значения с помощью ArrayMaximum(), если сохраняли в массив, или с помощью > или <, если использовали переменные int.

5) Фиксируем результат сравнения в итоговом массиве. Если iHighest>iLowest, записываем 0, иначе - записываем 1. Аналогично при использовании массива и ArrayMaximum().

Проблема. По результатам сравнения в итоговый массив заносятся некорректные данные. А именно, если в условии iHighest>iLowest (или ArrayMaximum(array)==0), то будет заносится 0 независимо от реальных значений индексов iHighest и iLowest. И наоборот: iHighest<iLowest (или ArrayMaximum(array)==0), то в итоговый массив занесется 1.

double         def_buf[],def_temp[2];//Определяем итоговый динамический массив def_buf и временный массив на 2 элемента def_temp[2]
int            bars;//Переменная для исключения из расчетов баров внутри текущего незакрытого дня
datetime       t;

//--- Определяем, сколько часов нужно исключить из расчета --//
   t=iTime(NULL,PERIOD_D1,0);//Определяем дату и время бара текущего дня
   bars=iBarShift(NULL,PERIOD_H1,t,false);//По этой дате и времени определяем индекс бара первого часа текущего дня
                                          //Дальнейшие расчеты будем проводить со сдвигом на это значение

int a,k;//Переменная а для цикла по дневным барам; переменная k для вложенного цикла по часовым барам
  
  for(a=prev_calculated;a<rates_total-1;a++)//Цикл для дней
    {
    if(IsStopped())
       break;
    for(k=bars;k<rates_total-1;k+=24) //Цикл для часов с шагом 24 часа, расчет начинается с бара с индексом bars
      {
      if(IsStopped())
       break;
       def_temp[0]=iHighest(NULL,PERIOD_H1,MODE_HIGH,24,k);//Записываем индекс максимума периода в позицию 0
       def_temp[1]=iLowest(NULL,PERIOD_H1,MODE_LOW,24,k);//Записываем индекс минимума в позицию 1
       Print("0=",def_temp[0]);//Печатаем, убеждаемся, что записаны корректные значения индексов
       Print("1=",def_temp[1]);

//--- Переходим к итоговому массиву

       ArrayResize(def_buf,a+1);//На каждой итерации увеличиваем итоговый массив на 1 элемент

       if(ArrayMaximum(def_temp)==0)//Если значение в позиции 0 временного массива (т.е. iHighest) больше,
       {
       ArrayFill(def_buf,a,1,0);    //то записываем в новую ячейку 0
       }
       else                         //иначе
       {
       ArrayFill(def_buf,a,1,1);    //записываем 1
       }
      }                             //Закрыли вложенный цикл
     }                              //Закрыли основной цикл

//---- Выводим 20 первых значений def_buf для проверки
   for(a=0;a<20;a++) 
   {
   Print(def_buf[a]);
   }
// ----- Они не верны :(

Помогите, пожалуйста, устранить некорректную запись значений по результатам сравнения индексов.

 
almb:

Здравствуйте.

По условию требуется определить, что образовалось раньше - High или Low бара. Для этого

1) делаем цикл по барам текущего таймрейма (напр., D1).

2) Для каждого бара делаем вложенный цикл по барам младшего таймфрейма в его пределах и получаем индексы максимума и минимума с помощью iHighest и iLowest.

3) Значения полученных iHighest и iLowest записываем во временный массив или переменные int. 

4) Сравниваем эти значения с помощью ArrayMaximum(), если сохраняли в массив, или с помощью > или <, если использовали переменные int.

5) Фиксируем результат сравнения в итоговом массиве. Если iHighest>iLowest, записываем 0, иначе - записываем 1. Аналогично при использовании массива и ArrayMaximum().

Проблема. По результатам сравнения в итоговый массив заносятся некорректные данные. А именно, если в условии iHighest>iLowest (или ArrayMaximum(array)==0), то будет заносится 0 независимо от реальных значений индексов iHighest и iLowest. И наоборот: iHighest<iLowest (или ArrayMaximum(array)==0), то в итоговый массив занесется 1.

Помогите, пожалуйста, устранить некорректную запись значений по результатам сравнения индексов.

Судя по коду у Вас индикатор. В индикаторах лучше не использовать лишние циклы - это же лишние тормоза, у Вас и так расчет на каждом баре, вот и определяйте за этот бар ситуацию, а потом на следующем баре считываете её и вносите правки в случае необходимости. И, не совсем ясна задача, так как максимум и минимум формируются сразу на открытии нового бара и у них не может быть понятия раньше или позже, если отсутствует критерий максимума или минимума - к примеру отклонение от цены открытия на сколько то пунктов.

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