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

 
Vasiliy Pushkaryov #:

А такой код, что у Вас выдает?

У меня минимальные значения 15-16 миллисекунд.


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

ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR)
ChartGetInteger(0, CHART_WIDTH_IN_BARS)

В МТ4 такого не наблюдается 

И это раз в 5-10 начинает работать медленнее в МТ5

ChartTimePriceToXY(0, 0, date, Bid, x, y);
 
pivalexander #:


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

В МТ4 такого не наблюдается 

И это раз в 5-10 начинает работать медленнее в МТ5

Да, к сожалению это так. 
Это большая загадка, зачем ChartGet функции сделали асинхронными. 
Пытался достучатся до разработчиков, но увы.
Приходится городить костыли, чтобы эти функции вывести за скобки.

 
Nikolai Semko #:

Приходится городить костыли, чтобы эти функции вывести за скобки.

Рецепты костылей есть?)

 
pivalexander #:

Рецепты костылей есть?)

Создаем структуру с необходимыми параметрами чарта.
Обновляем и заполняем эту структуру при наступлении события CHARTEVENT_CHART_CHANGE.
Используем эту структуру для расчета.
Если лень писать свое, можете заглянуть сюда.

 
Nikolai Semko #:

Создаем структуру с необходимыми параметрами чарта.
Обновляем и заполняем эту структуру при наступлении события CHARTEVENT_CHART_CHANGE.
Используем эту структуру для расчета.
Если лень писать свое, можете заглянуть сюда.

Она же будет перезаполняться почти при каждом событии CHARTEVENT_CHART_CHANGE

 
pivalexander #:

Она же будет перезаполняться почти при каждом событии CHARTEVENT_CHART_CHANGE

Да, будет. И стоить это будет 2-20 миллисекунд на всю пачку. Это меньше времени одного кадра, поэтому для глаз это будет мало заметно.
Такова особенность выполнения ассинхронных функций. Пачка выполняется почти за то же время, что и одна функция.
Главное - не использовать эти функции в другие моменты времени
и совсем не использовать две абсолютно прожорливые функции:

  • ChartTimePriceToXY
  • ChartXYToTimePrice

значения, получаемые этими функциями можно получать расчетным путем с выйгрышем в тысячи раз. У меня это реализовано (см. ссылку выше).
Я думаю, что ваши лаги именно из-за этих функций.

 
Nikolai Semko #:

функциями можно получать расчетным путем с выйгрышем в тысячи раз. У меня это реализовано (см. ссылку выше).

Я думаю, что ваши лаги именно из-за этих функций.

Ок, чуть позже гляну


Nikolai Semko #:

Создаем структуру с необходимыми параметрами чарта.

А если график постоянно смещается, придется каждый раз перезаполнять эти структуры?

  • ChartTimePriceToXY
  • ChartXYToTimePrice

Вообще не используются?


Nikolai Semko #:

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

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


CHARTEVENT_CHART_CHANGE в MQL5
CHARTEVENT_CHART_CHANGE в MQL5
  • 2021.12.03
  • www.mql5.com
Почему то эти события запаздывают в MT5, или их нет нет, потом вывалилась куча, в МТ4 объект за графиком движется по событию CHARTEVENT_CHART_CHANG...
 
pivalexander #:

Ок, чуть позже гляну


А если график постоянно смещается, придется каждый раз перезаполнять эти структуры?

  • ChartTimePriceToXY
  • ChartXYToTimePrice

Вообще не используются?


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


Без кода Вам никто не поможет исправить ваши ошибки
 
void GetWindowProperties(Window &w)
  {
   w.Color=(uint)ChartGetInteger(W.ChartId,CHART_COLOR_BACKGROUND);
   w.Width =(int)ChartGetInteger(W.ChartId,CHART_WIDTH_IN_PIXELS);
   w.Height=(int)ChartGetInteger(W.ChartId,CHART_HEIGHT_IN_PIXELS,W.SubWin);
   w.Left_bar=(int)ChartGetInteger(W.ChartId,CHART_FIRST_VISIBLE_BAR);
   w.Y_min=ChartGetDouble(W.ChartId,CHART_PRICE_MIN);
   w.Y_max=ChartGetDouble(W.ChartId,CHART_PRICE_MAX);
   W.WindowsTotal=(int)ChartGetInteger(W.ChartId,CHART_WINDOWS_TOTAL);
   if((w.Y_max-w.Y_min)!=0 && w.Height!=0) w.dy_pix=(w.Y_max-w.Y_min)/w.Height;
   w.dx_pix=int(1<<ChartGetInteger(W.ChartId,CHART_SCALE));// how many pixels between the bars (from 1 to 32)
   w.Total_bars=(double)w.Width/w.dx_pix;
   w.Right_bar=w.Left_bar-w.Total_bars;
   if(w.Right_bar<0) w.Right_bar=0;
   int oldBIW=w.BarsInWind;
   w.BarsInWind=w.Left_bar-(int)w.Right_bar+1;

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

 
Nikolai Semko #:
Без кода Вам никто не поможет исправить ваши ошибки
double            Open(int x)      {CopyOpen(_Symbol,_Period,int(Bar(x)),1,Pr); return Pr[0];};

Почему используется CopyOpen(), а не iOpen() например?  CopyOpen() быстрее работает?