Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vitalie Postolache
12251
Vitalie Postolache 2015.01.09 12:13 

Написал индикатор и в коде возникла необходимость найти минимум и максимум за определённый промежуток. Сначала был вариант из первого столбца, а потом мне отчего-то подумалось, что красивее и правильнее будет через iHighest и iLowest работать.

Вроде на результаты индикатора это не повлияло (накинул оба варианта с теми же параметрами на график, всё совпало), просто код компактнее на несколько строк. Остальной код остался абсолютно тем же.

Но почему после изменения кода индикатор стал в 27!!!! раз медленнее??? Что за дела?


  for (int i=limit; i>=0; i--)//главный цикл расчёта
  { 
    ...
    Max=High[i];    
    Min=Low[i];

    for (int k=i;k<=i+P-1;k++) 
    {
      if(Max<High[k])  {Max=High[k];}
      if(Min>Low[k])   {Min=Low[k];}
    }
    ...
  }

 
  for (int i=limit; i>=0; i--)//главный цикл расчёта
  { 
    ... 
    Max=High[iHighest(NULL,0,MODE_HIGH,i+P-1,i)];    
    Min=Low[iLowest(NULL,0,MODE_LOW,i+P-1,i)];
    ...
  }

  
lob32371
508
lob32371 2015.01.09 12:37  
Возможно, приятно удивитесь, если начнете работать с КОПИЯМИ таймсерий, сделав их предварительно...
Vitalie Postolache
12251
Vitalie Postolache 2015.01.09 12:49  
lob32371:
Возможно, приятно удивитесь, если начнете работать с КОПИЯМИ таймсерий, сделав их предварительно...

А разве это не копирует?

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])

Заменил в коде High[],Low[] на high и low, не помогло.

lob32371
508
lob32371 2015.01.09 12:55  
evillive:

А разве это не копирует?

Звиняюсь, но дальше не интересно.
Vladyslav Goshkov
2154
Vladyslav Goshkov 2015.01.09 13:35  
evillive:

Написал индикатор и в коде возникла необходимость найти минимум и максимум за определённый промежуток. Сначала был вариант из первого столбца, а потом мне отчего-то подумалось, что красивее и правильнее будет через iHighest и iLowest работать.

Вроде на результаты индикатора это не повлияло (накинул оба варианта с теми же параметрами на график, всё совпало), просто код компактнее на несколько строк. Остальной код остался абсолютно тем же.

Но почему после изменения кода индикатор стал в 27!!!! раз медленнее??? Что за дела?

for (int i=limit; i>=0; i--)//главный цикл расчёта
  { 
    ...
    Max=High[i];    
    Min=Low[i];

    for (int k=i;k<=i+P-1;k++) 

поскольку выделенное выполняется на каждой итерации цикла, то лучше так:

for (int i=limit; i>=0; i--)//главный цикл расчёта
  { 
    ...
    Max=High[i];    
    Min=Low[i];
    int bn = i+P;
    for (int k=i;k<bn;k++) 

Это ненамного сократит время разового расчета, но для оптимизации может иметь значение. 

Что же касается второго варианта - у Вас добавлено в цикл 2-а вызова функции iHighest(...) и iLowest(...)

1. это два цикла вместо одного - уже потеря в скорости, хоть и не очень существенная

2. Плюс два вызова функций на каждой итерации цикла - а вот это уже может быть весьма серьезно, поскольку вызов функции самая дорогая (в смысле времени выполнения) операция.

Victor Nikolaev
Модератор
14638
Victor Nikolaev 2015.01.09 13:43  

Похвальный подход. Чаще всего проверка скорости нужна. И чаще всего она приятно или неприятно удивляет.

Я в свое время делал замер скорости выполнения разных операций.

Где-то лежит на форуме.

Но как я понял - сию операцию надо делать для каждого билда. 

Vitalie Postolache
12251
Vitalie Postolache 2015.01.09 13:48  
VladislavVG:

поскольку выделенное выполняется на каждой итерации цикла, то лучше так:

Это ненамного сократит время разового расчета, но для оптимизации может иметь значение. 

Что же касается второго варианта - у Вас добавлено в цикл 2-а вызова функции iHighest(...) и iLowest(...)

1. это два цикла, вместо одного - уже потеря в скорости, хоть и не очень существенная

2. Плюс два вызова функций на каждой итерации цикла - а вот это уже может быть весьма серьезно, поскольку вызов функции самая дорогая (в смысле времени выполнения) операция.

Ясно-понятно, тогда оставлю-ка я первый вариант, раз не всегда компактно=быстро...

Спасибо за ответ.

Ilyas
1209
Ilyas 2015.01.09 14:14  
Второй вариант должен работать быстрее!
Проверьте пожалуйста, возможно при запуске второго индикатора изменились условия рынка?
pako
3318
pako 2015.01.09 14:15  
evillive:

Написал индикатор и в коде возникла необходимость найти минимум и максимум за определённый промежуток. Сначала был вариант из первого столбца, а потом мне отчего-то подумалось, что красивее и правильнее будет через iHighest и iLowest работать.

Вроде на результаты индикатора это не повлияло (накинул оба варианта с теми же параметрами на график, всё совпало), просто код компактнее на несколько строк. Остальной код остался абсолютно тем же.

Но почему после изменения кода индикатор стал в 27!!!! раз медленнее??? Что за дела?


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

max=High[ArrayMaximum(High,limit+P-1,limit)];
min=Low[ArrayMinimum(Low,limit+P-1,limit)];
Victor Nikolaev
Модератор
14638
Victor Nikolaev 2015.01.09 14:52  
mql5:
Второй вариант должен работать быстрее!
Проверьте пожалуйста, возможно при запуске второго индикатора изменились условия рынка?

Это уже давно появилось. Вызов функций медленнее собственной обработки.

Я пытаюсь отказываться от встроенных индикаторов. Но не всегда это возможно 

Vitalie Postolache
12251
Vitalie Postolache 2015.01.09 14:59  
pako:

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

max=High[ArrayMaximum(High,limit+P-1,limit)];
min=Low[ArrayMinimum(Low,limit+P-1,limit)];


Это ещё медленнее, чем

Max=High[iHighest(NULL,0,MODE_HIGH,i+P-1,i)];    
Min=Low[iLowest(NULL,0,MODE_LOW,i+P-1,i)];


1234
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий