CHARTEVENT_CHART_CHANGE в MQL5 - страница 4

 
Nikolai Semko #:

Если только в этом проблема, то ее можно легко решить. 
Например так:

 

Ильяс, непонятка в другом. 
Зачем ChartGet(также ChartTimePriceToXY и ChartXYToTimePrice) функции делать асинхронными, когда характеристики чарта уже сформированы во время перерисовки чарта при наступлении события  CHARTEVENT_CHART_CHANGE.
Получается что при наступлении события  CHARTEVENT_CHART_CHANGE родной чарт перерисовывается, а потом для остальных объектов запросы ChartGet помещаются в асинхронную очередь.
Зачем?
Ведь можно же формировать внутреннюю структуру параметров чарта и просто их считывать по запросу GhartGet функций. Зачем нужна асинхронность? Внутренний чатр вы же уже перерисовали.
Отсюда и отставание всех объектов от родного чарта.

  1. Эксперт не владеет ссылкой (shared pointer) на чарт, иначе пришлось бы организовывать синхронизацию доступа между потоками GUI и эксперта.
    Вместо этого, общение происходит через специальные lockfree очереди сообщений чарта и эксперта.
    Отсутствие локов позволяет мгновенно производить отрисовку чарта, не ожидая завершения работы с ним из других потоков.

  2. CharGet функции не асинхронные, с точки зрения MQL программы - результат функции получаете сразу, т.к. "под капотом" имеется ожидание ответа от чарта на запрос

    Это кстати один из критериев скорости работы ChartGet функций, чарт ответит на запросы, только когда освободится от остальных задач
 

Может вопрос покажется детским, но имеет ли смысл отрисовывать все элементы управления терминала  так часто как сейчас? Разумная дискредитация ( с учетом способности человека воспринимать изменения ) нужна.

Могу ошибаться - но у меня складывается впечатление о непрерывной отрисовке всех окон терминала. 

Выводы сделал пытаясь проанализировать очередь оконных сообщений.

 
Ilyas #:
  1. Эксперт не владеет ссылкой (shared pointer) на чарт, иначе пришлось бы организовывать синхронизацию доступа между потоками GUI и эксперта.
    Вместо этого, общение происходит через специальные lockfree очереди сообщений чарта и эксперта.
    Отсутствие локов позволяет мгновенно производить отрисовку чарта, не ожидая завершения работы с ним из других потоков.

  2. CharGet функции не асинхронные, с точки зрения MQL программы - результат функции получаете сразу, т.к. "под капотом" имеется ожидание ответа от чарта на запрос

    Это кстати один из критериев скорости работы ChartGet функций, чарт ответит на запросы, только когда освободится от остальных задач
Хм...
Разве shared memory не будет решением проблемы быстрой передачи структуры параметров чарта от потока GUI к потоку эксперта?
 
Вы меня удивляете, без лока нельзя гарантировать консистентность/целостность прочитанных данных
 
Nikolai Semko #:
Разве shared memory не будет решением проблемы быстрой передачи структуры параметров чарта от потока GUI к потоку эксперта?

кто-то эээ слегка вылез за пределы своей компетенции

 
Ilyas #:
Предполагаю, что при движении мышкой, происходит всплеск событий, которые обрабатывает эксперт.
При этом, если эксперт создаёт слишком большое число комманд чарту (загружает очередь чарта), то он получает пенальти, чтобы не произошло переполнение очереди комманд чарта.

Система проектировалась в ~2008 году, возможно стоит пересмотреть, подумаем.

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

К сожалению, работа с графикой и обработкой событий в мт5 желает быть лучшей, хотя-бы на уровне мт4, который это обрабатывает в разы быстрее при одинаковых условиях.

Я не в курсе что и где под "капотом", но результат виден на графике. Согласен, торговые события в мт5 превосходят мт4, но терминал должен быть рассчитан не только для алготрейдинга.

Пора что-то пересматривать и менять.

Прошу не принимать написанное - оскорблением!

 
Ilyas #:
Предполагаю, что при движении мышкой, происходит всплеск событий, которые обрабатывает эксперт.
При этом, если эксперт создаёт слишком большое число комманд чарту (загружает очередь чарта), то он получает пенальти, чтобы не произошло переполнение очереди комманд чарта.

Да так и есть, чем быстрее двигать мышью тем больше задержка, тоже самое есть очень быстро крутить колесо мышки, при наличии вызовов ChartGetInteger()

среднее время примерно доходит до ~0.019 сек.

Без вызов ChartGetInteger() ~0.0009 сек.

Вот пример без канваса и ресурса 

//+------------------------------------------------------------------+
//| Обработка события OnChartEvent                                   |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
   // 9 - Изменение графиков
   if (id == CHARTEVENT_CHART_CHANGE)
   {
      sw.time_start = GetMicrosecondCount();
   
      ChartGetInteger(0, CHART_COLOR_BACKGROUND);
      ChartGetInteger(0, CHART_WIDTH_IN_PIXELS);
      ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS);
      ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR);
      ChartGetInteger(0, CHART_WINDOWS_TOTAL);
      ChartGetInteger(0, CHART_SCALE);

      ChartGetDouble(0, CHART_PRICE_MIN);
      ChartGetDouble(0, CHART_PRICE_MAX);
      
      //---
   
      double time = sw.getTime(); // В секундах
      if (time < time_min) time_min = time;
      if (time > time_max) time_max = time;
      time_summ += time;
      time_count++;
   
      string text = "" + 
         "count: " + time_count + "\r\n" + 
         "Минимальное: " + DoubleToString(time_min, 8) + "\r\n" + 
         "Максимальное: " + DoubleToString(time_max, 8) + "\r\n" + 
         "Текущее: " + DoubleToString(time, 8) + "\r\n" + 
         "Среднее: " + DoubleToString(time_summ / time_count, 8) + "\r\n" + 
         "";
      Comment(text);
   }
}


Колесо, среднее время 0.0008



Перемещение левой кнопкой, среднее время 0.013


MT4 вне конкуренции :) Хоть мышкой со сверхзвуковой скоростью,  хоть  не мышкой, хоть чем двигай график , среднее время 0.000004


А вот без использования ChartGetInteger() в CHARTEVENT_CHART_CHANGE  МТ5 нагибает МТ4 :)

MT4 0.00000133 (5 нулей после ,)
MT5 0.00000025 (6 нулей после ,)
MT5 с оптимизацией 0.00000008 (7 нулей после ,)
 
pivalexander #:

...

А вот без использования ChartGetInteger() в CHARTEVENT_CHART_CHANGE  МТ5 нагибает МТ4 :)

Только проблема в том, что ChartGetInteger() используется в большинстве случаев

 
Nikolai Semko #:

Кстати, проверте мой пример выше.
У меня без разницы, мышкой или колесиком. 

Есть у вас разница, такая же, нужно только замер делать не в основной программе, а в iCanvas.mqh -> void ChartChanged(), потому он у вас отдельно выполняется, до Draw() в основной программе

 
Vitaly Muzichenko #:

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

К сожалению, работа с графикой и обработкой событий в мт5 желает быть лучшей, хотя-бы на уровне мт4, который это обрабатывает в разы быстрее при одинаковых условиях.

Я не в курсе что и где под "капотом", но результат виден на графике. Согласен, торговые события в мт5 превосходят мт4, но терминал должен быть рассчитан не только для алготрейдинга.

Пора что-то пересматривать и менять.

Прошу не принимать написанное - оскорблением!

В экспертах MT4 всегда была копия графика и его свойств. Именно этим объясняется скорость доступа к свойствам графика, в том числе и к объектам.

Обработка событий всегда и везде асинхронна. И вы можете, например, отключить поступление событий от мыши, тогда другие события будут обрабатываться несколько быстрее. Вот события прихода тиков отключить никак нельзя. А вы когда нибудь сравнивали скорости тиковых потоков в четвёрке и пятёрке? А ещё стаканы цен и торговые события, которые в пятёрке гораздо сложнее, чем в четвёрке