- Функции для получения основных свойств текущего графика
- Идентификация графиков
- Получение списка графиков
- Получение символа и таймфрейма произвольного графика
- Обзор функций для работы с полным набором свойств
- Описательные свойства графика
- Проверка состояния основного окна
- Получение количества и признака видимости окон/подокон
- Режимы отображения графика
- Управление видимостью элементов графика
- Отступы по горизонтали
- Горизонтальный масштаб (по времени)
- Вертикальный масштаб (по цене и показаниям индикаторов)
- Цвета
- Управление мышью и клавиатурой
- Открепление окна графика
- Получение координат буксировки MQL-программы на график
- Перевод экранных координат во время/цену и обратно
- Прокрутка графика по оси времени
- Запрос перерисовки графика
- Переключение символа и таймфрейма
- Управление индикаторами на графике
- Открытие и закрытие графиков
- Работа с tpl-шаблонами графика
- Сохранение изображения графика
Открытие и закрытие графиков
MQL-программа может не только анализировать список графиков, но и модифицировать его: открывать новые или закрывать имеющиеся. Для этих целей выделено 2 функции: ChartOpen и ChartClose.
long ChartOpen(const string symbol, ENUM_TIMEFRAMES timeframe)
Функция открывает новый график с указанным символом и таймфреймом, и возвращает идентификатор нового графика. Если при выполнении случилась ошибка, результат равен 0, а код ошибки можно прочитать во встроенной переменной _LastError.
Если параметр symbol равен NULL, это означает символ текущего графика (на котором выполняется MQL-программа). Значение 0 в параметре timeframe соответствует PERIOD_CURRENT.
Максимально возможное количество одновременно открытых графиков в терминале не может быть больше CHARTS_MAX (100).
Пример использования функции ChartOpen покажем в следующем разделе, после изучения функций для работы с tpl-шаблонами.
Обратите внимание, что терминал позволяет создавать не только полноценные окна с графиками, но и объекты-графики. Они размещаются внутри обычных графиков по аналогии с прочими графическими объектами, такими как трендовые линии, каналы, ценовые метки и т.д. Объекты-графики позволяют отображать внутри одного стандартного графика несколько мелких фрагментов ценовых рядов для альтернативных символов и таймфреймов.
bool ChartClose(long chartId = 0)
Функция закрывает график с указанным идентификатором (значение по умолчанию 0 означает текущий график).
Функция возвращает признак успеха.
В качестве примера реализуем скрипт ChartCloseIdle.mq5, который будет закрывать дубликаты графиков с повторяющимися сочетаниями символа и таймфрейма, если на них нет MQL-программ и графических объектов.
Для начала нам необходимо составить некий список, ведущий подсчет графиков для конкретной пары символ/таймфрейм. Эта задача поручена функции ChartIdleList, которая во многом похожа на то, что мы видели в скрипте ChartList.mq5. Сам список формируется в массиве-карте MapArray<string,int> chartCounts.
#include <MQL5Book/Periods.mqh>
|
Попутно функция ChartIdleList заполняет массив duplicateChartIDs с идентификаторами свободных графиков, подходящих под условия закрытия.
int ChartIdleList(MapArray<string,int> &map, ulong &duplicateChartIDs[])
|
После того как список для удаления сформирован, вызываем в OnStart функцию ChartClose в цикле по списку.
void OnStart()
|
Для каждого графика предварительно вызывается функция ChartSetInteger(id, CHART_BRING_TO_TOP, true), чтобы показать пользователю, какое именно окно предполагается закрыть. Поскольку эта функция асинхронная (только помещает команду на активацию окна в очередь событий), требуется дополнительно вызвать ChartRedraw, что обрабатывает все накопившиеся сообщения. После этого пользователю выдается запрос на подтверждение действия. График закрывается только по нажатию Да. Нажатие Нет пропускает текущий график (оставляет его открытым), и цикл продолжается. Нажав кнопку Отмена, можно прерывать цикл досрочно.