Помогите новичку в программировании понять, почему индикатор ZigZag тормозит на младших таймфреймах.

 

Всех приветствую!
Делаю первые шаги в программировании на MQL5. Хочу создать индикатор ЗигЗага по своей задумке.

На первый взгляд, всё получилось. Но вот есть нюанс. На старших таймфреймах (MN, W1, D1) индикатор работает без тормозов. Но как только переключаюсь на Н4 и ниже, терминал начинает тупить. На м1 вообще терминал глохнет.

AI Assistant подсказывает мне, проблема заключена в том, что на младших таймфреймах индикатор чаще мучает функцию OnCalculate. Именно тут мой мозг превращается в дупло буратино)))

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

Заранее, благодарствую!

//+------------------------------------------------------------------+
//|                                                       ZigZag.mq5 |
//|                        Copyright 2025, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   1

#property indicator_type1   DRAW_COLOR_ZIGZAG
#property indicator_color1  clrDodgerBlue, clrRed, clrGray

double ZigZagUpBuffer[];
double ZigZagDownBuffer[];
double ColorBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer (0, ZigZagUpBuffer, INDICATOR_DATA);
   SetIndexBuffer (1, ZigZagDownBuffer, INDICATOR_DATA);
   SetIndexBuffer (2, ColorBuffer, INDICATOR_COLOR_INDEX);
   
   return(INIT_SUCCEEDED); 
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {

   int start = prev_calculated > 0 ? prev_calculated - 1 : 1;

   for (int i = start; i < rates_total; i++)
     {

      if (close[i] > close[i - 1])
        {
         ZigZagUpBuffer[i] = low[i];
         ZigZagDownBuffer[i] = high[i];
         ColorBuffer[i] = 0;
        }

      else if (close[i] < close[i - 1])
        {
         ZigZagUpBuffer[i] = high[i];
         ZigZagDownBuffer[i] = low[i];
         ColorBuffer[i] = 1;
        }
      
      else
        {
         ZigZagUpBuffer[i] = high[i];
         ZigZagDownBuffer[i] = low[i];
         ColorBuffer[i] = 2;         
        }
     
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Aleksandr Zelentsov:

Всех приветствую!
Делаю первые шаги в программировании на MQL5. Хочу создать индикатор ЗигЗага по своей задумке.

На первый взгляд, всё получилось. Но вот есть нюанс. На старших таймфреймах (MN, W1, D1) индикатор работает без тормозов. Но как только переключаюсь на Н4 и ниже, терминал начинает тупить. На м1 вообще терминал глохнет.

AI Assistant подсказывает мне, проблема заключена в том, что на младших таймфреймах индикатор чаще мучает функцию OnCalculate. Именно тут мой мозг превращается в дупло буратино)))

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

Заранее, благодарствую!

Причина тормозов не в вашем индикаторе.  В вашем индикаторе всё красиво.

Я тоже наблюдаю на последних билдах сильные тормоза зигзага с малым периодом и на малых ТФ.

Нужно просить разрабов исправить.

По информации от модераторов, просить нужно в теме новой версией.

Поиск по форуму нормальным так никто и не сделал, поэтому  найти эту тему, тот ещё квест. 

 

Сейчас проверил ещё раз. 

Всё оказалось ещё хуже чем казалось.

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

К сожалению я не помню какой версией советника пользовался последнее время, вроде 4420, буквально на днях обновил и вот получил развлекалочку.

Диспетчером задач убиваю терминал, открываю, а на нём индикатор вешает терминал по новой.

Как теперь снести индикатор не знаю.

Разработчики, весёлые ребята, скучать не дают.

 
Aleksandr Slavskii #:

Сейчас проверил ещё раз. 

Всё оказалось ещё хуже чем казалось.

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

К сожалению я не помню какой версией советника пользовался последнее время, вроде 4420, буквально на днях обновил и вот получил развлекалочку.

Диспетчером задач убиваю терминал, открываю, а на нём индикатор вешает терминал по новой.

Как теперь снести индикатор не знаю.

Разработчики, весёлые ребята, скучать не дают.

просто надо подождать :-) после обновлений билда он не весит - он пере-накачивает историю и строит бары..

и/или в индикаторах ограничивать кол-во баров. 

 

Так вот оно как оказывается... Мда, неприятная эпидерсия))) Благодарю вас за пояснение.

В общем и целом, я тоже размышлял о том, что разработчики MQL5 зря кушают хлеб. Очень странно в 2024 году видеть терминал MetaTrader 5, который выглядит точно также, как софт в лихие 90-е годы.

 
Maxim Kuznetsov #:

просто надо подождать :-) после обновлений билда он не весит - он пере-накачивает историю и строит бары..

и/или в индикаторах ограничивать кол-во баров. 

1. Просто подождать не помогает. 

2. Ну я могу, а как быть с обычными пользователями, обычного зигзага?

Я ж любопытный, проверил на обычном зигзаге.

Терминал опять висит!!!

Блин второй раз на одни и те же грабли. Вай-вай.

 
Aleksandr Zelentsov #:

который выглядит точно также, как софт в лихие 90-е годы.

Да ладно вам, МТ5 постоянно обновляется, появляется, что то новое, кому то нужное, не так давно вот иконку сайта обновили)))


Ну а если серьёзно.

Не ошибается только тот, кто ничего не делает. Раз вылазят ошибки, значит метаквоты, что то меняют, работа идёт.

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

 

Обновили иконку сайта)))) Благое дело, очень нужное))

А если по факту... Да, я вижу, что обновы выходят... Только вот нет ощущения, что обновления прогрессивные. Сохраняется стойкое ощущение, что метаквотсы до сих пор копаются в старом белье. Хотя по законам жизни, старое обречено умереть, чтобы пришло новое. Взять ту же платформу cTrader на C#, или ещё лучше - онлайн платформу TradingView на питоне. Вот там всё идёт действительно прогрессивными шагами. С каждой обновой преображения однозначно заметны. Только вот в России сейчас на этих платформах проблематично торговать. Много заморочек. Да и Российские брокеры их не поддерживают, кроме АЛОР брокера. Всё то же древнее принуждение сидеть на МТ5. Но, как говорится, что имеем, то и используем)))

По поводу моего кода для ЗигЗага. Попробовал по совету товарища выше в комментариях прикрутить ограничение по барам... Как ни странно, но это решило проблему)))) Пока что пусть так. Посмотрим, может дальше обнова избавит ЗигЗаг от этой проблемы. Товарищу бокал вкусного напитка за идею ;)


Вопрос закрыт, всем спасибо и поклоны.

//+------------------------------------------------------------------+
//|                                          Every Candle ZigZag.mq5 |
//|                        Copyright 2025, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   1

#property indicator_type1   DRAW_COLOR_ZIGZAG
#property indicator_color1  clrDodgerBlue, clrRed, clrGray

input int BarLimit = 5000;

double ZigZagUpBuffer[];
double ZigZagDownBuffer[];
double ColorBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer (0, ZigZagUpBuffer, INDICATOR_DATA);
   SetIndexBuffer (1, ZigZagDownBuffer, INDICATOR_DATA);
   SetIndexBuffer (2, ColorBuffer, INDICATOR_COLOR_INDEX);
   
   return(INIT_SUCCEEDED); 
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {

   int start = MathMax(rates_total - BarLimit, 1);

   if(prev_calculated == 0)
     {
      ArrayInitialize(ZigZagUpBuffer, 0);
      ArrayInitialize(ZigZagDownBuffer, 0);
      ArrayInitialize(ColorBuffer, EMPTY_VALUE);
     }

   for (int i = start; i < rates_total; i++)
     {
      if (close[i] > close[i - 1])
        {
         ZigZagUpBuffer[i] = low[i];
         ZigZagDownBuffer[i] = high[i];
         ColorBuffer[i] = 0;
        }
      else if (close[i] < close[i - 1])
        {
         ZigZagUpBuffer[i] = high[i];
         ZigZagDownBuffer[i] = low[i];
         ColorBuffer[i] = 1;
        }
      else
        {
         ZigZagUpBuffer[i] = high[i];
         ZigZagDownBuffer[i] = low[i];
         ColorBuffer[i] = 2;         
        }
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Aleksandr Zelentsov #:

Обновили иконку сайта)))) Благое дело, очень нужное))

Взять ту же платформу cTrader на C#, или ещё лучше - онлайн платформу TradingView на питоне. Вот там всё идёт действительно прогрессивными шагами. С каждой обновой преображения однозначно заметны. 

Всё то же древнее принуждение сидеть на МТ5. Но, как говорится, что имеем, то и используем)))

1. Ну если быть до конца честным, то этим двум до МТ5 далеко. Губы накрасили, морду припудрили, пипл схавает, а написать нормального робота для них и уж тем более протестировать, это вряд ли получится.

2. А можно поподробнее, это кто ж такой лютый принуждатель у нас в стране, что его все брокеры боятся ?  )))

 
Aleksandr Slavskii #: Нужно просить разрабов исправить.

По информации от модераторов, просить нужно в теме новой версией.

Поиск по форуму нормальным так никто и не сделал, поэтому  найти эту тему, тот ещё квест. 

Все просто. Идем в общую тему https://www.mql5.com/ru/forum/general, и там сверху закреплены важные темы в том числе о новых билдах "Новая версия платформы ...". Выбирайте самую новую и пишите.

Форум трейдеров - MQL5 community: Общее обсуждение
Форум трейдеров - MQL5 community: Общее обсуждение
  • www.mql5.com
Анонсы, новости и общие вопросы, не вошедшие в другие разделы форума
 
Forester #:

Все просто. Идем в общую тему https://www.mql5.com/ru/forum/general, и там сверху закреплены важные темы в том числе о новых билдах "Новая версия платформы ...". Выбирайте самую новую и пишите.

Это для вас всё так просто.  При желании можно и так ухитриться не найти…