Индикатор съедает слишком много ресурсов

 

Здравствуйте уважаемые специалисты!

Хотелось бы получить от вас советы.

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

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

Особенность еще такая, что на стандартных тайм фреймах 5 и 15 мин. в принципе работает, а вот как только подключу к не стандартному, то беда.

Я уже уменьшил раз в 5 объем проверочного кода, но безрезультатно.

А предыдущий вариант программы, спокойно работает на на всех не стандартных и стандартных таймфреймах, в любом количестве одновременно.

Поменял следующее:

У меня был изначально вот такой код:

((iMA(NULL,0,10,0,MODE_SMA,PRICE_CLOSE,bar+2)<Open[bar+2] &&

iMA(NULL,0,10,0,MODE_SMA,PRICE_CLOSE,bar+2)>Close[bar+2]) ||

(iMA(NULL,0,15,0,MODE_SMA,PRICE_CLOSE,bar+2)<Open[bar+2] &&

iMA(NULL,0,15,0,MODE_SMA,PRICE_CLOSE,bar+2)>Close[bar+2])) && ...


Затем я поменял знак || логическое или на логическое и &&

И поле этого программа входит в ступор.

Помогите разобраться.

 

Похоже, индикатор на каждом тике пересчитывает все бары. Сервис - Настройки - Графики - Макс. количество баров для проверки уменьшить до 200.

Нужно пересчитывать лишь последний бар. Для этого используется функция IndicatorCounted(). Правда, ее в билде 851 как устаревшую немного испортили, но в следующем обещали восстановить. В обновленном языке MQL-4 рекомендуется заголовок функции int start() заменить на такие 10 строк:

int OnCalculate (const int rates_total,      // размер таймсерий
                 const int Ранее_просчитано, // Ранее обработано баров
                 const datetime &time[],      // Time
                 const double &open[],        // Open
                 const double &high[],        // High
                 const double &low[],          // Low
                 const double &close[],        // Close
                 const long &tick_volume[],  // Tick Volume
                 const long &volume[],        // Real Volume
                 const int &spread[])          // Spread

Наберите в MetaEditor слово OnCalculate и нажмите на нем F1

Вместо значения функция IndicatorCounted() использовать значение второго параметра функции OnCalculate, в данном случае Ранее_просчитано - имя может быть любое. Посмотрите индикатор ADX по адресу   https://www.mql5.com/ru/code/7955 - на нем и потренируйтесь. Что у меня получилось - в прикрепленном файле

Файлы:
adx-01.mq4  5 kb
Причина обращения: