Bom dia, estou tentando criar por mim mesmo um robô que opere rompimento de bandas de Bollinger, já consegui muita coisa por não saber programação mas quando vou compilar aparecem vários erros. Poderiam verificar pra mim e se possível consertar.
//+------------------------------------------------------------------+
//| ElephantBot.mq5 |
//| Copyright 2024, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property strict
// Parâmetros editáveis
input int MA_Period = 8; // Período da média móvel exponencial (EMA)
input int BB_Period = 20; // Período das bandas de Bollinger
input double BB_Deviation = 2.0; // Desvio padrão das bandas de Bollinger
input double RiskPercentage = 1.0; // Percentual de risco por operação em relação ao saldo da conta
input int SL_Pips = 150; // Stop Loss em pips para pares de moedas
input int TP_Pips = 200; // Take Profit em pips para pares de moedas
input int SL_Gold_Pips = 70; // Stop Loss em pips para XAU/USD
input int TP_Gold_Pips = 100; // Take Profit em pips para XAU/USD
// Variáveis globais
input int MagicNumber = 2024; // Número mágico para identificar as ordens do EA
input int Slippage = 3; // Valor de slippage permitido
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// Inicialização de variáveis ou configurações adicionais, se necessário
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// Ações de finalização, se necessário
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// Verificar condições de entrada
if (IsBuySignal())
PlaceBuyOrder();
else if (IsSellSignal())
PlaceSellOrder();
}
//+------------------------------------------------------------------+
//| Função para verificar condições de compra |
//+------------------------------------------------------------------+
bool IsBuySignal()
{
double maValue = iMA(_Symbol, 0, MA_Period, 0, MODE_EMA, PRICE_CLOSE);
double upperBB[], lowerBB[];
int bbHandle = iBands(_Symbol, 0, BB_Period, BB_Deviation, 0, PRICE_CLOSE);
if (bbHandle == INVALID_HANDLE) return false;
if (CopyBuffer(bbHandle, 1, 0, 1, upperBB) <= 0) return false;
double highPrices[];
if (CopyHigh(_Symbol, 0, 0, 1, highPrices) <= 0) return false;
// Condições para compra
if (Close[1] < maValue && Close[0] > maValue && High[0] > upperBB[0])
{
return true;
}
return false;
}
//+------------------------------------------------------------------+
//| Função para verificar condições de venda |
//+------------------------------------------------------------------+
bool IsSellSignal()
{
double maValue = iMA(_Symbol, 0, MA_Period, 0, MODE_EMA, PRICE_CLOSE);
double upperBB[], lowerBB[];
int bbHandle = iBands(_Symbol, 0, BB_Period, BB_Deviation, 0, PRICE_CLOSE);
if (bbHandle == INVALID_HANDLE) return false;
if (CopyBuffer(bbHandle, 2, 0, 1, lowerBB) <= 0) return false;
double lowPrices[];
if (CopyLow(_Symbol, 0, 0, 1, lowPrices) <= 0) return false;
// Condições para venda
if (Close[1] > maValue && Close[0] < maValue && Low[0] < lowerBB[0])
{
return true;
}
return false;
}
//+------------------------------------------------------------------+
//| Função para colocar uma ordem de compra |
//+------------------------------------------------------------------+
void PlaceBuyOrder()
{
double lotSize = CalculateLotSize();
if (lotSize <= 0.01)
return; // Evitar ordens muito pequenas
double stopLoss = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_BID) - SL_Pips * _Point, _Digits);
double takeProfit = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_BID) + TP_Pips * _Point, _Digits);
// Colocar a ordem de compra
MqlTradeRequest request = {0};
MqlTradeResult result = {0};
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = lotSize;
request.type = ORDER_TYPE_BUY;
request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
request.sl = stopLoss;
request.tp = takeProfit;
request.deviation = Slippage;
request.magic = MagicNumber;
request.comment = "Buy Order";
if (!OrderSend(request, result))
Print("Erro ao enviar ordem de compra: ", GetLastError());
}
//+------------------------------------------------------------------+
//| Função para colocar uma ordem de venda |
//+------------------------------------------------------------------+
void PlaceSellOrder()
{
double lotSize = CalculateLotSize();
if (lotSize <= 0.01)
return; // Evitar ordens muito pequenas
double stopLoss = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK) + SL_Pips * _Point, _Digits);
double takeProfit = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK) - TP_Pips * _Point, _Digits);
// Colocar a ordem de venda
MqlTradeRequest request = {0};
MqlTradeResult result = {0};
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = lotSize;
request.type = ORDER_TYPE_SELL;
request.price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
request.sl = stopLoss;
request.tp = takeProfit;
request.deviation = Slippage;
request.magic = MagicNumber;
request.comment = "Sell Order";
if (!OrderSend(request, result))
Print("Erro ao enviar ordem de venda: ", GetLastError());
}
//+------------------------------------------------------------------+
//| Função para calcular o tamanho do lote com base no risco percentual|
//+------------------------------------------------------------------+
double CalculateLotSize()
{
double riskAmount = AccountBalance() * RiskPercentage / 100.0;
double lotSize = riskAmount / (SL_Pips * _Point * MarketInfo(_Symbol, MODE_TICKVALUE));
return NormalizeDouble(lotSize, 2);
}
- Meu robô não faz entradas
- preciso e ajuda para finalizar um projeto de EA que estou fazendo
- Limite diário no MT5
Lucas Henrique: Bom dia, estou tentando criar por mim mesmo um robô que opere rompimento de bandas de Bollinger, já consegui muita coisa por não saber programação mas quando vou compilar aparecem vários erros. Poderiam verificar pra mim e se possível consertar.
- Sugestões sobre como maximizar a eficiência do ChatGPT para o desenvolvimento de códigos em MQL4 ou MQL5 - Expert Advisors e Negociação Automatizada - Fórum de negociação algorítmica MQL5
- Referência MQL5 - Como usar um algorítimo/automatização para negociação na linguagem para MetaTrader 5
- Programação em MQL5 para operadores - guia sobre linguagem algorítmica/automática de negociação para MetaTrader 5
Como Encomendar um Robô de Negociação em MQL5 e MQL4
MetaQuotes, 2014.01.24 09:16
A "Freelance" é o maior serviço freelance para a encomenda de robôs de negociação em MQL4 e indicadores técnicos. Centenas de desenvolvedores profissionais estão prontos para desenvolver aplicativos de negociação personalizados para a plataforma MetaTrader 4/5.Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se