Preciso de um EA baseado em RSI(IFR) e Média Móvel

Termos de Referência

//+------------------------------------------------------------------+
//|                                             Robo_Scalper_100.mq5 |
//|                                                   MetaTrader 5   |
//+------------------------------------------------------------------+
#property copyright "Comunidade Trader"
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>
CTrade trade;

//--- Parâmetros de Entrada
input group "--- Gerenciamento de Risco (Para R$ 100) ---"
input double   InpMetaDiaria      = 15.00;    // Meta de ganho diário (R$)
input double   InpLimitePerda     = 10.00;    // Limite de perda diária (R$)
input int      InpTakeProfit      = 50;       // Alvo da operação em Pontos (WIN)
input int      InpStopLoss        = 40;       // Stop da operação em Pontos (WIN)
input double   InpLotes           = 1.0;      // Quantidade de minicontratos

input group "--- Configuração do Indicador ---"
input int      InpPeriodoIFR      = 9;        // Período do IFR
input double   InpNivelSobrevenda = 30.0;     // Comprar abaixo disso
input double   InpNivelSobrecompra= 70.0;     // Vender acima disso

//--- Variáveis Globais
int handleIFR;
datetime dataUltimaOperacao;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   // Configura o identificador do indicador IFR
   handleIFR = iRSI(_Symbol, _Period, InpPeriodoIFR, PRICE_CLOSE);
   if(handleIFR == INVALID_HANDLE)
   {
      Print("Erro ao criar o handle do IFR.");
      return(INIT_FAILED);
   }
   
   trade.SetExpertMagicNumber(123456);
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   IndicatorRelease(handleIFR);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   // 1. Bloqueio de Sexta-feira (Preparação para Saque)
   MqlDateTime dataAtual;
   TimeToStruct(TimeCurrent(), dataAtual);
   
   if(dataAtual.day_of_week == 5) // 5 = Sexta-feira
   {
      // Fecha posições abertas na sexta para garantir o saldo livre para o saque
      if(PositionsTotal() > 0) FecharTodasAsPosicoes();
      Comment("Sexta-feira: Robô pausado para realização de saque.");
      return;
   }

   // 2. Verificação de Meta Diária e Stop Diário
   double lucroHoje = ObterLucroDiario();
   if(lucroHoje >= InpMetaDiaria)
   {
      Comment("Meta diária atingida! Lucro hoje: R$ ", DoubleToString(lucroHoje, 2));
      if(PositionsTotal() > 0) FecharTodasAsPosicoes();
      return;
   }
   if(lucroHoje <= -InpLimitePerda)
   {
      Comment("Limite de perda atingido! Prejuízo hoje: R$ ", DoubleToString(lucroHoje, 2));
      if(PositionsTotal() > 0) FecharTodasAsPosicoes();
      return;
   }

   // Se já houver operação aberta, apenas monitora
   if(PositionsTotal() > 0) return;

   // 3. Lógica de Entrada com IFR
   double valoresIFR[];
   ArraySetAsSeries(valoresIFR, true);
   if(CopyBuffer(handleIFR, 0, 0, 2, valoresIFR) < 2) return;

   double rsiAtual = valoresIFR[0];

   // Evita abrir múltiplas ordens no mesmo candle
   datetime tempoCandleAtual = iTime(_Symbol, _Period, 0);
   if(dataUltimaOperacao == tempoCandleAtual) return;

   // Sinal de Compra (Preço muito barato/Esticado para baixo)
   if(rsiAtual < InpNivelSobrevenda)
   {
      double precoCompra = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
      double sl = precoCompra - (InpStopLoss * _Point);
      double tp = precoCompra + (InpTakeProfit * _Point);
      
      if(trade.Buy(InpLotes, _Symbol, precoCompra, sl, tp, "Scalp R$100"))
      {
         dataUltimaOperacao = tempoCandleAtual;
      }
   }
   // Sinal de Venda (Preço muito caro/Esticado para cima)
   else if(rsiAtual > InpNivelSobrecompra)
   {
      double precoVenda = SymbolInfoDouble(_Symbol, SYMBOL_BID);
      double sl = precoVenda + (InpStopLoss * _Point);
      double tp = precoVenda - (InpTakeProfit * _Point);
      
      if(trade.Sell(InpLotes, _Symbol, precoVenda, sl, tp, "Scalp R$100"))
      {
         dataUltimaOperacao = tempoCandleAtual;
      }
   }

   Comment("Robô Operando...\nLucro Hoje: R$ ", DoubleToString(lucroHoje, 2));
}

//+------------------------------------------------------------------+
//| Função para calcular o resultado financeiro do dia atual          |
//+------------------------------------------------------------------+
double ObterLucroDiario()
{
   datetime inicioHoje = TimeCurrent() - (TimeCurrent() % 86400);
   HistorySelect(inicioHoje, TimeCurrent());
   
   double lucro = 0;
   int totalNegocios = HistoryDealsTotal();
   
   for(int i = 0; i < totalNegocios; i++)
   {
      ulong ticket = HistoryDealGetTicket(i);
      if(ticket > 0)
      {
         lucro += HistoryDealGetDouble(ticket, DEAL_PROFIT);
         lucro += HistoryDealGetDouble(ticket, DEAL_COMMISSION);
         lucro += HistoryDealGetDouble(ticket, DEAL_SWAP);
      }
   }
   return lucro;
}

//+------------------------------------------------------------------+
//| Função para fechar todas as posições abertas                      |
//+------------------------------------------------------------------+
void FecharTodasAsPosicoes()
{
   for(int i = PositionsTotal() - 1; i >= 0; i--)
   {
      ulong ticket = PositionGetTicket(i);
      if(ticket > 0) trade.PositionClose(ticket);
   }
}

Respondido

1
Desenvolvedor 1
Classificação
Projetos
0
0%
Arbitragem
0
Expirado
0
Livre
2
Desenvolvedor 2
Classificação
(35)
Projetos
61
23%
Arbitragem
4
50% / 25%
Expirado
15
25%
Livre
3
Desenvolvedor 3
Classificação
(5)
Projetos
6
83%
Arbitragem
0
Expirado
0
Livre
Publicou: 4 códigos
4
Desenvolvedor 4
Classificação
(216)
Projetos
283
20%
Arbitragem
28
57% / 14%
Expirado
0
Trabalhando
5
Desenvolvedor 5
Classificação
(29)
Projetos
36
39%
Arbitragem
0
Expirado
2
6%
Livre

Informações sobre o projeto

Orçamento
30 - 50 USD

Cliente

Pedidos postados1
Número de arbitragens0