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