Индикатор гармонических паттернов и оптимизация кода MQL5

 

Привет. Тут такое дело, я написал индикатор для поиска гармонических паттернов.

Ограничился 1 значением зигзага и одним таймфреймом, но даже с учетом этого 2-3 графика с этим индюком грузят процессор на 99.9%. В чем причина, может у меня слишком много условий? или проблемы из за графических функций? 

Я пробовал сделать так, чтобы все в функции OnTick() выполнялось раз за свечу, но все бесполезно

Как оптимизировать мой код? Каким образом люди пишут что то типа индюка ZUP который выполняет чудовищное количество вычислений и при этом даже на 20 парах у меня ничуть не тормозит?

Поделитесь опытом, как снизить нагрузку

Файлы:
Harmonic.mq5  19 kb
 
Roman Sharanov:

Привет. Тут такое дело, я написал индикатор для поиска гармонических паттернов.

Ограничился 1 значением зигзага и одним таймфреймом, но даже с учетом этого 2-3 графика с этим индюком грузят процессор на 99.9%. В чем причина, может у меня слишком много условий? или проблемы из за графических функций? 

Я пробовал сделать так, чтобы все в функции OnTick() выполнялось раз за свечу, но все бесполезно

Как оптимизировать мой код? Каким образом люди пишут что то типа индюка ZUP который выполняет чудовищное количество вычислений и при этом даже на 20 парах у меня ничуть не тормозит?

Поделитесь опытом, как снизить нагрузку


Используйте отладчик для поиска ошибок пожалуйста. В Метаедиторе клавиша F5. Почитайте "Отладка" в справочнике Метаедитора.
Как минимум у Вас в коде бесконечный цикл:

amount=0;
      while(amount<5)
        {
         CopyBuffer(zz_handle,0,candle,1,ZigZag);
         CopyClose(_Symbol,PERIOD_M15,candle,1,Close);
         CopyTime(_Symbol,PERIOD_M15,candle,1,Time);
         if(ZigZag[0]!=0.0) // found zigzag
            {
               zz[amount].Price_=ZigZag[0]; 
               zz[amount].Close_=Close[0]; 
               zz[amount].Time_=Time[0]; 
               amount++;
            }
         candle++;
        }

если ZigZag[0] равен нулю (а он равен нулю) , то  amount не меняется.

 
Roman Sharanov:



Когда Ваш код станет рабочим, используйте инструмент "профилирования кода" для выяснения причин, где происходят основные утечки ресурсов  процессора. Тоже почитайте в справке метаедитора. Справка -> MetaEditor -> Разработка программ -> Профилирование кода. 

Успехов Вам в Ваших начинаниях! :)
 

Уважаемые гармонизаторы, пжалуйста покажите на скринахъ, что за чудо у вас.

Просим.

 
Alexander Ivanov:

Уважаемые гармонизаторы, пжалуйста покажите на скринахъ, что за чудо у вас.

Просим.

Почему во множественном числе?
Гармонизатор сам ещё своего чуда не видел. Ему ещё предстоит долгая работа над ошибками. Тогда может мир и увидит Чудо. Не глумитесь над человеком. :)) Человек учится программировать, этот факт уже похвален.
 
Nikolai Semko:

Используйте отладчик для поиска ошибок пожалуйста. В Метаедиторе клавиша F5. Почитайте "Отладка" в справочнике Метаедитора.
Как минимум у Вас в коде бесконечный цикл:

если ZigZag[0] равен нулю (а он равен нулю) , то  amount не меняется.


так и должно быть! меняется параметр candle и соответственно идет поиск вершин зигзага!

 
Alexander Ivanov:

Уважаемые гармонизаторы, пжалуйста покажите на скринахъ, что за чудо у вас.

Просим.


Вот результаты. Система очень сырая, я очень хочу ее дорабатывать, но нет мотивации поскольку на реале ничего невозможно тестить.
Я два раза передумывал логику под MQL4 но все равно тормоза и "не отвечает", потом изучил MQL5 и снова на него переписал, думал тут получше будет, но нет

 
Roman Sharanov:

так и должно быть! меняется параметр candle и соответственно идет поиск вершин зигзага!


если amount=0 и этот параметр не меняется в цикле, тогда это бесконечный цикл while:


amount=0;
while(amount<5)

{

...

Это и грузит Ваш процессор.

А дальше у вас идет деление на ноль в Pattern_Conditions()

 
Nikolai Semko:

если amount=0 и этот параметр не меняется в цикле, тогда это бесконечный цикл while:

Это и грузит Ваш процессор.

А дальше у вас идет деление на ноль в Pattern_Conditions()


Тогда как реализовать поиск 5 последних вершин зигзага? если на свече candle имеется ненулевой зигзаг, мы записываем его и увеличиваем amount на 1. И так пока не будут найдены 5 ненулевых зигзагов

 
Roman Sharanov:

Тогда как реализовать поиск 5 последних вершин зигзага? если на свече candle имеется ненулевой зигзаг, мы записываем его и увеличиваем amount на 1. И так пока не будут найдены 5 ненулевых зигзагов

Я лишь указал вам на первые попавшиеся ошибки. Еще раз повторяю - используйте отладчик с точками прерывания.

Ну например, хотя бы вывести amount++ из условия 

amount=0;
      while(amount<5)
        {
         CopyBuffer(zz_handle,0,candle,1,ZigZag);
         CopyClose(_Symbol,PERIOD_M15,candle,1,Close);
         CopyTime(_Symbol,PERIOD_M15,candle,1,Time);
         if(ZigZag[0]!=0.0) // found zigzag
            {
               zz[amount].Price_=ZigZag[0]; 
               zz[amount].Close_=Close[0]; 
               zz[amount].Time_=Time[0];     
            }
            amount++;
         candle++;
        }

или вывести проверку из цикла

 amount=0;
      if(ZigZag[0]!=0.0) while(amount<5)
        {
         CopyBuffer(zz_handle,0,candle,1,ZigZag);
         CopyClose(_Symbol,PERIOD_M15,candle,1,Close);
         CopyTime(_Symbol,PERIOD_M15,candle,1,Time);
         zz[amount].Price_=ZigZag[0];
         zz[amount].Close_=Close[0];
         zz[amount].Time_=Time[0];
         amount++;
         candle++;
        }

Но разбираться в Вашем коде нет ни времени, ни желания.

 
Roman Sharanov:

Тогда как реализовать поиск 5 последних вершин зигзага? если на свече candle имеется ненулевой зигзаг, мы записываем его и увеличиваем amount на 1. И так пока не будут найдены 5 ненулевых зигзагов


int cnt=0;
for(int i=1;i<N;i++)
{
 if(zig)
 {
 cnt++;
 }
 if(cnt==5)
 {
 break;
 }
}