ChartGetInteger(), ChartTimePriceToXY() - серьезные проблемы вызывают зависание - страница 3

 
Vitaly Muzichenko #:
Пример подходит?
Посмотрю потом в процессе разработки. Пока в другой рутине. Спасибо за пример.
А разве для создания объектов их нельзя привязывать к координатам цена-время? Просто я объектами кроме Canvas, перестал пользоваться очень давно и уже не помню. Или можно привязывать только одну координату вместо двух? Например в прямоугольник или линии?
Просто пытаюсь понять необходимость новой библиотеки.
 
Nikolai Semko #:
Посмотрю потом в процессе разработки. Пока в другой рутине. Спасибо за пример.
А разве для создания объектов их нельзя привязывать к координатам цена-время? Просто я объектами кроме Canvas, перестал пользоваться очень давно и уже не помню. Или можно привязывать только одну координату вместо двух? Например в прямоугольник или линии?
Просто пытаюсь понять необходимость новой библиотеки.

Иногда есть только цена и координата, но нет времени, так вот для получения времени используем ChartTimePriceToXY = это как-раз случай с моего примера кода.

Частенько, нужно привязать кнопку ко времени текущего бара-10 баров, но кнопка привязывается координатами, поэтому нужно перевести цену и время в координаты.

Сейчас сделаю другой пример, более расширенный.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//+------------------------------------------------------------------+
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
  ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, true);
  double pr_max = ChartGetDouble(0, CHART_PRICE_MAX);
  double pr_min = ChartGetDouble(0, CHART_PRICE_MIN);
  double price = pr_min + (pr_max - pr_min) / 2.0;
  HLineCreate("line", price, clrRed);
  Out_txt(iTime(NULL, 0, 0), price);
  return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  ObjectDelete(0, "line");
  ObjectDelete(0, "txt");
  ChartRedraw();
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int32_t rates_total,
                const int32_t 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 int32_t &spread[])
{
  return(rates_total);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
  if(id == CHARTEVENT_MOUSE_MOVE) {
    datetime time = iTime(NULL, 0, 0);
    double price=ObjectGetDouble(0, "line", OBJPROP_PRICE);
    Out_txt(time, price);
  }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Out_txt(datetime time, double price)
{
  int x, y;
  ChartTimePriceToXY(0, 0, time, price, x, y);
  LabelCreate("txt", x, y, (string)time+" / "+DoubleToString(price,_Digits), clrRed);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void HLineCreate(const string name, double price, const color clr)
{
  ObjectCreate(0,name,OBJ_HLINE,0,0,0);
  ObjectSetDouble (0,name,OBJPROP_PRICE,price);
  ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
  ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
  ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
  ObjectSetInteger(0,name,OBJPROP_BACK,false);
  ObjectSetInteger(0,name,OBJPROP_SELECTABLE,true);
  ObjectSetInteger(0,name,OBJPROP_SELECTED,true);
  ObjectSetInteger(0,name,OBJPROP_HIDDEN,false);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void LabelCreate(const string name, const int x, const int y, const string text, const color clr)
{
  if(ObjectFind(0,name) < 0) {
    ObjectCreate(0,name,OBJ_LABEL,0,0,0);
    ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
    ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
    ObjectSetString (0,name,OBJPROP_FONT,"Arial");
    ObjectSetInteger(0,name,OBJPROP_FONTSIZE,8);
    ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
    ObjectSetInteger(0,name,OBJPROP_BACK,false);
    ObjectSetInteger(0,name,OBJPROP_SELECTABLE,true);
    ObjectSetInteger(0,name,OBJPROP_SELECTED,true);
    ObjectSetInteger(0,name,OBJPROP_HIDDEN,false);
  }
  ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
  ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
  ObjectSetString (0,name,OBJPROP_TEXT,text);
}
//+------------------------------------------------------------------+
 
Vitaly Muzichenko # :

Sometimes there is only price and coordinate, but there is no time, so to get time to get the time we use ChartTimePriceToXY = this is just the case with my example of code.

Often, you need to tie the button to the current bar of the current 18 bar, but the button is tied with coordinates, so you need to transfer the price and time to coordinates.

Now I will take another example, more expanded.

What is the problem with the ChartTimePriceToXY() function in this context?

By the way, the Event of CHART_EVENT_MOUSE_MOVE already transmits your coordinates X,Y.

Mouse Events  (IF  CHART_EVENT_MOUSE_MOUVE =true is set for the chart)

CHARTEVENT_MOUSE_MOUVE

the X coordinate

the Y coordinate

The Stretrate Value of A Bit Max of the Description of the Mopel Systems

 
Alain Verleyen #:
ChartTimePriceToX()

Очень ресурсоёмкая и дорогая

--

Кстати Событие CHART_EVENT_MOUSE_MOVE уже передает ваши координаты X,Y

Координаты нужно пересчитывать для нескольких объектов одновременно.

 
Vitaly Muzichenko # :

Очень ресурсоёмкая и дорогая

Вы можете это как-нибудь продемонстрировать?
 
Alain Verleyen #:
Вы можете это как-нибудь продемонстрировать?
https://www.mql5.com/ru/forum/439422#comment_44264754
ChartGetInteger(), ChartTimePriceToXY() - серьезные проблемы вызывают зависание
ChartGetInteger(), ChartTimePriceToXY() - серьезные проблемы вызывают зависание
  • 2023.01.09
  • www.mql5.com
Функции Chart-Functions в MQL5, такие как ChartGetInteger(), ChartTimePriceToXY() и ChartXYToTimePrice(), имеют серьезные проблемы с производительностью, особенно при интенсивном использовании. Они могут возвращать false без ошибок, вызывать задержки до 4-5 секунд и замораживать работу при использовании на VPS. Проблема сохраняется, несмотря на старые темы на форуме. Решение включает создание собственной таблицы параметров графика и обновление её при событии CHARTEVENT_CHART_CHANGE. Библиотека iCanvas_CB может помочь, но требуется интеграция.
 
Nikolai Semko #:
Посмотрю потом в процессе разработки. Пока в другой рутине. Спасибо за пример.
А разве для создания объектов их нельзя привязывать к координатам цена-время? Просто я объектами кроме Canvas, перестал пользоваться очень давно и уже не помню. Или можно привязывать только одну координату вместо двух? Например в прямоугольник или линии?
Просто пытаюсь понять необходимость новой библиотеки.

Приветствую, Николай!

Всё ещё актуально - в ожидании.

 
Vitaly Muzichenko #:

Приветствую, Николай!

Всё ещё актуально - в ожидании.

Да, совсем беда со временем.
Вот первая версия библиотеки (не без помощи ИИ (Opus 4.8), сделанная на основе моей библиотеки iCanvas) вместе с тестовым индикатором. Проверьте пожалуйста.
Есть ли какие-то замечания и дополнения?
Если все Ок, то опубликую в CodeBase


ЗЫ: Чуть не стошнило от работы с объектами. С Canvas все намного лучше. Код короче и более читаемый, производительность намного выше, возможностей в бесконечное число раз больше. 
 
Nikolai Semko #:
Да, совсем беда со временем.
Вот первая версия библиотеки (не без помощи ИИ (Opus 4.8), сделанная на основе моей библиотеки iCanvas) вместе с тестовым индикатором. Проверьте пожалуйста.
Есть ли какие-то замечания и дополнения?
Если все Ок, то опубликую в CodeBase


ЗЫ: Чуть не стошнило от работы с объектами. С Canvas все намного лучше. Код короче, производительность намного выше, возможностей в бесконечное число раз больше. 

Спасибо!

Я надеюсь правильно применил:

void MyChartTimePriceToXY(long, int, datetime time, double price, int &x, int &y){
  x=(int)ChartTable.X(time);
  y=(int)ChartTable.Y(price);
}
 
Nikolai Semko #:
Да, совсем беда со временем.
Вот первая версия библиотеки (не без помощи ИИ (Opus 4.8), сделанная на основе моей библиотеки iCanvas) вместе с тестовым индикатором. Проверьте пожалуйста.
Есть ли какие-то замечания и дополнения?
Если все Ок, то опубликую в CodeBase


ЗЫ: Чуть не стошнило от работы с объектами. С Canvas все намного лучше. Код короче и более читаемый, производительность намного выше, возможностей в бесконечное число раз больше. 

Сделал проверку и остальных функций.

Всё работает отменно, разницу видно без каких либо измерений.

Спасибо, огромное!