Turnstile Order Gateway
- Bibliotecas
-
Syarief Azman Bin Rosli
Olá e seja bem-vindo ao meu perfil oficial no MQL5!
Sou Syarief Azman Bin Rosli, desenvolvedor de sistemas de trading algorítmico e engenheiro de software quantitativo com mais de uma década de experiência especializada na criação de Expert Advisors para MetaTrader 5 e MetaTrader 4. - Versão: 1.0
- Ativações: 5
Biblioteca MQL5 entre o seu Expert Advisor e o OrderSend. Cada pedido passa por 9 portões (conexão, Algo Trading, modo do símbolo, sessão, tipos de ordem, volume, stops, margem, OrderCheck) antes do envio. Fechamentos e modificações bloqueados pelo nível de congelamento, por sessão fechada ou por perda de conexão entram numa fila e são enviados depois. Ela nunca opera sozinha. Você recebe o arquivo compilado Turnstile_Order_Gateway.ex5; esta página é a referência completa da API.
Início rápido
- Copie Turnstile_Order_Gateway.ex5 para MQL5/Libraries (Arquivo > Abrir pasta de dados).
- Cole o bloco #import abaixo no seu EA ou script.
- Opcional: TOG_Configure em OnInit (padrão 20, 3, 300, true, false).
- Chame TOG_ProcessQueue em OnTick ou OnTimer.
- Opere com TOG_Open, TOG_Modify, TOG_Close. Com 0 ou false, imprima TOG_ReasonText(TOG_LastReason()).
- Verificação: rode o exemplo abaixo no Testador de Estratégia; o log mostra ticket e motivo. Na conta real, ative o Algo Trading ou as verificações retornam -3.
Declaração de importação (pronta para copiar)
#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
Códigos de motivo
TOG_LastReason dá o código, TOG_ReasonText o texto em maiúsculas.
- 0 OK; 1 NO CHANGE (mesmos valores, nada enviado); 2 DEFERRED (na fila).
- -1 BAD PARAMETERS: símbolo ou tipo desconhecido, preço pendente 0, volume 0.
- -2 NO CONNECTION: sem conexão ou sem cotações.
- -3 TRADING DISABLED: Algo Trading ou negociação da conta desligados.
- -4 SYMBOL MODE: desativado, só fechamento, só compras ou só vendas.
- -5 MARKET CLOSED: fora das sessões de negociação.
- -6 INVALID VOLUME: fora de min/max, fora do passo ou acima do limite de volume.
- -7 INVALID STOPS: SL, TP ou preço pendente do lado errado ou dentro do nível de stops.
- -8 FREEZE ZONE: preço dentro do nível de congelamento.
- -9 NO MARGIN: margem da ordem a mercado maior que a margem livre.
- -10 ORDER TYPE BLOCKED: tipo ou SL/TP não permitidos, ou limite de ordens pendentes atingido.
- -11 ORDERCHECK FAILED e -12 SERVER REJECTED: veja TOG_LastRetcode.
- -13 TICKET NOT FOUND; -14 QUEUE FULL (256 aguardando).
Referência da API
type: ORDER_TYPE_BUY, ORDER_TYPE_SELL, ORDER_TYPE_BUY_LIMIT, ORDER_TYPE_SELL_LIMIT, ORDER_TYPE_BUY_STOP ou ORDER_TYPE_SELL_STOP (stop-limit retorna -1). Preços absolutos; sl ou tp 0 significa nenhum.
TOG_Configure
deviation: slippage em pontos, 0 ou mais (inválido: 20). retries: 0-10 (inválido: 3). delay_ms: 0-5000 entre tentativas (inválido: 300). adjust_stops: true move um SL/TP do lado certo mas dentro do nível de stops para o preço legal mais próximo mais um tick (mais o spread se o servidor ainda recusar); false retorna -7. verbose: registra bloqueios, novas tentativas e adiamentos com o prefixo [TOG].
TOG_NormalizeVolume
Arredonda para baixo ao passo de volume e limita ao máximo. 0.0 abaixo do mínimo, com volume 0 ou símbolo desconhecido.
TOG_NormalizePrice
Arredonda ao tamanho do tick e aos dígitos. 0.0 para preço 0, então um SL vazio continua 0.
TOG_RiskVolume
Volume que perde risk_money (moeda da conta) no sl, via OrderCalcProfit (correto para cruzamentos, metais, índices, ações), arredondado para baixo. entry 0 = Ask para compras, Bid para vendas. 0.0 com -6 se o volume mínimo já arrisca mais, -7 se sl está do lado errado, -1 com dados inválidos.
double lots = TOG_RiskVolume(_Symbol, ORDER_TYPE_BUY, 0, sl, AccountInfoDouble(ACCOUNT_BALANCE) * 0.01);
TOG_MaxVolume
Maior volume válido cuja margem cabe em margem livre x share (0-1, senão 1), dentro do máximo e do limite de volume restante. 0.0 com -9 se nem o mínimo cabe.
TOG_FillingMode
Preenchimento a mercado: FOK se permitido, senão IOC, senão RETURN. TOG_Open troca de modo se o servidor recusar.
TOG_CheckMarket
Portões 1-4 para abertura: conexão e cotações, Algo Trading, modo do símbolo nessa direção, sessão (hora do servidor contra a tabela de sessões; sem tabela conta como aberto). Retorna 0 ou de -1 a -5.
TOG_CheckStops
Mercado: sl e tp do lado certo do Bid (compra) ou Ask (venda), a pelo menos SYMBOL_TRADE_STOPS_LEVEL. Pendentes: o preço da mesma forma em relação ao mercado, sl e tp a partir do preço. Retorna 0, -7, -1 ou -2.
TOG_CheckFreeze
-8 quando o Bid (compra) ou Ask (venda) está dentro de SYMBOL_TRADE_FREEZE_LEVEL do SL ou TP da posição, ou o mercado está tão perto do preço de uma ordem pendente. 0 se o nível é 0, -13 para ticket desconhecido.
TOG_Preflight
Os 9 portões em ordem, nada enviado: portões de mercado, tipos de ordem e limite de pendentes, volume, stops, margem (mercado), OrderCheck. Retorna a primeira falha ou 0.
if(TOG_Preflight(_Symbol, ORDER_TYPE_SELL, 0.10, 0, sl, tp) != 0) Print(TOG_ReasonText(TOG_LastReason()));
TOG_Open
Normaliza volume e preços, ajusta stops se ativado, executa TOG_Preflight e envia. Ordens a mercado (price 0) repetem em requotes, mudanças de preço, timeouts e erros de conexão com preços novos. Pendentes usam GTC, ou DAY se GTC não é permitido. Retorna o ticket da posição (mercado), da ordem (pendente) ou 0. Nunca entra na fila.
TOG_Modify
SL/TP de uma posição, ou preço/SL/TP de uma ordem pendente (price 0 mantém o preço). Mesmos valores: true, motivo 1. Bloqueado pela zona de congelamento, sessão fechada ou sem conexão: false, motivo 2, na fila; uma chamada mais nova para o ticket a substitui.
TOG_Close
Fecha uma posição ou exclui uma ordem pendente. volume 0 ou o volume total fecha tudo; menos fecha uma parte (para baixo); um resto abaixo do mínimo fecha tudo. Bloqueio como acima: false, motivo 2, na fila (substitui uma modificação na fila).
TOG_CloseAll
TOG_Close para cada posição (e ordem pendente se pending) que coincida com symbol ("" = todos) e magic (-1 = qualquer). Retorna quantas fecharam agora.
TOG_ProcessQueue
Envia as ações da fila quando desbloqueadas; chame em OnTick ou OnTimer. Uma ação sai da fila ao ter sucesso, quando o ticket some ou em outra falha; após recusa do servidor espera um segundo. Retorna o número concluído.
TOG_QueueCount e TOG_ClearQueue
Ações aguardando (máximo 256); descartar todas sem enviar.
TOG_LastReason, TOG_LastRetcode e TOG_ReasonText
Motivo da última chamada; último retcode do servidor (0 se nada foi enviado); texto de um código de motivo ("UNKNOWN" caso contrário).
TOG_RetcodeClass
0 DONE (colocada, executada, parcial, sem mudanças, posição fechada), 1 RETRY (requote, rejeição, erro, timeout, preço mudou ou inválido, sem cotações, pedidos demais, bloqueio, conexão), 2 FIX (pedido, volume, stops, expiração, preenchimento ou ordem inválidos), 3 WAIT (mercado fechado, congelado), 4 FATAL (demais, ex. sem dinheiro).
TOG_GetStats
Preenche stats[] com 10 contadores e retorna 10: 0 pedidos, 1 enviados, 2 concluídos, 3 bloqueados, 4 novas tentativas, 5 adiados, 6 concluídos da fila, 7 recusados, 8 stops ajustados, 9 descartados.
Exemplo de integração funcional
#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()));
} Arquitetura e notas
- Cada programa que importa a biblioteca tem suas próprias configurações, estatísticas e fila em memória (perdida ao remover o EA ou reiniciar o terminal).
- As verificações só leem dados do terminal; só TOG_Open, TOG_Modify, TOG_Close, TOG_CloseAll e TOG_ProcessQueue enviam, de forma síncrona.
- Configurações: segurança no validador = padrões mais TOG_ProcessQueue em OnTick; stops estritos = adjust_stops false; desenvolvimento = verbose true e TOG_GetStats no seu painel.
- MetaTrader 5, netting e hedging, qualquer símbolo; só EAs e scripts. Segura no Testador de Estratégia, na otimização e na MQL5 Cloud Network (sem DLL, arquivos ou requisições web; sem pausa entre tentativas no testador).
- Sem objetos gráficos, timers, arquivos ou variáveis globais; pode adicionar um símbolo à Observação do Mercado para ler cotações.
- Um feriado ausente da tabela de sessões é detectado pela resposta do servidor como -5.
- Não suportado: ordens stop-limit, close-by, OrderSendAsync.
Aviso de risco
A biblioteca verifica e envia os pedidos do seu código. Ela não escolhe entradas nem garante execuções, preços ou lucros. Teste primeiro numa conta demo.
