Возможно, приятно удивитесь, если начнете работать с КОПИЯМИ таймсерий, сделав их предварительно...
А разве это не копирует?
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, не помогло.
А разве это не копирует?
Написал индикатор и в коде возникла необходимость найти минимум и максимум за определённый промежуток. Сначала был вариант из первого столбца, а потом мне отчего-то подумалось, что красивее и правильнее будет через 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. Плюс два вызова функций на каждой итерации цикла - а вот это уже может быть весьма серьезно, поскольку вызов функции самая дорогая (в смысле времени выполнения) операция.
Похвальный подход. Чаще всего проверка скорости нужна. И чаще всего она приятно или неприятно удивляет.
Я в свое время делал замер скорости выполнения разных операций.
Где-то лежит на форуме.
Но как я понял - сию операцию надо делать для каждого билда.
поскольку выделенное выполняется на каждой итерации цикла, то лучше так:
Это ненамного сократит время разового расчета, но для оптимизации может иметь значение.
Что же касается второго варианта - у Вас добавлено в цикл 2-а вызова функции iHighest(...) и iLowest(...)
1. это два цикла, вместо одного - уже потеря в скорости, хоть и не очень существенная
2. Плюс два вызова функций на каждой итерации цикла - а вот это уже может быть весьма серьезно, поскольку вызов функции самая дорогая (в смысле времени выполнения) операция.
Ясно-понятно, тогда оставлю-ка я первый вариант, раз не всегда компактно=быстро...
Спасибо за ответ.
Проверьте пожалуйста, возможно при запуске второго индикатора изменились условия рынка?
Написал индикатор и в коде возникла необходимость найти минимум и максимум за определённый промежуток. Сначала был вариант из первого столбца, а потом мне отчего-то подумалось, что красивее и правильнее будет через iHighest и iLowest работать.
Вроде на результаты индикатора это не повлияло (накинул оба варианта с теми же параметрами на график, всё совпало), просто код компактнее на несколько строк. Остальной код остался абсолютно тем же.
Но почему после изменения кода индикатор стал в 27!!!! раз медленнее??? Что за дела?
так не проще будет?
max=High[ArrayMaximum(High,limit+P-1,limit)];
min=Low[ArrayMinimum(Low,limit+P-1,limit)];
Второй вариант должен работать быстрее!
Проверьте пожалуйста, возможно при запуске второго индикатора изменились условия рынка?
Это уже давно появилось. Вызов функций медленнее собственной обработки.
Я пытаюсь отказываться от встроенных индикаторов. Но не всегда это возможно
так не проще будет?
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)];

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Написал индикатор и в коде возникла необходимость найти минимум и максимум за определённый промежуток. Сначала был вариант из первого столбца, а потом мне отчего-то подумалось, что красивее и правильнее будет через iHighest и iLowest работать.
Вроде на результаты индикатора это не повлияло (накинул оба варианта с теми же параметрами на график, всё совпало), просто код компактнее на несколько строк. Остальной код остался абсолютно тем же.
Но почему после изменения кода индикатор стал в 27!!!! раз медленнее??? Что за дела?