Наши рекомендации:

  1. Главная
  2. Уроки MQL4
  3. 2.1 Пишем информационный индикатор по данным терминала

2.1 Пишем информационный индикатор по данным терминала

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

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

Для начала создадим в редакторе Meta Editor новый индикатор через сочетание клавиш Ctrl+N. Свойства индикатора трогать не будем, все остается по умолчанию. Дополнительных обработчиков событий добавлять не нужно, галочку «в отдельном окне» тоже не надо ставить. Сразу же введем внешнюю переменную типа double Max_Spread, а также на глобальном уровне переменную PipsDivided, равную единице, которая будет переводить значение спреда из новых пунктов в старые.

Тут хочется сделать небольшое отступление: примерно в 2010-х годах поставщики ликвидности и брокеры смогли предложить трейдерам новые счета, где у валютных пар появился пятый знак после запятой. С тех пор ходит постоянное недопонимание на форумах и блогах о том, как же правильно считать и прописывать эти пункты. Старички, включая меня и многие уважающие себя брокеры остановились на старом определении данных в 4х знаках, тогда как новички все считают уже в пятизнаке. Соответственно, когда старая гвардия говорит, что «цена прошла 20 пунктов», это значит, что цена прошла 20 старых пунктов, либо же 200 новых. То же самое и со спредом — если сказать, что спред составляет 2.5 пункта, что значит что он равняется 25 новым пунктам. Того же мнения я придерживаюсь в кодинге — пишу все параметры, связанные с пунктами в четырехзнаке, но добавляю проверку, где умножаю это значение на десять, если счет отображает цену в новых пунктах. Поэтому сейчас и в будущем, чтобы не возникло недопонимания, я буду указывать значения, связанные с пунктами только в 4х знаке, т.е. в старых пунктах.

Продолжим. Внешние параметры вводятся в самом вверху кода сразу после свойств программы. Создали переменную и в функции обработки событий OnInit умножаем ее значение на 10, если счет в новых пунктах. Количество знаков после запятой определяется через предопределенную переменную Digits. Соответственно, если у пары пять знаков после запятой, либо три (для пар с JPY), то счет в новых пунктах.

Далее в функции OnCalculate повторим уже знакомый нам код из прошлого урока для расчета спреда:

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

Это первая строка, которая будет гласить название информационного списка. Чтобы сделать переход на новую строчку, необходимо добавить косую черту с буквой «\n «. С новой строки выведем название текущего символа, пусть он дублирует имя графика. Добавляем строчку в переменную comm:

Соответственно, если поставить два раза знак переноса перед словом «Символ», то отступ будет на две строчки, что сейчас и нужно. После того, как строки прописаны, нужно поставить точку с запятой (;) в конце выражения. Теперь попробуйте вывести полученную информацию в коммент, написав ниже:

Если все отображается, значит код написан корректно, закомментируем сейчас функцию Comment и продолжаем добавлять информацию в переменную comm. Проверим, разрешена ли вообще торговля по текущему инструменту:

Функция MarketInfo выдала нам информацию по рынку. Ее первым параметром мы указываем текущий символ. Второй, как раз отвечает за проверку разрешения на торговлю. В итоге данная функция возвращает true или false. Чтобы не плодить много строк, мы сразу же с помощью условного оператора ? сделали проверку и присвоили результатам текст «Да» и «Нет». В другом виде такая проверка выглядела бы так:

Так как краткость — сестра таланта, то мы не будет одну строку превращать в четыре. Этот пример не нужно добавлять в код.

Мы знаем, что у брокера бывают задержки при обновлении тиков, поэтому нужно знать время последнего тика вплоть до секунд:

Данный код выглядит немного сумбурно из-за того, что MarketInfo возвращает значение типа double, время у нас должно быть в виде datetime, а комментарий в виде string. Поэтому тут присутствует двойное преобразование: вначале double в datetime, потом datetime в string.

В итоге на текущий момент содержание переменной comm должно выглядеть так:

Продолжаем добавлять нужную для анализа информацию. Теперь не помешало бы отобразить данные по текущей цене. Так как указывать только цену Bid не совсем корректно, ведь покупки открываются по цене Ask, то укажем их обе:

Цена имеет тип данные double, поэтому с помощью функции DoubleToString мы ее переводим в текстовое значение, округляя значение до количества знаков после запятой данного символа Digits.

Раз есть цена, то нужно также не забыть и про спред, для которого в самом начале нами были введены переменные spr и condition:

Переходим на следующую строчку. Давайте рассчитаем самую низкую цену Low на графика, а также самую высокую High за текущий день:

В наше время большинство брокеров отказалось от Стоп Левела и по умолчанию он равен нулю. Но, чтобы знать наверняка, введем проверку и на его значение:

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

Теперь давайте укажем размер пункта в валюте котировки, количество знаков после запятой и размер тика:

Не помешало бы еще знать значение свопа для покупок и продаж по текущему инстументу:

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

Чтобы немного усложнить задачу, мы введем два внешних параметра типа bool, с помощью которых пользователь будет вручную включать/выключать два будущих блока: «размер лота» и «количество ордеров».

Воспользуется условным оператором if для того, чтобы определить указанное значение переменной ShowLotInfo. И если значение true, то добавляем к уже созданной текстовой переменной comm дополнительный текст с помощью знака +=, который мы проходили в этом уроке.

Как мы уже знаем, для проверки bool переменной не обязательно использовать операцию отношения и слова true/false. При false нужно просто перед переменной ShowLotInfo поставить знак (!).

Добавляем текст с расчетом значений максимального, минимального лота на данном торговом счете, а также минимальный шаг между его значениями:

Соответственно, в положении true ShowLotInfo будет активен и расчет блока будет учитываться, а при false — нет. Так как в теле условного оператора только одна переменная comm, то фигурные скобки тут ставить не обязательно.

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

Функция OrdersTotal() выдает общее количество открытых и отложенных ордеров в терминале по всем символам. OrdersHistoryTotal() в свою очередь содержит в себе количество закрытых рыночных и удаленных отложенных ордеров, а также информацию по операциям с балансом: пополнение, вывод, начисление бонусов и т.д. Как фильтровать ордера из этой кучи и находить только нужные нам мы изучим в будущих уроках.

Количество ордеров всегда хранится в переменной целого типа и чтобы его перевести в текст, нужно воспользоваться функцией IntegerToString. Естественно, если вы этого не сделаете, то код все равно будет скомпилирован, но редактор выдаст вам предупреждение о некритических ошибках. Я же рекомендую всегда их исправлять, чтобы текст в окне Инструменты был: 0 errors, 0 warnings.

Все, думаю, что информации для отображения достаточно. Прописываем в конце функции OnCalculate Comment(comm). Осталось добавить функцию обработки событий OnDeinit, в которой единственной строчкой мы очистим всю информацию с экрана после того, как индикатор будет удален с графика.

В итоге должен получиться вот такой код:

На графике это выглядит так:

Чуть больше информации я указал в скрипте нашей команды Terminal info script. Там данные отображаются в отдельном окне MessageBox для большего удобства. Думаю теперь вам не составит труда повторить его код самим. Недостающие идентификаторы запроса можно узнать из справки, установив курсор на тексте MarketInfo и нажав F1.

На сегодня все, надеюсь этот урок был для вас полезен.

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

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

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

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

Меню