Meu robô apresenta vários erros

 
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);
}

 
Lucas HenriqueBom 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.


Artigos

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.