Meu robô não faz entradas

 
Olá pessoal, estou tentando criar um robô mas não sei muito de programação estou vendo tudo pelo Youtube e alguns fóruns como criar. Este meu robô está apresentando alguns erros e não faz entradas poderiam me ajudar por favor?
Arquivos anexados:
 
Lucas Henrique:
Olá pessoal, estou tentando criar um robô mas não sei muito de programação estou vendo tudo pelo Youtube e alguns fóruns como criar. Este meu robô está apresentando alguns erros e não faz entradas poderiam me ajudar por favor?

Poderia anexar o mq5? O arquivo ex5 é o binário e ele não ajuda a ti ajudar. Se for dúvida em alguma função especifica pode colar só ela entre as tags de código também, falando tentei isso e deu aquilo. Também ajuda, se colocar por exemplo os erros que deu no testador de estrategia ou na execução da conta demo nas abas oportunas quando o robo tentou mandar a ordem para abrir posição.

Coisas meio obvias, (i) toda variavel mesmo as vindas de SYMBOL_ASK ou SYMBOL_BID devem passar por um processo de normalização, voce pode criar algo baseado no que tem na CSymbol::NormalizePrice ou aprender a usar aquela classse. O processo de normalização serve para normalizar o preço que voce esta informando com como o preço deveria ser. Por exemplo, 100,20 em uma ação tudo bem. 100000,2 no futuro do indice brasileiro é errado porque o passo dele é a cada 5 pontos. ou seja deveria ser 100000 ou 100005.

(ii) Com excessão de umas funções chamadas pelo sistema de eventos, se voce criou uma função. Voce é o responsável por chama-la como deseja e no momento que deseja.

 
Ricardo Rodrigues Lucca #:

Poderia anexar o mq5? O arquivo ex5 é o binário e ele não ajuda a ti ajudar. Se for dúvida em alguma função especifica pode colar só ela entre as tags de código também, falando tentei isso e deu aquilo. Também ajuda, se colocar por exemplo os erros que deu no testador de estrategia ou na execução da conta demo nas abas oportunas quando o robo tentou mandar a ordem para abrir posição.

Coisas meio obvias, (i) toda variavel mesmo as vindas de SYMBOL_ASK ou SYMBOL_BID devem passar por um processo de normalização, voce pode criar algo baseado no que tem na CSymbol::NormalizePrice ou aprender a usar aquela classse. O processo de normalização serve para normalizar o preço que voce esta informando com como o preço deveria ser. Por exemplo, 100,20 em uma ação tudo bem. 100000,2 no futuro do indice brasileiro é errado porque o passo dele é a cada 5 pontos. ou seja deveria ser 100000 ou 100005.

(ii) Com excessão de umas funções chamadas pelo sistema de eventos, se voce criou uma função. Voce é o responsável por chama-la como deseja e no momento que deseja.

Perdão este é o código: 


//+------------------------------------------------------------------+
//| ElephantBot.mq5 |
//| Copyright 2024, MetaQuotes Software Corp. |
//+------------------------------------------------------------------+
#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
int MagicNumber = 2024; // Número mágico para identificar as ordens do EA
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, 0, BB_Deviation, 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 (iClose(_Symbol, 0, 1) < maValue && iClose(_Symbol, 0, 0) > maValue && highPrices[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, 0, BB_Deviation, 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 (iClose(_Symbol, 0, 1) > maValue && iClose(_Symbol, 0, 0) < maValue && lowPrices[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;
   MqlTradeResult result;
   ZeroMemory(request);
   ZeroMemory(result);
   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;
   MqlTradeResult result;
   ZeroMemory(request);
   ZeroMemory(result);
   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 = AccountInfoDouble(ACCOUNT_BALANCE) * RiskPercentage / 100.0;
   double lotSize = riskAmount / (SL_Pips * _Point * SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE));
   return NormalizeDouble(lotSize, 2);
}

//+------------------------------------------------------------------+
 
Ricardo Rodrigues Lucca #:

Poderia anexar o mq5? O arquivo ex5 é o binário e ele não ajuda a ti ajudar. Se for dúvida em alguma função especifica pode colar só ela entre as tags de código também, falando tentei isso e deu aquilo. Também ajuda, se colocar por exemplo os erros que deu no testador de estrategia ou na execução da conta demo nas abas oportunas quando o robo tentou mandar a ordem para abrir posição.

Coisas meio obvias, (i) toda variavel mesmo as vindas de SYMBOL_ASK ou SYMBOL_BID devem passar por um processo de normalização, voce pode criar algo baseado no que tem na CSymbol::NormalizePrice ou aprender a usar aquela classse. O processo de normalização serve para normalizar o preço que voce esta informando com como o preço deveria ser. Por exemplo, 100,20 em uma ação tudo bem. 100000,2 no futuro do indice brasileiro é errado porque o passo dele é a cada 5 pontos. ou seja deveria ser 100000 ou 100005.

(ii) Com excessão de umas funções chamadas pelo sistema de eventos, se voce criou uma função. Voce é o responsável por chama-la como deseja e no momento que deseja.

No caso minha estratégia seria para Forex mesmo nada de B3. Mas é muito difícil criar um EA 
 
Lucas Henrique #:
No caso minha estratégia seria para Forex mesmo nada de B3. Mas é muito difícil criar um EA 
Recomendaria ver a parte aqui do site no topo tem uma entrada Livro, são varias explicações e exemplos. No mais parece código gerado que esta confundindo mt5 e mt4, por exemplo iMa() o gerador esta entendendo a versão do mt4 que retornava um valor de preço enquanto que no mt5 ele retorna um manipulador que vai ser usado em outra função para pegar o valor correto de preço.