Turnstile Order Gateway
- Библиотеки
-
Syarief Azman Bin Rosli
Здравствуйте и добро пожаловать в мой официальный профиль MQL5!
Меня зовут Шариф Азман Бин Росли (Syarief Azman Bin Rosli). Я разработчик алгоритмических торговых систем и количественный инженер с более чем десятилетним опытом создания надежных решений для MetaTrader 5 и MetaTrader 4. - Версия: 1.0
- Активации: 5
Библиотека MQL5 между вашим советником и OrderSend. Каждый запрос до отправки проходит 9 проверок (соединение, Algo Trading, режим символа, сессия, флаги типов ордеров, объём, стопы, маржа, OrderCheck). Закрытия и изменения, заблокированные уровнем заморозки, закрытой сессией или потерей связи, ставятся в очередь и отправляются позже. Сама библиотека никогда не торгует. Вы получаете скомпилированный Turnstile_Order_Gateway.ex5; эта страница - полный справочник API.
Быстрый старт
- Скопируйте Turnstile_Order_Gateway.ex5 в MQL5/Libraries (Файл > Открыть каталог данных).
- Вставьте блок #import ниже в ваш советник или скрипт.
- Необязательно: TOG_Configure в OnInit (по умолчанию 20, 3, 300, true, false).
- Вызывайте TOG_ProcessQueue в OnTick или OnTimer.
- Торгуйте через TOG_Open, TOG_Modify, TOG_Close. При 0 или false выведите TOG_ReasonText(TOG_LastReason()).
- Проверка: запустите пример ниже в тестере стратегий; журнал покажет тикет и причину. На реальном графике включите Algo Trading, иначе проверки вернут -3.
Объявление импорта (готово к копированию)
#import "Turnstile_Order_Gateway.ex5" void TOG_Configure(int deviation, int retries, int delay_ms, bool adjust_stops, bool verbose); double TOG_NormalizeVolume(string symbol, double volume); double TOG_NormalizePrice(string symbol, double price); double TOG_RiskVolume(string symbol, ENUM_ORDER_TYPE type, double entry, double sl, double risk_money); double TOG_MaxVolume(string symbol, ENUM_ORDER_TYPE type, double share); ENUM_ORDER_TYPE_FILLING TOG_FillingMode(string symbol); int TOG_CheckMarket(string symbol, ENUM_ORDER_TYPE type); int TOG_CheckStops(string symbol, ENUM_ORDER_TYPE type, double price, double sl, double tp); int TOG_CheckFreeze(ulong ticket); int TOG_Preflight(string symbol, ENUM_ORDER_TYPE type, double volume, double price, double sl, double tp); ulong TOG_Open(string symbol, ENUM_ORDER_TYPE type, double volume, double price, double sl, double tp, ulong magic, string comment); bool TOG_Modify(ulong ticket, double price, double sl, double tp); bool TOG_Close(ulong ticket, double volume); int TOG_CloseAll(string symbol, long magic, bool pending); int TOG_ProcessQueue(); int TOG_QueueCount(); void TOG_ClearQueue(); int TOG_LastReason(); uint TOG_LastRetcode(); string TOG_ReasonText(int reason); int TOG_RetcodeClass(uint retcode); int TOG_GetStats(long &stats[]); #import
Коды причин
TOG_LastReason возвращает код, TOG_ReasonText - текст заглавными буквами.
- 0 OK; 1 NO CHANGE (те же значения, ничего не отправлено); 2 DEFERRED (в очереди).
- -1 BAD PARAMETERS: неизвестный символ или тип, цена отложенного 0, объём 0.
- -2 NO CONNECTION: нет связи или котировок.
- -3 TRADING DISABLED: выключен Algo Trading или торговля на счёте.
- -4 SYMBOL MODE: символ отключён, только закрытие, только покупки или только продажи.
- -5 MARKET CLOSED: вне торговых сессий.
- -6 INVALID VOLUME: вне min/max, не кратен шагу или сверх лимита объёма.
- -7 INVALID STOPS: SL, TP или цена отложенного с неверной стороны или внутри уровня стопов.
- -8 FREEZE ZONE: цена внутри уровня заморозки.
- -9 NO MARGIN: маржа рыночного ордера больше свободной.
- -10 ORDER TYPE BLOCKED: тип или SL/TP запрещены, либо достигнут лимит отложенных.
- -11 ORDERCHECK FAILED и -12 SERVER REJECTED: см. TOG_LastRetcode.
- -13 TICKET NOT FOUND; -14 QUEUE FULL (256 в ожидании).
Справочник API
type: ORDER_TYPE_BUY, ORDER_TYPE_SELL, ORDER_TYPE_BUY_LIMIT, ORDER_TYPE_SELL_LIMIT, ORDER_TYPE_BUY_STOP или ORDER_TYPE_SELL_STOP (stop-limit возвращает -1). Цены абсолютные; sl или tp = 0 означает отсутствие.
TOG_Configure
deviation: проскальзывание в пунктах, от 0 (неверное: 20). retries: 0-10 (неверное: 3). delay_ms: 0-5000 мс между повторами (неверное: 300). adjust_stops: true переносит SL/TP с правильной стороны, но внутри уровня стопов, на ближайшую допустимую цену плюс тик (плюс спред, если сервер снова отказал); false возвращает -7. verbose: пишет блокировки, повторы и отложенные действия с префиксом [TOG].
TOG_NormalizeVolume
Округляет вниз до шага объёма, ограничивает максимумом. 0.0 ниже минимума, при объёме 0 или неизвестном символе.
TOG_NormalizePrice
Округляет до размера тика и числа знаков. 0.0 для цены 0, так что пустой SL остаётся 0.
TOG_RiskVolume
Объём, теряющий risk_money (валюта счёта) на sl, через OrderCalcProfit (верно для кроссов, металлов, индексов, акций), округлён вниз. entry 0 = Ask для покупок, Bid для продаж. 0.0 с -6, если даже минимум рискует больше, -7 если sl с неверной стороны, -1 при неверных данных.
double lots = TOG_RiskVolume(_Symbol, ORDER_TYPE_BUY, 0, sl, AccountInfoDouble(ACCOUNT_BALANCE) * 0.01);
TOG_MaxVolume
Наибольший допустимый объём, маржа которого помещается в свободную маржу x share (0-1, иначе 1), в пределах максимума и остатка лимита объёма. 0.0 с -9, если не помещается даже минимум.
TOG_FillingMode
Заполнение рыночных сделок: FOK, если разрешено, иначе IOC, иначе RETURN. TOG_Open переключает режим, если сервер его отверг.
TOG_CheckMarket
Проверки 1-4 для открытия: соединение и котировки, Algo Trading, режим символа для направления, сессия (время сервера по таблице сессий; без таблицы считается открытой). Возвращает 0 или от -1 до -5.
TOG_CheckStops
Рыночные: sl и tp с правильной стороны от Bid (покупка) или Ask (продажа), не ближе SYMBOL_TRADE_STOPS_LEVEL. Отложенные: так же цена от рынка, sl и tp от цены. Возвращает 0, -7, -1 или -2.
TOG_CheckFreeze
-8, когда Bid (покупка) или Ask (продажа) в пределах SYMBOL_TRADE_FREEZE_LEVEL от SL или TP позиции, либо рынок так же близко к цене отложенного ордера. 0 при уровне 0, -13 для неизвестного тикета.
TOG_Preflight
Все 9 проверок по порядку без отправки: рыночные проверки, флаги типов и лимит отложенных, объём, стопы, маржа (рыночные), OrderCheck. Возвращает первую ошибку или 0.
if(TOG_Preflight(_Symbol, ORDER_TYPE_SELL, 0.10, 0, sl, tp) != 0) Print(TOG_ReasonText(TOG_LastReason()));
TOG_Open
Нормализует объём и цены, корректирует стопы (если включено), выполняет TOG_Preflight, отправляет. Рыночные ордера (price 0) повторяются при реквотах, смене цены, тайм-аутах и ошибках связи со свежими ценами. Отложенные используют GTC или DAY, если GTC запрещён. Возвращает тикет позиции (рыночный), тикет ордера (отложенный) или 0. В очередь не ставится.
TOG_Modify
SL/TP позиции или цена/SL/TP отложенного ордера (price 0 сохраняет цену). Те же значения: true, причина 1. Блокировка зоной заморозки, закрытой сессией или отсутствием связи: false, причина 2, в очереди; новый вызов для тикета заменяет прежний.
TOG_Close
Закрывает позицию или удаляет отложенный ордер. volume 0 или полный объём закрывает всё; меньше - частично (вниз); остаток ниже минимума закрывает всё. Блокировка как выше: false, причина 2, в очереди (заменяет ожидающее изменение).
TOG_CloseAll
TOG_Close для каждой позиции (и отложенного, если pending) с данным symbol ("" = все) и magic (-1 = любой). Возвращает число закрытых сейчас.
TOG_ProcessQueue
Отправляет действия из очереди после снятия блокировки; вызывайте в OnTick или OnTimer. Действие покидает очередь при успехе, исчезновении тикета или другой ошибке; после отказа сервера ждёт секунду. Возвращает число выполненных.
TOG_QueueCount и TOG_ClearQueue
Число ожидающих действий (максимум 256); удаление всех без отправки.
TOG_LastReason, TOG_LastRetcode и TOG_ReasonText
Причина последнего вызова; последний код сервера (0, если ничего не отправлено); текст кода причины (иначе "UNKNOWN").
TOG_RetcodeClass
0 DONE (размещён, исполнен, частично, без изменений, позиция закрыта), 1 RETRY (реквота, отказ, ошибка, тайм-аут, цена изменилась или неверна, нет котировок, много запросов, блокировка, связь), 2 FIX (неверный запрос, объём, стопы, срок, заполнение, ордер), 3 WAIT (рынок закрыт, заморозка), 4 FATAL (прочие, например нет денег).
TOG_GetStats
Заполняет stats[] 10 счётчиками, возвращает 10: 0 запросы, 1 отправлено, 2 исполнено, 3 заблокировано, 4 повторы, 5 отложено, 6 исполнено из очереди, 7 отказы, 8 стопы скорректированы, 9 удалено.
Рабочий пример интеграции
#import "Turnstile_Order_Gateway.ex5"
double TOG_RiskVolume(string symbol, ENUM_ORDER_TYPE type, double entry, double sl, double risk_money);
ulong TOG_Open(string symbol, ENUM_ORDER_TYPE type, double volume, double price, double sl, double tp, ulong magic, string comment);
bool TOG_Close(ulong ticket, double volume);
int TOG_ProcessQueue();
int TOG_LastReason();
string TOG_ReasonText(int reason);
#import
ulong ticket = 0;
bool tried = false;
void OnTick()
{
TOG_ProcessQueue();
if(!tried)
{
tried = true;
double sl = SymbolInfoDouble(_Symbol, SYMBOL_BID) - 300 * _Point;
double lots = TOG_RiskVolume(_Symbol, ORDER_TYPE_BUY, 0, sl, 10.0);
ticket = TOG_Open(_Symbol, ORDER_TYPE_BUY, lots, 0, sl, 0, 7001, "turnstile");
Print("open ", ticket, ": ", TOG_ReasonText(TOG_LastReason()));
}
if(ticket > 0 && PositionSelectByTicket(ticket) && PositionGetDouble(POSITION_PROFIT) > 5.0)
Print("close: ", TOG_Close(ticket, 0), " ", TOG_ReasonText(TOG_LastReason()));
} Архитектура и примечания
- Каждая импортирующая программа имеет свои настройки, статистику и очередь в памяти (теряется при удалении советника или перезапуске терминала).
- Проверки только читают данные терминала; отправляют только TOG_Open, TOG_Modify, TOG_Close, TOG_CloseAll и TOG_ProcessQueue, синхронно.
- Варианты: защита при валидации = настройки по умолчанию и TOG_ProcessQueue в OnTick; строгие стопы = adjust_stops false; разработка = verbose true и TOG_GetStats на вашей панели.
- MetaTrader 5, неттинг и хеджинг, любой символ; только советники и скрипты. Безопасна в тестере, оптимизации и MQL5 Cloud Network (без DLL, файлов, веб-запросов; без паузы повторов в тестере).
- Без графических объектов, таймеров, файлов и глобальных переменных; может добавить символ в Обзор рынка ради котировок.
- Праздник, которого нет в таблице сессий, распознаётся по ответу сервера как -5.
- Не поддерживаются: stop-limit ордера, close-by, OrderSendAsync.
Предупреждение о рисках
Библиотека проверяет и отправляет запросы вашего кода. Она не выбирает входы и не гарантирует исполнение, цены или прибыль. Сначала тестируйте на демо-счёте.
