Можно ли программно изменить символ открытого графика в МТ5?

 

Здравствуйте, не нашел в свойствах Chart привязанного символа ( Терминал МТ5 ).

То есть не создавать на графике новый объект-график, а изменить свойство самого графика.

 
Aleksander Gladkov:

Здравствуйте, не нашел в свойствах Chart привязанного символа ( Терминал МТ5 ).

То есть не создавать на графике новый объект-график, а изменить свойство самого графика.

bool  ChartSetSymbolPeriod(
   long             chart_id,     // идентификатор графика
   string           symbol,       // имя символа
   ENUM_TIMEFRAMES  period        // период
   );

Период можно поставить текущий.

Документация по MQL5: Операции с графиками / ChartSetSymbolPeriod
Документация по MQL5: Операции с графиками / ChartSetSymbolPeriod
  • www.mql5.com
ChartSetSymbolPeriod - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov #:
bool  ChartSetSymbolPeriod(    long             chart_id,     // идентификатор графика    string           symbol,       // имя символа    ENUM_TIMEFRAMES  period        // период    );

Спасибо, это то что нужно.

Однако есть проблемы: "Команда меняет значения символа и периода указанного графика. Функция работает асинхронно, то есть отдает команду и не ждет окончания ее выполнения. Отданная команда поступает в очередь сообщений графика и выполняется только после обработки всех предыдущих команд."

Я поставил эту команду в обработку OnChartEvent.

В результате символ графика меняется, но возникает ошибка: 2023.12.16 11:47:01.492   (USDJPY,H1)    ChartWindowsHandle, Error Code = 4022 , ссылающаяся на старый сивмол (новый у меня EURUSD)

Поставил после ChartSetSymbolPeriod(...); Sleep(1000); 

(Это помогает, но не всегда.) Нет не помогает

 
Aleksander Gladkov #:

Спасибо, это то что нужно.

Однако есть проблемы: "Команда меняет значения символа и периода указанного графика. Функция работает асинхронно, то есть отдает команду и не ждет окончания ее выполнения. Отданная команда поступает в очередь сообщений графика и выполняется только после обработки всех предыдущих команд."

Я поставил эту команду в обработку OnChartEvent.

В результате символ графика меняется, но возникает ошибка: 2023.12.16 11:47:01.492   (USDJPY,H1)    ChartWindowsHandle, Error Code = 4022 , ссылающаяся на старый сивмол (новый у меня EURUSD)

Поставил после ChartSetSymbolPeriod(...); Sleep(1000); 

(Это помогает, но не всегда.) Нет не помогает

На всякий случай: смена символа/периода вызывает переинит.

При смене символа или таймфрейма графика, к которому эксперт прикреплен, выгрузка и загрузка эксперта не производится.
При этом последовательно вызываются обработчики OnDeinit() на старом символе/таймфрейме и OnInit() на новом символе/таймфрейме (если они есть),
значения глобальных переменных и статических переменных не сбрасываются.
Все события, поступившие для эксперта до завершения инициализации (функции OnInit()), пропускаются.

https://www.mql5.com/ru/docs/runtime/running

 
Спасибо, все получилось
 
Aleksander Gladkov #:

Спасибо, это то что нужно.

Однако есть проблемы: "Команда меняет значения символа и периода указанного графика. Функция работает асинхронно, то есть отдает команду и не ждет окончания ее выполнения. Отданная команда поступает в очередь сообщений графика и выполняется только после обработки всех предыдущих команд."

Я поставил эту команду в обработку OnChartEvent.

В результате символ графика меняется, но возникает ошибка: 2023.12.16 11:47:01.492   (USDJPY,H1)    ChartWindowsHandle, Error Code = 4022 , ссылающаяся на старый сивмол (новый у меня EURUSD)

Поставил после ChartSetSymbolPeriod(...); Sleep(1000); 

(Это помогает, но не всегда.) Нет не помогает

Я не понял что за ошибка

ERR_PROGRAM_STOPPED

4022

Тестирование было прекращено принудительно извне. Например, прервана оптимизацию, или закрыто окно визуального тестирования, или остановлен агент тестирования


Но на всякий случай можно поставить под условие, если текущий символ не совпадает с новым. И после ChartSetSymbolPeriod надо ставить не Sleep(), а ChartRedraw()