DISCLAIMER – USO DE CÓDIGOS MQL5
Todo o conteúdo disponibilizado nesta página, incluindo, mas não se limitando a códigos-fonte em linguagem MQL5, exemplos de implementação, funções, rotinas, módulos e estruturas de robôs de negociação automatizada, tem finalidade exclusivamente educacional, acadêmica e demonstrativa.
Os códigos aqui apresentados NÃO devem, em hipótese alguma, ser utilizados em contas reais de negociação, seja parcial ou integralmente, sob pena de total responsabilidade do usuário por quaisquer perdas financeiras, danos patrimoniais, falhas operacionais, mau funcionamento de plataformas, bloqueios de conta, inconsistências de execução, slippage, requotes, falhas de corretoras ou quaisquer outros riscos inerentes à atividade de trading automatizado.
O uso dos códigos é estritamente permitido apenas em ambiente simulado (Conta de Demonstração – DEMO) do MetaTrader 5 (MT5), com objetivo de estudo, aprendizado, testes controlados e validação técnica de conceitos de programação e lógica de mercado.
O proprietário do site, bem como seus desenvolvedores, autores, colaboradores e representantes legais:
Não se responsabilizam por perdas financeiras de qualquer natureza;
Não oferecem garantia de rentabilidade, desempenho, estabilidade, integridade ou adequação dos códigos a qualquer finalidade específica;
Não prestam consultoria financeira, de investimentos ou recomendações de trading;
Não se responsabilizam por decisões operacionais tomadas com base direta ou indireta nos códigos aqui apresentados.
O usuário declara estar ciente de que operações no mercado financeiro envolvem riscos elevados, podendo resultar na perda total do capital investido, e que qualquer utilização dos códigos fora do ambiente educacional simulado é feita por conta e risco exclusivamente do usuário.
Ao acessar, copiar, estudar, modificar ou executar qualquer trecho de código disponibilizado nesta página, o usuário declara concordar integralmente com os termos deste aviso de isenção de responsabilidade (Disclaimer).
Caso o usuário não concorde com qualquer dos termos acima, deverá interromper imediatamente o acesso a este conteúdo e abster-se de utilizar os códigos aqui disponibilizados.
//--------------------------------------//
// 6. Execução de Ordens
//--------------------------------------//
// 6.1 Executar_Condicao1 (Compra ou Venda):
void Executar_Condicao1() {
// Obter preços atuais com verificação de erro
MqlTradeRequest request = {};
MqlTradeResult result = {};
double currentBid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double currentAsk = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
if(currentBid == 0 || currentAsk == 0) {
Print("Executar_Condicao1 - Erro ao obter preços atuais. Bid: ", currentBid, " Ask: ", currentAsk, " Erro: ", GetLastError());
return;
}
ulong ticket = 0;
double sl = 0, tp = 0; // Inicializadas
double spread = currentAsk - currentBid;
// Verificar condição básica
int resultCondition = Estrategia_1();
if(resultCondition == 0) return; // Sem sinal
// Validar tamanho do lote
if(LotSize1 <= 0 || LotSize1 > SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX)) {
Print("Tamanho do lote inválido (LotSize1): ", LotSize1);
return;
}
// --- LÓGICA PARA VENDA (SELL) ---
if(resultCondition == -1) {
// SL e TP
sl = NormalizeDouble(currentAsk + (StopLoss1 * Point), Digits);
tp = NormalizeDouble(currentBid - (TakeProfit1 * Point), Digits);
// Validar TP
if(tp >= currentBid || tp <= 0) {
double fallbackTP = NormalizeDouble(currentBid - (2 TakeProfit1 Point), Digits);
if(fallbackTP < currentBid && fallbackTP > 0) {
tp = fallbackTP;
Print("ExecuteCondition1 - TP ajustado para venda: ", tp);
} else {
Print("ExecuteCondition1 - TP inválido para venda. Original: ", tp, " Fallback: ", fallbackTP);
return;
}
}
// Validar SL
if(sl <= currentAsk || sl <= 0) {
Print("ExecuteCondition1 - SL inválido para venda: ", sl);
return;
}
// Preparar ordem de venda
ZeroMemory(request);
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = LotSize1;
request.type = ORDER_TYPE_SELL;
request.price = NormalizeDouble(currentBid, _Digits);
request.sl = sl;
request.tp = tp;
request.deviation = 10;
request.magic = InpMagicnumber1;
request.comment = "Sell, EA: " + IntegerToString(InpMagicnumber1);
request.type_filling = ORDER_FILLING_IOC;
request.type_time = ORDER_TIME_GTC;
if(OrderSend(request, result)) {
ticket = result.order;
lastCandleTradeTime = iTime(_Symbol, PERIOD_CURRENT, 0);
Print("ExecuteCondition1: Ordem de Venda executada. Ticket: ", ticket,
" Preço: ", request.price,
" SL: ", sl,
" TP: ", tp);
DEBUG(StringFormat("Spread atual: %.5f", spread));
} else {
Print("ExecuteCondition1: Erro ao enviar ordem de venda. Código: ", result.retcode,
" Erro: ", GetLastError(),
" Preço: ", request.price,
" SL: ", sl,
" TP: ", tp);
}
}
// --- LÓGICA PARA COMPRA (BUY) ---
else if(resultCondition == 1) {
// SL e TP
sl = NormalizeDouble(currentBid - (StopLoss1 * Point), Digits);
tp = NormalizeDouble(currentAsk + (TakeProfit1 * Point), Digits);
// Validar TP
if(tp <= currentAsk || tp <= 0) {
double fallbackTP = NormalizeDouble(currentAsk + (2 TakeProfit1 Point), Digits);
if(fallbackTP > currentAsk && fallbackTP > 0) {
tp = fallbackTP;
Print("ExecuteCondition1: TP ajustado para compra: ", tp);
} else {
Print("ExecuteCondition1: TP inválido para compra. Original: ", tp, " Fallback: ", fallbackTP);
return;
}
}
// Validar SL
if(sl >= currentBid || sl <= 0) {
Print("ExecuteCondition1: SL inválido para compra: ", sl);
return;
}
// Preparar ordem de compra
ZeroMemory(request);
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = LotSize1;
request.type = ORDER_TYPE_BUY;
request.price = NormalizeDouble(currentAsk, _Digits);
request.sl = sl;
request.tp = tp;
request.deviation = 10;
request.magic = InpMagicnumber1;
request.comment = "Buy, EA: " + IntegerToString(InpMagicnumber1);
request.type_filling = ORDER_FILLING_IOC;
request.type_time = ORDER_TIME_GTC;
if(OrderSend(request, result)) {
ticket = result.order;
lastCandleTradeTime = iTime(_Symbol, PERIOD_CURRENT, 0);
Print("ExecuteCondition1: Ordem de Compra executada. Ticket: ", ticket,
" Preço: ", request.price,
" SL: ", sl,
" TP: ", tp);
DEBUG(StringFormat("Spread atual: %.5f", spread));
} else {
Print("ExecuteCondition1: Erro ao enviar ordem de compra. Código: ", result.retcode,
" Erro: ", GetLastError(),
" Preço: ", request.price,
" SL: ", sl,
" TP: ", tp);
}
}
}
// 6.2 Executar_Condicao2 (Compra ou Venda)
void Executar_Condicao2() {
// Obter preços atuais com verificação de erro
double currentBid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double currentAsk = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
if(currentBid == 0 || currentAsk == 0) {
Print("ExecuteCondition2. Erro ao obter preços atuais. Bid: ", currentBid, " Ask: ", currentAsk);
return;
}
ulong ticket = 0;
double sl = 0, tp = 0; // Inicializadas
MqlTradeRequest request = {};
MqlTradeResult result = {};
double spread = currentAsk - currentBid;
// Verificar condição básica
int resultCondition = Estrategia_2();
if(resultCondition == 0) return; // Sem sinal
// Validar tamanho do lote
if(LotSize2 <= 0 || LotSize2 > SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX)) {
Print("ExecuteCondition2. Tamanho do lote inválido: ", LotSize2);
return;
}
// --- LÓGICA PARA VENDA (SELL) ---
if(resultCondition == -1) {
// SL e TP
sl = NormalizeDouble(currentBid + (StopLoss2 * Point), Digits);
tp = NormalizeDouble(currentAsk - (TakeProfit2 * Point), Digits);
// Validar TP
if(tp >= currentBid || tp <= 0) {
double fallbackTP = NormalizeDouble(currentBid - (2 TakeProfit2 Point), Digits);
if(fallbackTP < currentBid && fallbackTP > 0) {
tp = fallbackTP;
Print("Sell2. TP ajustado para venda: ", tp);
} else {
Print("Sell2. TP inválido para venda. Original: ", tp, " Fallback: ", fallbackTP);
return;
}
}
// Validar SL
if(sl <= currentAsk || sl <= 0) {
Print("Sell2. . SL inválido para venda: ", sl);
return;
}
// Preparar ordem de venda
ZeroMemory(request);
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = LotSize2;
request.type = ORDER_TYPE_SELL;
request.price = NormalizeDouble(currentBid, _Digits);
request.sl = sl;
request.tp = tp;
request.deviation = 10;
request.magic = InpMagicnumber2;
request.comment = "Sell, EA: " + IntegerToString(InpMagicnumber2);
request.type_filling = ORDER_FILLING_IOC;
request.type_time = ORDER_TIME_GTC;
if(OrderSend(request, result)) {
ticket = result.order;
lastCandleTradeTime = iTime(_Symbol, PERIOD_CURRENT, 0);
Print("Sell2. Ordem de Venda executada. Ticket: ", ticket,
" Preço: ", request.price,
" SL: ", sl,
" TP: ", tp,
" Result Condition: ", resultCondition);
DEBUG(StringFormat("Spread atual: %.5f", spread));
} else {
Print("Sell2. Erro ao enviar ordem de venda. Código: ", result.retcode,
" Erro: ", GetLastError(),
" Preço: ", request.price,
" SL: ", sl,
" TP: ", tp);
}
}
// --- LÓGICA PARA COMPRA (BUY) --
else if(resultCondition == 1) {
// SL e TP
sl = NormalizeDouble(currentBid - (StopLoss2 * Point), Digits);
tp = NormalizeDouble(currentAsk + (TakeProfit2 * Point), Digits);
// Validar TP
if(tp <= currentAsk || tp <= 0) {
double fallbackTP = NormalizeDouble(currentAsk + (2 TakeProfit2 Point), Digits);
if(fallbackTP > currentAsk && fallbackTP > 0) {
tp = fallbackTP;
Print("Buy2. TP ajustado para compra: ", tp);
} else {
Print("Buy2. TP inválido para compra. Original: ", tp, " Fallback: ", fallbackTP);
return;
}
}
// Validar SL
if(sl >= currentBid || sl <= 0) {
Print("Buy2. SL inválido para compra: ", sl);
return;
}
// Preparar ordem de compra
ZeroMemory(request);
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = LotSize2;
request.type = ORDER_TYPE_BUY;
request.price = NormalizeDouble(currentAsk, _Digits);
request.sl = sl;
request.tp = tp;
request.deviation = 10;
request.magic = InpMagicnumber2;
request.comment = "Buy, EA: " + IntegerToString(InpMagicnumber2);
request.type_filling = ORDER_FILLING_IOC;
request.type_time = ORDER_TIME_GTC;
if(OrderSend(request, result)) {
ticket = result.order;
lastCandleTradeTime = iTime(_Symbol, PERIOD_CURRENT, 0);
Print("Buy2. Ordem de Compra executada. Ticket: ", ticket,
" Preço: ", request.price,
" SL: ", sl,
" TP: ", tp,
" Result Condition: ", resultCondition);
DEBUG(StringFormat("Spread atual: %.5f", spread));
} else {
Print("Buy2. Erro ao enviar ordem de compra. Código: ", result.retcode,
" Erro: ", GetLastError(),
" Preço: ", request.price,
" SL: ", sl,
" TP: ", tp);
}
}
}
Código Bloco 6
Indicadores
Produtos
Artigos
Determine
Estudo Semanal
Robô MQL5
