Являются ли данные конструкции равноценными по конечному результату? - страница 2

 
mql5:
Второй вариант должен работать быстрее!
Проверьте пожалуйста, возможно при запуске второго индикатора изменились условия рынка?
Запускал профилировщик на Н1, практически между запусками первой и второй версии прошло 15-20 секунд. Что могло измениться за это время? Свечей уж точно больше не стало, да и тики редко приходят.
 
    Max=High[iHighest(NULL,0,MODE_HIGH,P,i)];    
    Min=Low[iLowest(NULL,0,MODE_LOW,P,i)];
 
pako:

так не проще будет?

Есть способ гораздо шустрее.

Программисты из Jobs, скорее всего, не используют оба тормозных варианта топикстартера. Возможно, поделятся секретами здесь...

Да и любые программисты такое пишут только на коленке в спешке, ИМХО.

 
Integer:

Да, это ошибка, внимательностью я не блещу. Теперь и правда второй вариант быстрее, как и сказал mql5.

lob32371:

Есть способ гораздо шустрее.

Программисты из Jobs, скорее всего, не используют оба тормозных варианта топикстартера. Возможно, поделятся секретами здесь...

Да и любые программисты такое пишут только на коленке в спешке, ИМХО.

Если это связано с применением классов-структур, то я их не умею готовить, мне пока доступен только стандартный классический MQL, увы. Может, поделитесь?

 
evillive:

Да, это ошибка, внимательностью я не блещу. Теперь и правда второй вариант быстрее, как и сказал mql5.

Если это связано с применением классов-структур, то я их не умею готовить, мне пока доступен только стандартный классический MQL, увы. Может, поделитесь?

Классы всегда медленнее, но зато возможности
 
evillive:

Если это связано с применением классов-структур, то я их не умею готовить, мне пока доступен только стандартный классический MQL, увы. Может, поделитесь?

Не связано. У меня компа под рукой нет, чтобы написать больше. Уточните, в теле главного цикла переменная P меняет значение?
 
lob32371:
Не связано. У меня компа под рукой нет, чтобы написать больше. Уточните, в теле главного цикла переменная P меняет значение?
Нет, это пользовательский параметр. Мне выше уже указали, что я его неправильно использовал.
 
evillive:
Нет, это пользовательский параметр. Мне выше уже указали, что я его неправильно использовал.
Возможно, завтра у компа буду - покажу. Странно, что простые и эффективные решения программисты поленились выложить. Придется новичку отдуваться.
 
evillive:

Да, это ошибка, внимательностью я не блещу. Теперь и правда второй вариант быстрее, как и сказал mql5.

Если это связано с применением классов-структур, то я их не умею готовить, мне пока доступен только стандартный классический MQL, увы. Может, поделитесь?

Напрасно жалеть! Потратишь уйму времени и усилий, а в результате "бесцельно потраченные годы"! Старый мкл4 давал возможность быстро реагировать на изменения рынка, легко подправляя код! В новом такой возможности нет, очень уж всё заорганизовано так, что меняя чуть-чуть, надо перелопачивать весь код! Особенно мешает то, что сейчас и в старом, подправляя код, не меняя переменных, заданных в extern'e, приходится лезть в папки и стирать параметры и кеши, иначе советник просто повторяет прошлые прогоны, не читая заново код, т.к. изменения не затронули внешние параметры! Мне уж надоело "возникать"! У разработчиков, видимо, задача не приблизить программирование к широкому кругу пользователей, а удалить от него, чтобы развивать более выгодный для них околофорексный бизнес, базирующийся на Фрилансе, Маркете и Сигналах! Будущее покажет, куда это приведёт!
 
lob32371:
Странно, что простые и эффективные решения программисты поленились выложить.

Замеряйте:

#property strict

sinput int P = 10000;

double GetNextHighest( const int Pos, const int period )
{
  static int N;
  static double Price;

  if (Pos <= 0)
  {
    N = iHighest(NULL, 0, MODE_HIGH, period, -Pos);
    Price = High[N];
  }
  else
  {
    if (N - Pos >= period)
    {
      N = iHighest(NULL, 0, MODE_HIGH, period, Pos);
      Price = High[N];
    }
    else
    {
      const double Tmp = High[Pos];

      if (Tmp >= Price)
      {
        N = Pos;
        Price = Tmp;
      }
    }
  }

  return(Price);
}

double GetNextLowest( const int Pos, const int period )
{
  static int N;
  static double Price;

  if (Pos <= 0)
  {
    N = iLowest(NULL, 0, MODE_LOW, period, -Pos);
    Price = Low[N];
  }
  else
  {
    if (N - Pos >= period)
    {
      N = iLowest(NULL, 0, MODE_LOW, period, Pos);
      Price = Low[N];
    }
    else
    {
      const double Tmp = Low[Pos];

      if (Tmp <= Price)
      {
        N = Pos;
        Price = Tmp;
      }
    }
  }

  return(Price);
}

void Benchmark1( const int Limit, const int period )
{
  double Max = GetNextHighest(-Limit, period);
  double Min = GetNextLowest(-Limit, period);

  for (int i = Limit; i >= 0; i--)
  {
//  ...

    Max = GetNextHighest(i, period);
    Min = GetNextLowest(i, period);

//  ...
  }

  return;
}

void Benchmark2( const int Limit, const int period )
{
  double Max, Min;

  for (int i = Limit; i >= 0; i--)
  {
//  ...

    Max = High[iHighest(NULL, 0, MODE_HIGH, period, i)];
    Min = Low[iLowest(NULL, 0, MODE_LOW, period, i)];

//  ...
  }

  return;
}

void OnStart( void )
{
  const int Limit = ArraySize(Time) - 1;

  Benchmark1(Limit, P);
  Benchmark2(Limit, P);

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