Files
yuclusters-mt5/mql5/YuCluster_Order_Router.mq5

116 lines
4.2 KiB
Plaintext

//+------------------------------------------------------------------+
//| YuCluster_Order_Router.mq5 |
//| Integração Python <-> CTrade |
//+------------------------------------------------------------------+
#property description "Roteador de Execução Institucional OCO"
#property version "1.00"
// 1. Incluindo a Biblioteca CTrade para facilitar o envio de ordens
#include <Trade\Trade.mqh>
// Instanciando o objeto de trade
CTrade trade;
//+------------------------------------------------------------------+
//| VARIÁVEIS DE ENTRADA (ISOLANDO O FATOR PSICOLÓGICO) |
//+------------------------------------------------------------------+
input group "=== Gestão de Risco OCO ==="
input double InpLote = 1.0; // Lote (Tamanho da Posição)
input int InpStopLoss = 150; // Stop Loss (em pontos)
input int InpTakeProfit = 300; // Take Profit (em pontos)
input group "=== Configurações do Robô ==="
input ulong InpMagicNumber = 123456; // Número Mágico (CPF do Robô)
//+------------------------------------------------------------------+
//| FUNÇÃO DE INICIALIZAÇÃO |
//+------------------------------------------------------------------+
int OnInit()
{
// Configura o Número Mágico para que o EA gerencie apenas as próprias ordens
trade.SetExpertMagicNumber(InpMagicNumber);
// Define o desvio máximo aceitável (Slippage)
trade.SetDeviationInPoints(5);
Print("Roteador Institucional Iniciado. Fator emocional desativado.");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| FUNÇÃO DE EXECUÇÃO DE COMPRA A MERCADO |
//+------------------------------------------------------------------+
void ExecutarCompra()
{
// Atualiza os dados de preço de mercado (Tick)
MqlTick tick;
SymbolInfoTick(_Symbol, tick);
// Calcula os níveis de Stop Loss e Take Profit engessados
double sl = tick.ask - (InpStopLoss * _Point);
double tp = tick.ask + (InpTakeProfit * _Point);
// Normaliza as casas decimais de acordo com o ativo (Tick Size)
sl = NormalizeDouble(sl, _Digits);
tp = NormalizeDouble(tp, _Digits);
// Envia a ordem a mercado instantaneamente
if(trade.Buy(InpLote, _Symbol, tick.ask, sl, tp, "YuCluster: Compra na POC"))
{
Print("Compra executada com sucesso! SL e TP na pedra.");
}
else
{
Print("Erro ao executar compra. Código: ", trade.ResultRetcode());
}
}
//+------------------------------------------------------------------+
//| FUNÇÃO DE EXECUÇÃO DE VENDA A MERCADO |
//+------------------------------------------------------------------+
void ExecutarVenda()
{
// Atualiza os dados de preço de mercado (Tick)
MqlTick tick;
SymbolInfoTick(_Symbol, tick);
// Calcula os níveis de Stop Loss e Take Profit engessados (invertido para venda)
double sl = tick.bid + (InpStopLoss * _Point);
double tp = tick.bid - (InpTakeProfit * _Point);
// Normaliza os cálculos
sl = NormalizeDouble(sl, _Digits);
tp = NormalizeDouble(tp, _Digits);
// Envia a ordem a mercado instantaneamente
if(trade.Sell(InpLote, _Symbol, tick.bid, sl, tp, "YuCluster: Venda no Imbalance"))
{
Print("Venda executada com sucesso! SL e TP na pedra.");
}
else
{
Print("Erro ao executar venda. Código: ", trade.ResultRetcode());
}
}
//+------------------------------------------------------------------+
//| LAÇO PRINCIPAL (Aguardando o gatilho do Python) |
//+------------------------------------------------------------------+
void OnTick()
{
// Aqui o EA fica "escutando" variáveis globais do terminal ou requisições
// que o nosso backend em Python enviará ao detectar o botão clicado no Painel Web.
if(GlobalVariableGet("SINAL_PYTHON_COMPRA") == 1)
{
ExecutarCompra();
GlobalVariableSet("SINAL_PYTHON_COMPRA", 0); // Reseta o sinal
}
if(GlobalVariableGet("SINAL_PYTHON_VENDA") == 1)
{
ExecutarVenda();
GlobalVariableSet("SINAL_PYTHON_VENDA", 0); // Reseta o sinal
}
}