1.11 Операции с графиками. Получение рыночной информации

Доброго времени суток.

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

Операции с графиками

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

  • ChartID — функция возвращает идентификационный номер (ID) графика, на котором эта функция вызвана. Номер представляет собой длиннющее число целого типа long, но нам не нужно его помнить по памяти, оно лишь участвует в дальнейшей работе с графиком.
  • ChartOpen — команда открывает новый график. Имеет два параметра: символ, который нужно открыть и период графика. К примеру, если вам нужно продублировать текущий график, то вместо символа пишется слово NULL, это предопределенная константа, которая в данном случае обозначает текущий символ. Для того, чтобы указать текущий период, во втором параметре можно прописать PERIOD_CURRENT, либо просто поставится ноль, что по сути будет одно и тоже. Продублируем текущий график:
Теперь попробуем открыть график пары AUDUSD на периоде D1. Пару укажем вручную, но тут нужно помнить, что если у вашего брокера есть суффикс или префикс, их обязательно нужно прописывать в названии символа, либо такой график не откроется.
  • ChartClose — функция закрывает график по указанному ID номеру. На примере выше мы открыли график, давайте его закроем с паузой в 3 секунды, раз мы знаем его идентификационный номер
  • Symbol — возвращает имя символа, которые присвоено текущему графику в виде текстового значения.
  • Period — возвращает период текущего графика в числовом типе формата int.
С символом все понятно. Период моего графика был М15, возвращаемое значение равно 15. Т.е. возвращаемое число равняется минутам этого периода. Если вы используете таймфрейм Н1, то число будет равно 60, если Н4 — то 240 и т.д.

  • ChartSymbol — возвращает наименование символа указанного по ID графика.
  • ChartPeriod — возвращает период указанного по ID графика. Попробуем открыть какой-либо график и программно узнать его период и символ.
Далее мы научимся через перебор всех графиков узнавать их характеристики.

  • ChartSetSymbolPeriod — функцию изменяет значение символа и периода указанного графика по идентификатору, имеет три параметра: ID изменяемого графика, новый символ, который нужно задать и новый период.

Откроем график EURUSD H4 и изменим его на NZDUSD M5:

А если нам нужно оставить текущий период, но поменять только символ? Тогда обратимся к функции ChartPeriod, чтобы узнать и задать функции замены старое значение периода:

  • ChartNavigate — функция производит сдвиг указанного графика на определенное количество баров относительно заданной позиции. Имеет три параметра: идентификатор графика, тип позиции сдвига (начало графика, текущая позиция, либо конец графика) и значение сдвига, рассчитанное в барах.

Попробуем сдвинуть график с конца на 50 баров назад, предварительно отключив функцию автоскролла и автосдвига текущего графика.

  • ChartRedraw — вызов принудительной перерисовки заданного графика. Функцию стоит применять, когда с графиком произошли какие-то действия — обновились графические объекты, индикатор изменил свои линии, подгрузилась история котировок и т.д.
  • ChartFirst, ChartNext — две функции, которые используются при работе с перебором графиков. ChartFirst возвращает ID самого первого графика, открытого в терминале, ChartNext указывает номер графика, следующего за предыдущем.

Давайте поставим себе задачу пробежаться по всем открытым графикам в терминале и вывести в принт их символ и период. Для этого вначале откроем 4-5 разных графиков и напишем алгоритм с помощью цикла while.

Цикл while мы изучали в этом уроке, если вы с ним еще не знакомы, пожалуйста, вернитесь на первые уроки, все обучение идет последовательно. Мы определили период прохода цикла с 0 до 200 графиков (больше графиков у нас просто не может быть открыто). Перед циклом мы ввели переменную, которой назначили номер самого первого открытого графика. Далее тело цикла выдает нам принт с интересующими данными и после меняет значение переменной currChart на номер следующего по списку графика. Если этот номер становится меньше нуля, значит такого графика не существует и цикл прекращает свою работу. Если существует, мы увеличиваем счетчик на единицу и продолжаем поиск.

У меня было открыто 5 графиков и в журнал перешли следующие сообщения:

  • ChartSaveTemplate — функция автоматизирует сохранение текущего шаблона графика с целью дальнейшего использования его пользователем. Это можно и сделать вручную, но вдруг ваш советник должен иметь именно синий фон графика и вы хотите применить этот шаблон к другим графикам. Проверим, как это работает. Измените текущий график как вам нравится, задайте свой ТФ, цвет фона, уберите сетку и т.д. Далее воспользуется этим кодом:
Мы сохранили текущий график под названием «My Chart» в папку templates по умолчанию, найти ее можно по похожему пути: C:\Users\Admin\AppData\Roaming\MetaQuotes\Terminal\<номер терминала>\templates

  • ChartApplyTemplate — функция для загрузки имеющегося шаблона из папки терминала.

Откроем новый график, к которому не быть применен данный шаблон и в новом скрипте напишем следующий код:

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

  • ChartScreenShot — сохраняет скриншот указанного графика. Может быть в трех форматах: .png, .bmp или .gif. Функция имеет пять параметров: ID номер графика, имя сохраняемого файла, ширина, высота в пикселях и тип выравнивания графика: по левой, правой границе или по центру.
Найти сохраненный скриншот можно по этому пути:
C:\Users\Admin\AppData\Roaming\MetaQuotes\Terminal\<номер терминала>\MQL4\Files

Если имя скриншота совпадает с уже существующим изображением, то оно просто будет заменено. Чтобы такого не происходило, лучше к имени добавлять текущее время терминала TimeCurrent(). Также рекомендую вам попробовать наш профессиональный индикатор Truly ScreenShot для качественного сохранения снимков экрана.

  • WindowBarsPerChart — функция возвращает количество свечей, которые помещаются в текущей окне терминала. Настроек у функции нет, результат имеет формат int. При изменении масштаба графика количество баров будет изменяться. Ее можно применять, когда нужно пробежаться только по видимым свечам.
  • WindowFirstVisibleBar — Возвращает номер первого видимого бара на графике. Отсчет идет справа налево.
  • WindowPriceMax, WindowPriceMin — максимальная и минимальная видимая цена на текущем графике в данный момент. Функции нужны, чтобы было удобнее работать с графическими объектами, чтобы найти центр текущего графика и т.д.
  • WindowExpertName — функция возвращает имя текущего скрипта, индикатора или советника, которое пользователь задал файлу. Под этим именем можно сохранять все графические объекты, чтобы потом разом их удалить. Также по имени индикатора или эксперта его можно снять с графика.
Свойств у графиков огромное множество, большая часть из них задается функциями ChartSetInteger() и ChartSetDouble(), думаю вы без труда сможете разобраться в них с помощью справки в редакторе (F1).  Просто нужно знать, что с помощью них можно поменять полностью внешний вид графика — цвет фона, свечей, линий Ask, Bid, отображение сетки, посчитать количество видимых баров на экране, померить ширину графика в пикселях или в барах и так далее.

Получение рыночной информации

Окно «Обзора рынка» (MarketWatch) можно открыть в меню Вид или с помощью клавиш Ctrl+M. В нем учитываются все символы, которые пользователь отобразил в настройках. Рассмотрим функции, которые помогают работать с ними:

  • SymbolsTotal — возвращает доступное количество символов в окне обзора рынка. Имеет один параметр selected. Если он равен true, тогда возвращается количество символов, отображенных в окне обзора. Если false — то вообще все доступные символы у данного брокера.
  • SymbolName — возвращает имя выбранного символа по номеру позиции из окна рынка. Чтобы узнать наименование всех символов в окне рынка, можно сделать цикл for по всем инструментам:
  • SymbolSelect — отобразить, либо убрать существующий символ из окна обзора рынка. Функция имеет два параметра: имя нужного символа и переключатель: включить/выключить, которые равны true/false

Попробуем добавить символ, которого нет в окне обзора, но он точно есть у данного брокера. Чтобы посмотреть все возможные символы, нужно щелкнуть правой кнопкой в окне и выбрать «Символы». В моем случае не отображена валютная пара USDSDG, давайте ее включим, чтобы в будущем наш программный код смог сделать по ней анализ. Если символа нет в окне обзора, то его котировки не доступны программно.

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

  •  MarketInfo — функция содержит в себе большое количество информации о финансовых инструментах в окне обзора рынка. Первый ее параметр это нужный нам символ, второй — идентификаторы запроса. Вот часть из них:
    • MODE_BID — последнее известное значение цены Bid на рынке.
    • MODE_ASK — последнее известное значение цены Ask на рынке.
    • MODE_POINT — размер пункта в валюте выбранной котировки.
    • MODE_DIGITS — количество знаков после запятой у выбранного инструмента
    • MODE_SPREAD — значение текущего спреда в новых пунктах
    • MODE_SWAPLONG — размер свопа для покупок по текущему инструменту
    • MODE_SWAPSHORT — размер свопа для продаж по текущему инструменту

Попробуем выдать все эти значения за раз в журнал:

В МТ4 часть из этих функций можно заметить предопределенными переменными. Вместо MarketInfo(Symbol(),MODE_BID) можно написать просто Bid, MarketInfo(Symbol(),MODE_ASK) — просто Ask. Вместо DoubleToString(MarketInfo(Symbol(),MODE_POINT) написать Point, а вместо DoubleToString(MarketInfo(Symbol(),MODE_DIGITS) слово Digits.

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


На этом мы заканчиваем раздел обучения теорией и будем переходить к практике. В следующих уроках нас ждут простые скрипты, индикаторы и советники. Сложность кода постараюсь повышать постепенно, буду использовать весь пройденный материал для закрепления.

Всем профитов!

0. Начало работы

Скачать примеры

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Заполните поле
Заполните поле
Пожалуйста, введите корректный адрес email.
Вы должны согласиться с условиями для продолжения

Меню