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

 
Nikolai Semko #:
Без кода Вам никто не поможет исправить ваши ошибки

Не, ни чего не выходит.

В вашем примере предполагается, рисование по таймеру или по событию от мышки когда график статичен и иногда при наступлении события CHARTEVENT_CHART_CHANG перезаполняется структура. Тут все ок!

В моем же случае, даже отказавшись от функций 

  • ChartTimePriceToXY
  • ChartXYToTimePrice

при при перемещении графика мышкой идет куча событий CHARTEVENT_CHART_CHANG и приходится заново заполнять структуру, перезаполняя только структур вызывая функции ChartGetInteger(), время сразу увеличивается более чем в 10 раз.

 
pivalexander #:

Не, ни чего не выходит.

В вашем примере предполагается, рисование по таймеру или по событию от мышки когда график статичен и иногда при наступлении события CHARTEVENT_CHART_CHANG перезаполняется структура. Тут все ок!

В моем же случае, даже отказавшись от функций 

  • ChartTimePriceToXY
  • ChartXYToTimePrice

при при перемещении графика мышкой идет куча событий CHARTEVENT_CHART_CHANG и приходится заново заполнять структуру, перезаполняя только структур вызывая функции ChartGetInteger(), время сразу увеличивается более чем в 10 раз.

Да, это так.
В МТ5 это реально проблема. Считаю это серьезной технической недоработкой MQ.
Но все же - приведите простой пример кода, где воспроизводятся Ваши лаги.
Задержка не должна быть больше 30 миллисекунд, а значит не заметна для глаз. 
Наверняка, где-то накосячили.

PS Также попробуйте профилированние кода, что увидеть источник тормозов.
 
Nikolai Semko #:
Да, это так.
В МТ5 это реально проблема. Считаю это серьезной технической недоработкой MQ.
Но все же - приведите простой пример кода, где воспроизводятся Ваши лаги.
Задержка не должна быть больше 30 миллисекунд, а значит не заметна для глаз. 
Наверняка, где-то накосячили.

PS Также попробуйте профилированние кода, что увидеть источник тормозов.

Дак я же написал, источник вот эти функции

ChartGetInteger()

Чем больше вызовов подряд идет, тем больше задержка, если их не использовать то все летает.

Тормоза начинаются если двигать график левой кнопкой мыши, если колесиком или клавиатурой, то все ок

PS: Объекты рисуемые на канвасе во весь график привязаны к датам должны двигаться за графиком при перемещении 
 
pivalexander #:

Дак я же написал, источник вот эти функции

Чем больше вызовов подряд идет, тем больше задержка, если их не использовать то все летает.

Тормоза начинаются если двигать график левой кнопкой мыши, если колесиком то все ок

Я тоже все писал о этих функциях.
Без кода не будет ответа.
Это форум программистов, а не телепатов.
 
Nikolai Semko #:
Я тоже все писал о этих функциях.
Без кода не будет ответа.
Это форум программистов, а не телепатов.

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

 

Событие CHARTEVENT_CHART_CHANGE работает асинхронно, поэтому от "лагов" избавиться нельзя.

Т.е. если происходит изменение чарта (наример сдвиг мышкой), эксперту отправляется уведомление об этом изменении, после чего происходит перерисовка графика.

Когда эксперт получит и обработает уведормление об изменении чарта точно сказать нельзя (например, эксперт может обрабатывать в это время другие события), но почти всегда это будет после отрисовки графика.
Именно поэтому видно, как сначала перерисовывается график с объектами по старым координатам и только потом объекты "перескакивают" на новые места.

 
Ilyas #:

Событие CHARTEVENT_CHART_CHANGE работает асинхронно, поэтому от "лагов" избавиться нельзя.

ChartGetInteger()
ChartTimePriceToXY()
ChartXYToTimePrice()

Вопрос в другом, почему эти функции начинают работать в 10 раз медленнее, если график двигать с зажатой левой кнопкой мыши, а если колесиком мышки или клавиатурой то быстрее гораздо 

Все замеры при получения события CHARTEVENT_CHART_CHANGE 
 
pivalexander #:

Почему эти функции начинают работать в 10 раз медленнее, если график двигать с зажатой левой кнопкой мыши, а если колесиком мышки или клавиатурой то быстрее гораздо 

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

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

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

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

#property indicator_chart_window
#include <Canvas\iCanvas_CB.mqh> //https://www.mql5.com/ru/code/22164

bool ok = true;
//+------------------------------------------------------------------+
int OnInit() {
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]) {
   return(rates_total);
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam) {
   if (id == CHARTEVENT_CHART_CHANGE) Draw();
}
//+------------------------------------------------------------------+
void Draw() {
   static uint last = 0;
   uint cur = GetTickCount();
   if (cur-last<30) return;
   last = cur;
   Canvas.Erase();
   for(double i = W.Right_bar; i<=W.Left_bar; i+=10 ) Canvas.FillCircle((int)_X(i),(int)_Y(iClose(NULL,0,(int)i)),8,0x80A02020);
   Canvas.Update();
}
//+------------------------------------------------------------------+

 

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

 
pivalexander #:

Вопрос в другом, почему эти функции начинают работать в 10 раз медленнее, если график двигать с зажатой левой кнопкой мыши, а если колесиком мышки или клавиатурой то быстрее гораздо 

Все замеры при получения события CHARTEVENT_CHART_CHANGE 

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