В предыдущих постах мы познакомились с основами языка программирования MQL. Узнали о переменных, операторах и сложных конструкциях языка. Теперь мы уже готовы к тому, чтобы начать пробовать свои силы на реальном рынке Forex.
Но, сразу приступать к написанию советника мы не будем, т.к. мы не познакомились с объектно-ориентированной моделью программирования. Отложим эту тему чуть наперед, а сейчас, чтобы немного подогреть ваш интерес к теме, приступим к работе с графиками. Базовых понятий из предыдущих разделом нам для этого будет на данном этапе достаточно. Итак, приступим же!
Предопределенные переменные терминала
Первое, что мы видим, открыв торговый терминал, это, конечно же — график цены! Справа от графика мы видим цены за единицу базового актива, снизу — дату и время. Но как же эти параметры графика можно узнать в нашей программе? Разработчики терминала позаботились об этой, пожалуй, самой востребованной информации, и на глобальном уровне объявили несколько переменных, в которых хранится вся интересующая нас информация.
Текущие цены Ask и Bid
Как всем вам, скорее всего известно, в торговом терминале MetaTrader представлено для нас две цены — цена покупателей (которые покупают у нас базовый актив, когда мы открываем короткие позиции) и цена продавцов (которые продают нам базовый актив, когда мы открываем длинные позиции). Другими словами, цена Ask всегда находится выше цены Bid на графике. Покупаем мы всегда по более высокой цене, продаем всегда по более низкой цене (зайдите ради интереса в любой обменный пункт валюты и там вы также увидите эти цены — цена покупки (банком) всегда выше цены продажи (банком) — это и есть наши цены Ask и Bid). Разница между этими ценами именуются как Bid-Ask спред.
Так получение текущих цен актива самая востребованная информация на рынке, то было бы логично сделать быстрый и удобный доступ к этой информации из программ, написанных на языке MQL. Что, собственно, разработчиками и было сделано. Эти цены объявлены в виде глобальных переменных типа double (число с плавающей точкой двойной точности) и нам не нужно их объявлять в своей программе, достаточно получить значение цены, просто обратившись к этим переменным.
В качестве простого примера, давайте напишем программу, которая будет получать на каждом тике значение текущих цен Ask и Bid и вычислять величину текущего спреда.
В первой строке программы мы объявили переменную spread типа double, в которой будет храниться актуальное значение величины спреда, и инициализировали ее разницей между ценами.
Важно! Ввиду того, что цена Ask всегда выше цены Bid, то следует вычитать цену Bid из цены Ask. В противном случае мы получим отрицательное значение величины спреда.
Как видно из примера, получить текущие цены достаточно просто. Но кроме текущих цен, нам также важно знать и наименование текущего актива (символ) — валютной пары, сырья, акции или индекса.
Получение текущего символа
Для этого предусмотрена стандартная функция Symbol(), которая возвращает строку с названием текущего актива в том виде, как она указана в окне обзора рынка и на графике цены.
Также она продублирована в глобальной переменной _Symbol.
Значения переменных symb и _symb в данном примере будут идентичны и, например, если мы установим данного советника на валютную пару Евро-Доллар, то они будут иметь значение EURUSD.
Давайте скомпилируем и установим советника на график, чтобы посмотреть, как он работает.
Для компиляции советника необходимо нажать на соответствующую кнопку на панели инструментов.
Но, пока что наш советник будет только рассчитывать значения и хранить их "в уме" — в оперативной памяти компьютера, и ничего никуда не введет. Давайте сначала научим нашего советника отображать данные.
Вывод информации в окне терминала
Существует три стандартных способа вывода информации на график. Каждый из этих способов реализован в виде отдельной функции, которая может принимать один или более формальных параметров, значения которые и отображаются.
Стандартная функция Comment()
Данная функция выводит информацию (значение своих формальных параметров) непосредственно на график цены в левом верхнем углу графика, где указан символ текущего актива.
Давайте выведем информацию из предыдущего примера с помощью этой функции. Для этого добавим вызов функции в наш код, откомпилируем нашего советника и установим на любой график цены.
В качестве формальных параметров мы передали функции Comment() значения всех переменных, значения которых были получены ранее.
Стандартная функция Alert()
Для того, чтобы привлечь внимание трейдера к какому-либо событию или сложившейся рыночной ситуации, используется стандартная функция Alert(), которая также как функция Comment() принимает один или более формальных параметров. Давайте изменим код программ таким образом, чтобы значения переменных выводились при помощи этой функции:
В итоге на графике будет выведено следующее сообщение:
При выводе сообщений данной функцией также будет привлечено внимание трейдера звуковым сигналом (при условии, что звук уведомлений включен в настройках торгового терминала).
Стандартная функция Print()
Существует третий способ вывода сообщений — стандартная функция Print():
Давайте скомпилируем данный код и установим советника на любой актив.
Но, позвольте... на графике нет никакой информации... Может быть данная функция не работает?
На самом деле, так и должно быть! Дело в том, что стандартная функция Print() используется исключительно в отладочных целях и предназначена исключительно для разработчиков программ на языке программирования MQL. И всю информацию она выводит не на график, а в специальное окно терминала. Для того, чтобы увидеть результат работы данной функции необходимо переключиться на вкладку Эксперты, которая предназначена специально для того, чтобы советники могли выводить в него какую-либо информацию.
Как вы, скорее всего, заметили, значение переменной spred, которая является разницей между ценой Ask и Bid выводится в неудобном виде, в виде длинной дроби.
Это является той самой погрешностью при работе с числами с десятичной точкой, о которой мы говорили, когда знакомились со стандартными операциями. Если нам требуется вывести информацию в удобном для восприятия человеком виде, то нам требуется нормализовать значение данной переменной.
Нормализация чисел с плавающей точкой
Под нормализацией понимается такое преобразование числа с плавающей точкой, чтобы оно соответствовало требуемой точности. Точность числа выражена в виде количества цифр после десятичной точки.
Но как нам узнать, до какой точности требуется нормализовать число? Ведь, как мы знаем, различные брокеры предоставляют котировки с различным количеством цифр после десятичной точки. Да и некоторые активы (например, йено-зависимые, золото и пр.) также имеют отличное число цифр после десятичной точки.
Для этого нам снова потребуется обратиться к предопределенной стандартной переменной.
Заданная точность чисел с плавающей точкой
Для того, чтобы получить число цифр после десятичной точки для текущего актива, достаточно получить значение переменной Digit.
Давайте проведем нормализацию переменной spred, и посмотрим, что будет выведено на экране.
Сама нормализация числа производится с помощью стандартной функции NormalizeDouble() в качестве формальных параметров которой передается само число, которое нам требуется нормализовать (привести в соответствие к определенной точности) и количество цифр после десятичной точки, которое нам необходимо получить в итоге.
Давайте скомпилируем и установим советника на графики различных активов, чтобы проверить, что все работает корректно.
Как видно из результата работы функции Comment(), нормализация чисел с плавающей точкой позволяет привести число в форме, удобной для восприятия человеком.
Заключение
В данной статье мы познакомились с некоторыми стандартными предопределенными переменными, научились выводить информацию тремя различными способами, а также приводить числа с плавающей точкой к требуемой точности.