Ограничения и разрешения для операций по счету
Среди свойств счета имеется несколько, представляющих собой ограничения на торговые операции, включая и полный их запрет. Все эти свойства относятся к перечислению ENUM_ACCOUNT_INFO_INTEGER и являются логическими флагами, за исключением ACCOUNT_LIMIT_ORDERS.
Идентификатор |
Описание |
---|---|
ACCOUNT_TRADE_ALLOWED |
Разрешение торговли на текущем счете |
ACCOUNT_TRADE_EXPERT |
Разрешение алгоритмической торговли экспертами и скриптами |
ACCOUNT_LIMIT_ORDERS |
Максимально допустимое количество действующих отложенных ордеров |
ACCOUNT_FIFO_CLOSE |
Признак того, что позиции нужно закрывать только по правилу FIFO |
Поскольку наша книга посвящена программированию на MQL5, что включает и алготрейдинг, следует отметить, что запрет ACCOUNT_TRADE_EXPERT является столь же критическим, как и общий запрет на торговлю, когда ACCOUNT_TRADE_ALLOWED равно false. Брокер имеет возможность запретить торговлю через эксперты и скрипты, но при этом оставить торговлю вручную.
Свойство ACCOUNT_TRADE_ALLOWED, как правило, равно false, если подключение к счету выполнено по инвестиционному паролю.
Если значение свойства ACCOUNT_FIFO_CLOSE равно true, позиции по каждому символу разрешается закрывать только в том порядке, в котором они были открыты — сначала самую старую, затем более новую и т.д вплоть до последней. При попытке закрыть позиции в ином порядке будет получена ошибка. Для счетов без хеджингового учета позиций, то есть если свойство ACCOUNT_MARGIN_MODE не равно ACCOUNT_MARGIN_MODE_RETAIL_HEDGING, свойство ACCOUNT_FIFO_CLOSE всегда равно false.
В разделах Разрешения и Расписания торговых и котировочных сессий мы уже начали разрабатывать класс для выявления доступных MQL-программе торговых операций. Сейчас мы можем его дополнить проверками разрешений счета и привести к окончательной версии (Permissions.mqh).
Напомним, что уровни ограничений сведены в перечисление TRADE_RESTRICTIONS, которое после добавления двух новых элементов, связанных со свойствами счета, принимает такой вид.
class Permissions
|
В ходе проверки MQL-программа может обнаружить несколько запретов по разным причинам, в связи с чем элементы кодируются отдельными битами, и окончательный результат может являться их суперпозицией.
Последние два ограничения как раз соответствуют новым свойствам и взводятся в методе getTradeRestrictionsOnAccount. Общая битовая маска обнаруженных ограничений (если они есть) формируется в переменной lastRestrictionBitMask.
private:
|
Если вызывающий код не интересуется причиной блокировки, а требуется лишь определить возможность выполнения торговых операций, удобно пользоваться методом isTradeOnAccountEnabled, возвращающим логический признак (true/false).
По аналогичному принципу реорганизованы проверки свойств символа и терминала. Например, метод getTradeRestrictionsOnSymbol содержит исходный код, уже знакомый по предыдущей версии класса (с проверкой времени торговых сессий и режима торговли по символу), но возвращает маску флагов — если хоть один бит взведен, он описывает источник ограничения.
static uint getTradeRestrictionsOnSymbol(const string symbol, datetime now = 0,
|
Наконец, общая проверка по всем потенциальным "инстанциям", включая (помимо предыдущих уровней) настройки терминала и программы, осуществляется в методах getTradeRestrictions и isTradeEnabled.
static uint getTradeRestrictions(const string symbol = NULL, const datetime now = 0,
|
Комплексную проверку разрешений торговли с новым классом демонстрирует скрипт AccountPermissions.mq5.
#include <MQL5Book/Permissions.mqh>
|
В случае обнаружения ограничений их битовую маску можно вывести в понятном строковом представлении с помощью метода explainLastRestrictionBitMask.
Вот несколько результатов запуска скрипта. В первых двух случаях в глобальных настройках терминала была запрещена торговля (свойства TERMINAL_TRADE_ALLOWED, и как следствие MQL_TRADE_ALLOWED равнялись false, что соответствует битам TERMINAL_RESTRICTION и PROGRAM_RESTRICTION).
На символе "USDRUB" в часы, когда рынок закрыт, получим дополнительно SESSION_RESTRICTION:
Trade is disabled for USDRUB following reasons:
|
Для символа "SP500m", для которого торговля запрещена в принципе, появляется флаг SYMBOL_RESTRICTION.
Trade is disabled for SP500m following reasons:
|
Наконец, разрешив торговлю в терминале, но зайдя на счет с инвесторским паролем, увидим запрет ACCOUNT_RESTRICTION на любом символе.
Run on XAUUSD
|
Заблаговременная проверка разрешений в MQL-программе позволит избежать серийных неудачных попыток отправки торговых приказов.