Assista a como baixar robôs de negociação gratuitos
Encontre-nos em Facebook!
Participe de nossa página de fãs
Participe de nossa página de fãs
Script interessante?
Coloque um link para ele, e permita que outras pessoas também o avaliem
Coloque um link para ele, e permita que outras pessoas também o avaliem
Você gostou do script?
Avalie seu funcionamento no terminal MetaTrader 5
Avalie seu funcionamento no terminal MetaTrader 5
- Visualizações:
- 55
- Avaliação:
- Publicado:
-
Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance
#property copyright "Samson Mwita 2025" #property link "Samson Mwita 2025" #property version "1.00" #property description "Advanced price action-based dynamic exit strategy" #property description "Monitors Fibonacci, market structure, candlestick patterns" #property description "and behavioral patterns for optimal exit timing" //--- Parâmetros de entrada input double ProfitActivationPercent = 70.0; // Começar a monitorar quando a negociação estiver a X% do TP input bool UseRSIReversal = true; // Use o RSI para detectar reversões input int RSIPeriod = 14; // Período RSI input double RSIOverbought = 70.0; // Nível de sobrecompra do RSI input double RSI_Oversold = 30.0; // Nível RSI Oversold input bool UseCandlestickPatterns = true; // Usar padrões de velas input bool UseMovingAverageCross = false; // Use a cruz MA para confirmação input int FastMA_Period = 5; // Período MA rápido input int SlowMA_Period = 10; // Período de MA lenta input int CheckEveryXSeconds = 10; // Com que frequência verificar (segundos) //+------------------------------------------------------------------+ //| Função de início do programa de script| //+------------------------------------------------------------------+ void OnStart() { //--- Exibir mensagem de início do script Print("Dynamic Exit Protector Started - Monitoring Trades..."); //--- Crie um cronômetro para monitoramento contínuo EventSetTimer(CheckEveryXSeconds); } //+------------------------------------------------------------------+ //| Função de cronômetro - é executada a cada X segundos //+------------------------------------------------------------------+ void OnTimer() { CheckAndProtectTrades(); } //+------------------------------------------------------------------+ //| Função principal para verificar e proteger as negociações //+------------------------------------------------------------------+ void CheckAndProtectTrades() { int total = PositionsTotal(); for(int i = total-1; i >= 0; i--) { ulong ticket = PositionGetTicket(i); if(ticket > 0) { string symbol = PositionGetString(POSITION_SYMBOL); double volume = PositionGetDouble(POSITION_VOLUME); double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); double currentProfit = PositionGetDouble(POSITION_PROFIT); ulong type = PositionGetInteger(POSITION_TYPE); double sl = PositionGetDouble(POSITION_SL); double tp = PositionGetDouble(POSITION_TP); //--- Pular se nenhum Take Profit for definido if(tp == 0) continue; double currentPrice = (type == POSITION_TYPE_BUY) ? SymbolInfoDouble(symbol, SYMBOL_BID) : SymbolInfoDouble(symbol, SYMBOL_ASK); //--- Calcular o quão perto estamos do TP (em porcentagem) double distanceToTP = 0; double progressToTP = 0; if(type == POSITION_TYPE_BUY) { distanceToTP = tp - openPrice; progressToTP = (currentPrice - openPrice) / distanceToTP * 100; } else // Posição de venda { distanceToTP = openPrice - tp; progressToTP = (openPrice - currentPrice) / distanceToTP * 100; } //--- Se estivermos perto o suficiente do TP, verifique se há reversões if(progressToTP >= ProfitActivationPercent) { bool shouldClose = false; string reason = ""; //--- Verifique a reversão do RSI (se ativada) if(UseRSIReversal && CheckRSI_Reversal(symbol, type)) { shouldClose = true; reason = "RSI Reversal Signal"; } //--- Verificar padrões de velas (se ativado) if(UseCandlestickPatterns && CheckCandlestickReversal(symbol, type)) { shouldClose = true; reason = "Candlestick Reversal Pattern"; } //--- Verificar MA Cross (se ativado) if(UseMovingAverageCross && CheckMA_Cross(symbol)) { shouldClose = true; reason = "Moving Average Cross"; } //--- Segurança adicional: Se o lucro começar a diminuir significativamente if(IsProfitDecreasing(symbol, ticket, currentProfit)) { shouldClose = true; reason = "Profit Retracement Detected"; } //--- Feche a negociação se alguma condição de reversão for atendida if(shouldClose) { if(ClosePosition(ticket, symbol, volume, type)) { Print("Position #", ticket, " closed. Reason: ", reason, " | Progress to TP: ", DoubleToString(progressToTP, 1), "%", " | Final Profit: ", DoubleToString(currentProfit, 2)); } } } } } } //+------------------------------------------------------------------+ //| Verifique se há sinais de reversão no RSI| //+------------------------------------------------------------------+ bool CheckRSI_Reversal(string symbol, ulong positionType) { double rsi[]; ArraySetAsSeries(rsi, true); int handle = iRSI(symbol, PERIOD_CURRENT, RSIPeriod, PRICE_CLOSE); if(CopyBuffer(handle, 0, 0, 3, rsi) > 0) { // Para posições de COMPRA: Observe se o RSI está entrando em sobrecompra e virando para baixo if(positionType == POSITION_TYPE_BUY) { if(rsi[0] < rsi[1] && rsi[1] > RSIOverbought) return true; } // Para posições de VENDA: Observe se o RSI está entrando em sobrevenda e subindo else { if(rsi[0] > rsi[1] && rsi[1] < RSI_Oversold) return true; } } return false; } //+------------------------------------------------------------------+ //| Verificação de padrões de reversão de velas //+------------------------------------------------------------------+ bool CheckCandlestickReversal(string symbol, ulong positionType) { MqlRates rates[]; ArraySetAsSeries(rates, true); if(CopyRates(symbol, PERIOD_CURRENT, 0, 3, rates) > 0) { // Padrão simples de reversão de baixa para posições de COMPRA if(positionType == POSITION_TYPE_BUY) { // Verificar se há engolfo de baixa ou estrela cadente if((rates[1].close > rates[1].open && rates[0].close < rates[0].open && rates[0].close < rates[1].open) || // Engolfo de baixa (rates[0].high - MathMax(rates[0].open, rates[0].close) > MathAbs(rates[0].close - rates[0].open) * 2)) // Estrela cadente return true; } // Padrão simples de reversão de alta para posições de VENDA else { // Verificar se há um engolfo de alta ou um martelo if((rates[1].close < rates[1].open && rates[0].close > rates[0].open && rates[0].close > rates[1].open) || // Engolfo de alta (MathMin(rates[0].open, rates[0].close) - rates[0].low > MathAbs(rates[0].close - rates[0].open) * 2)) // Martelo return true; } } return false; } //+------------------------------------------------------------------+ //| Verificação de cruzamento de média móvel| //+------------------------------------------------------------------+ bool CheckMA_Cross(string symbol) { double fastMA[], slowMA[]; ArraySetAsSeries(fastMA, true); ArraySetAsSeries(slowMA, true); int fast_handle = iMA(symbol, PERIOD_CURRENT, FastMA_Period, 0, MODE_SMA, PRICE_CLOSE); int slow_handle = iMA(symbol, PERIOD_CURRENT, SlowMA_Period, 0, MODE_SMA, PRICE_CLOSE); if(CopyBuffer(fast_handle, 0, 0, 2, fastMA) > 0 && CopyBuffer(slow_handle, 0, 0, 2, slowMA) > 0) { // Verificar se há cruzamento de baixa (MA rápida cruza abaixo da MA lenta) if(fastMA[1] > slowMA[1] && fastMA[0] < slowMA[0]) return true; } return false; } //+------------------------------------------------------------------+ //| Verificar se o lucro está diminuindo significativamente //+------------------------------------------------------------------+ bool IsProfitDecreasing(string symbol, ulong ticket, double currentProfit) { // Em uma implementação real, talvez você queira acompanhar o histórico de lucros // Essa é uma versão simplificada - você poderia armazenar valores de lucro anteriores // e comparar se o lucro diminuiu em uma determinada porcentagem // Por enquanto, usaremos uma abordagem simples baseada no movimento de preços static double lastProfit = 0; static ulong lastTicket = 0; if(lastTicket != ticket) { lastProfit = currentProfit; lastTicket = ticket; return false; } // Se o lucro diminuir em mais de 20% em relação ao seu pico if(currentProfit < lastProfit * 0.8 && currentProfit > 0) { return true; } // Atualizar o último lucro se o atual for maior if(currentProfit > lastProfit) { lastProfit = currentProfit; } return false; } //+------------------------------------------------------------------+ //| Função de fechamento da posição| //+------------------------------------------------------------------+ bool ClosePosition(ulong ticket, string symbol, double volume, ulong type) { MqlTradeRequest request = {1}; MqlTradeResult result = {0}; request.action = TRADE_ACTION_DEAL; request.position = ticket; request.symbol = symbol; request.volume = volume; request.deviation = 10; request.comment = "Dynamic Exit"; if(type == POSITION_TYPE_BUY) { request.type = ORDER_TYPE_SELL; request.price = SymbolInfoDouble(symbol, SYMBOL_BID); } else { request.type = ORDER_TYPE_BUY; request.price = SymbolInfoDouble(symbol, SYMBOL_ASK); } return OrderSend(request, result); } //+------------------------------------------------------------------+ //| Função de desinicialização| //+------------------------------------------------------------------+ //+------------------------------------------------------------------+
Traduzido do inglês pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/en/code/66130
RSI Price Action Breakout Indicator
A high-precision trend reversal indicator combining RSI exhaustion zones with candlestick breakout patterns.
VR Locker Lite - Estratégia de negociação baseada em um bloqueio positivo
Funciona através de um bloqueio positivo; o robô de negociação cria um bloqueio positivo, e o trader decide o que fazer com ele.
iCrosshair - Real-Time Candle Metrics on Hover
Passe o mouse sobre qualquer candle para ver o que o MT5 não mostra: Tamanho do intervalo, porcentagem de corpo, proporções de pavio. Inteligente, rápido e personalizável.
Accelerator Oscillator (AC)
O Indicador Acceleration/Deceleration (Aceleração/Desaceleração ou AC) mede a aceleração e a desaceleração da força motriz atual do mercado.
