Программирование на MQL 4: Торговые системы. Часть 2.

FXWizard

Гуру форума
Программирование на MQL 4: Торговые системы. Часть 2.

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




До тех пор, пока у нас ещё не написана собственная МТС, мы будем обращаться к примеру, поставляемому с MetaEditor 4 - советнику MACD.

Заглянув в код советника MACD, мы увидим уже, наверное, ставшие привычными функции "init", "deinit" и "start".

Функция "init" служит для инициализации начальных данных работы советника, в ней же выполняется проверка корректности этих данных. Например, если наш советник в качестве take-profit будет ориентироваться на какое-то конкретное число, и это число передаётся советнику через параметр, то на этом этапе можно проверить, чтобы оно не было слишком маленьким.

Функция "deinit" нужна для удаления последствий работы советника. Например, если мы не хотим, чтобы после работы советника в окне котировок оставались какие-то символы, то функция "deinit" - как раз то место, где можно очистить окно котировок функцией ObjectDeleteAll().

В предыдущей статье мы уже говорили о том, что основной этап работы советника выполняется функцией "start". Именно она вызывается MetaTrader’ом каждый раз, когда происходит изменение котировки торгуемого инструмента, и именно она ответственна за проведение анализа рыночной ситуации и заключение сделок, опираясь на сигналы индикаторов, входящих в описываемую ТС.

Функция советника "start", как правило, состоит из нескольких блоков в той или иной степени присутствующих во всех советниках реализующих МТС. Далее приведена блок-схема, которая иллюстрирует работу советника. Все этапы, приведённые на ней, за исключением двух начальных блоков, обычно выполняются в функции "start".
 

Вложения

  • mql_v30_2.jpg
    mql_v30_2.jpg
    4,5 КБ · Просмотры: 91

FXWizard

Гуру форума
1. Первый блок ("получение начальных данных"), изображенный на блок-схеме, выполняется функцией "init".

2. Второй ("проверка изменения котировки") выполняется внутренними алгоритмами MetaTrader’а. После того, как произошло изменение котировки, вызывается выполнение функции "start". Кстати, из этого следует, что советник реагирует на каждый тик изменения цены.

Далее, следуя типичному сценарию действия советника, в функции "start" происходит следующее:

3. Из-за того, что сервер, принимающий запросы на размещение ордеров, имеет ограничение не принимать на один счёт сделки чаще, чем один раз в десять секунд, следует проверить, истёк ли этот защитный интервал после выполнения последней операции по какому-либо ордеру на активном счёте. Если это условие не проверить, то при попытке совершить какую-нибудь операцию на активном счету до истечения десяти секунд, сервером будет возвращена ошибка. В случае истечения защитного интервала, мы продолжаем выполнение советника, в обратном случае возвращаем управление MetaTrader’у.

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

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

6. Затем, на основании полученных значений индикаторов, проверяется, есть ли условия для открытия позиции. Если
сигнал на заключение сделки не получен, то переходим к той части советника, которая отвечает за контроль открытых
позиций; иначе - продолжаем попытку заключить сделку.

7. Основываясь на правилах money-management’а или каких-либо других личных предпочтений, рассчитываем
размер лота, stop-loss и take-profit.

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

9. Выставив ордер, необходимо завершить выполнение функции "start" и передать управление MetaTrader’у.

10. Есть ещё один этап выполнения советника - это "контроль открытых позиций", который может быть выполнен в случае "неудачи" на этапах 2, 4 или 6. На этом этапе происходят изменения ордеров, такие как, например, изменение stop-loss’ов или закрытие позиций, исходя из каких-либо соображений. Иногда ордера выставляются без указания stoploss или take-profit, и, если имеются такие ордера, то это как раз тот этап, когда следует программно проконтролировать, не пора ли какие-либо из них закрывать.

Вернёмся к примеру советника MACD, который поставляется в составе с MetaEditor 4. Будем объяснять выполняемые им действия с указанием номеров строк:

Получение начальных данных и их проверка выполняется, как мы уже отмечали, в функции "init" (строки 19-32).

Проверка 10-ти секундного лимита отсутствует.

После получения значений индикаторов MACD и MA (строки 53-58), следует проверка максимального допустимого количества открытых ордеров (строки 60-62). В данном случае, если открытого ордера ещё ни одного нет, то проверяем необходимость его выставить (строки 63-80); иначе (если один или больше ордеров уже открыты) - переходим к контролю открытых позиций (строки 82-109).

Пример советника MACD носит чисто иллюстративный характер, вследствие чего он слишком прост, поэтому количество открываемых и закрываемых лотов, уровни stop-loss и take-profit не вычисляются по какой-либо money-management схеме. Здесь они просто задаются в параметрах советника, которые затем используются при открытии (строки 69 и 77) и закрытии ордеров (строки 94 и 103).

Следует обратить внимание на то, что после каждой операции с ордерами, советник прекращает своё выполнение и возвращает управление MetaTrader’у с помощью оператора "return". Иначе может получиться, что, не дожидаясь истечения 10-ти секундного интервала между операциями с ордерами, будет произведена попытка выполнить ещё одну сделку, которая должна будет быть отвергнута сервером.

Предложенная в этой статье блок-схема советника является общей для всех МТС. Это означает, что, как и в случае с рассмотренным простым советником MACD, какие-либо блоки могут быть пропущены или реализованы неявно в составе других блоков. Ясно одно, что, имея наглядное представление об общей структуре, гораздо легче написать своего собственного советника, каким бы уникальным и сложным он не был.

Александр Иванов
для Forex Magazine
 
Верх