Советник FOREX: от идеи до результата — Страница 7 — Тирметод

Пользовательские функции

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

Список функций, обрабатывающие ордера

  • функция возврата наличия рыночных ордеров
  • функция возврата профита по ордеру
  • функция возврата даты/времени закрытия ордера
  • функция возврата размера лота по ордеру
  • функция возврата типа ордера

Функция наличия ордеров

Эта функция необходима нам для того, чтобы отслеживать количество или наличие открытых ордеров по рынку. То есть эксперту надо дать знать, входить ли вообще в рынок?

По торговой стратегии в «работе» требуется только одна сделка. Поэтому при написании этой функции мы можем сделать вариации на тему:

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

Итак, традиционно начнём код с заголовка  функции, см. строку 81 ниже.

Заголовок функции, см. строку 81 выше, состоит из:

  • int – тип возвращаемого значения;
  • CountOrders – имя функции;
  • () – список параметров, по умолчанию аргументы отсутствуют.

Составной оператор {}, см. строки 82 и 88, является телом функции, содержит инструкции, или операторы-выражения, заканчивающиеся точкой с запятой (;), с «предписаниями», а именно:

Вас иногда посещает состояние «Где-то это было?..» Называется: «Déjà vu». Нет? Ну, поехали дальше…

Эта функция, в том виде, как сейчас, см. выше строки 81-88, при каждом вызове будет сообщать «zero», то есть возвращать значение count_orders, равное 0.

На наше счастье, узнать сколько всего ордеров в «работе» на торговом счёте, есть специальная функция MQL4OrdersTotal(), значение которой присваиваем целому типу (int) переменной i_total, см. добавленную строку 84 ниже, а затем присвоим переменной count_orders, см. строку 86 ниже.

Вопрос: «А можно было сразу?… Типа так: int count_orders=OrdersTotal();»

Ответ: «Можно. Даже ву… больше скажу, что всё это нагромождение не имеет смысла… пока!»

Дело в том, что нам нужно рассчитать количество рабочих ордеров, с которыми работает именно эксперт. Функция OrdersTotal()  возвращает же количество всех открытых (и отложенных) ордеров на счёте. То есть нам нужно сделать выборку из всех ордеров. Как это сделать? С помощью оператора for, конечно, и специальной функции MQL4 – OrderSelect().

Новая функция OrderSelect(), см. строку 88 выше, имеет следующие аргументы:

  • iиндекс ордера;
  • SELECT_BY_POS – способа выбора – в параметре i передаётся порядковый номер ордера в списке;
  • MODE_TRADES – источник данных для выбора – ордер выбирается среди открытых и отложенных ордеров.

Данная инструкция, см. строку 88 выше, читается так: «Если НЕ выбран ордер с порядковым номером из списка открытых переломов (ордеров), а не закрытых, то (см. строку 89) завершить цикл». То есть мы сделали упор на то, чтобы выбирать среди рабочих ордеров.

Теперь укажем условие, при котором выбор ляжет среди ордеров, с которыми работает эксперт.

Новые функции, см. строку 90 выше:

  • Symbol() – возвращает имя символа текущего графика;
  • OrderSymbol() – возвращает наименование финансового инструмента текущего выбранного ордера;
  • OrderMagicNumber() – возвращает идентификационное («магическое») число выбранного ордера.

Упрощённо выражения в строке 90 читаются так: «Если эксперт не установлен на графике с финансовым инструментом, с которым собирается работать, или ордер не содержит магический номер, который присваивает эксперт всем своим ордерам, то…»

Новый оператор продолжения continue, см. строку 91 выше, передает управление в начало ближайшего внешнего оператора цикла for, вызывая начало следующей итерации. Этот оператор по действию противоположен оператору завершения break. То есть мы не выходим из цикла, но продолжаем выборку ордеров, если

Заключительным этапом преобразования кода функции CountOrders() является подсчёт экспертных ордеров.

Строка 92, см. выше, практически повторяет выражение строки 90, но с некоторой особенностью.

В то время как в строке 90 проверяется условие для ордера на несоответствие рабочего графика и рабочего финансового инструмента, при этом проверка на несоответствие магическому номеру может не понадобится благодаря логической операции (ИЛИ), в строке 92 требуется соответствие обоим условиям в согласии с логической операции (И). Далее в строке 93 происходит арифметическая операция подсчёта ордеров при истинности раннего предъявленного условия (см. сроку 92).

Вопрос: «Что нам это даёт?»

Ответ: «Хороший вопрос. В дальнейшем это позволит нам использовать эксперт на различных графиках с индивидуальными настройками входных параметров».

А теперь сделаем ещё один «трюк»: по торговой стратегии нам не надо подсчитывать ордера, достаточно найти единственный ордер, соответствующий критериям выбора.

А теперь время для викторины «Найди 10 отличий».

{Продолжение следует}