Смотри, как бесплатно скачать роботов
Ищи нас в Facebook!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Скрипты

Price Action Dynamic Exit Strategy - Profit Shield pro - скрипт для MetaTrader 5

Просмотров:
74
Рейтинг:
(2)
Опубликован:
MQL5 Фриланс Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

вид мета-редактора

#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"
//--- Входные параметры
input double   ProfitActivationPercent = 70.0;  // Начинаем отслеживать, когда сделка достигает X% от TP
input bool     UseRSIReversal = true;           // Использование RSI для обнаружения разворотов
input int      RSIPeriod = 14;                  // Период RSI
input double   RSIOverbought = 70.0;            // Уровень перекупленности RSI
input double   RSI_Oversold = 30.0;             // Уровень перепроданности RSI
input bool     UseCandlestickPatterns = true;   // Использование свечных моделей
input bool     UseMovingAverageCross = false;   // Используйте пересечение МА для подтверждения
input int      FastMA_Period = 5;               // Период быстрой MA
input int      SlowMA_Period = 10;              // Период медленной МА
input int      CheckEveryXSeconds = 10;         // Как часто проверять (секунды)

//+------------------------------------------------------------------+
//| Функция запуска программы сценария|
//+------------------------------------------------------------------+
void OnStart()
{
   //--- Выведите сообщение о запуске сценария
   Print("Dynamic Exit Protector Started - Monitoring Trades...");
   
   //--- Создайте таймер для непрерывного мониторинга
   EventSetTimer(CheckEveryXSeconds);
}

//+------------------------------------------------------------------+
//| Функция таймера - запускается каждые X секунд |
//+------------------------------------------------------------------+
void OnTimer()
{
   CheckAndProtectTrades();
}

//+------------------------------------------------------------------+
//| Главная функция для проверки и защиты сделок |
//+------------------------------------------------------------------+
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);
         
         //--- Пропустить, если не установлен тейк-профит
         if(tp == 0) continue;
         
         double currentPrice = (type == POSITION_TYPE_BUY) ? SymbolInfoDouble(symbol, SYMBOL_BID) : SymbolInfoDouble(symbol, SYMBOL_ASK);
         
         //--- Вычисляем, насколько мы близки к TP (в процентах)
         double distanceToTP = 0;
         double progressToTP = 0;
         
         if(type == POSITION_TYPE_BUY)
         {
            distanceToTP = tp - openPrice;
            progressToTP = (currentPrice - openPrice) / distanceToTP * 100;
         }
         else // Позиция ПРОДАЖИ
         {
            distanceToTP = openPrice - tp;
            progressToTP = (openPrice - currentPrice) / distanceToTP * 100;
         }
         
         //--- Если мы достаточно близко к TP, проверяем развороты
         if(progressToTP >= ProfitActivationPercent)
         {
            bool shouldClose = false;
            string reason = "";
            
            //--- Проверьте разворот RSI (если он включен)
            if(UseRSIReversal && CheckRSI_Reversal(symbol, type))
            {
               shouldClose = true;
               reason = "RSI Reversal Signal";
            }
            
            //--- Проверка свечных паттернов (если включена)
            if(UseCandlestickPatterns && CheckCandlestickReversal(symbol, type))
            {
               shouldClose = true;
               reason = "Candlestick Reversal Pattern";
            }
            
            //--- Проверьте MA Cross (если включено)
            if(UseMovingAverageCross && CheckMA_Cross(symbol))
            {
               shouldClose = true;
               reason = "Moving Average Cross";
            }
            
            //--- Дополнительная безопасность: Если прибыль начнет значительно уменьшаться
            if(IsProfitDecreasing(symbol, ticket, currentProfit))
            {
               shouldClose = true;
               reason = "Profit Retracement Detected";
            }
            
            //--- Закройте сделку, если выполняется условие разворота
            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));
               }
            }
         }
      }
   }
}

//+------------------------------------------------------------------+
//| Проверьте 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)
   {
      // Для позиций на покупку: Следите за тем, чтобы RSI перешел в состояние перекупленности и развернулся вниз
      if(positionType == POSITION_TYPE_BUY)
      {
         if(rsi[0] < rsi[1] && rsi[1] > RSIOverbought)
            return true;
      }
      // Для позиций SELL: Следите за тем, чтобы RSI перешел в состояние перепроданности и развернулся вверх
      else
      {
         if(rsi[0] > rsi[1] && rsi[1] < RSI_Oversold)
            return true;
      }
   }
   
   return false;
}

//+------------------------------------------------------------------+
//| Проверьте наличие разворотных свечных моделей |
//+------------------------------------------------------------------+
bool CheckCandlestickReversal(string symbol, ulong positionType)
{
   MqlRates rates[];
   ArraySetAsSeries(rates, true);
   
   if(CopyRates(symbol, PERIOD_CURRENT, 0, 3, rates) > 0)
   {
      // Простой медвежий разворотный паттерн для позиций на покупку
      if(positionType == POSITION_TYPE_BUY)
      {
         // Проверьте наличие медвежьего ангульфинга или падающей звезды
         if((rates[1].close > rates[1].open && rates[0].close < rates[0].open && 
             rates[0].close < rates[1].open) || // Медвежье поглощение
            (rates[0].high - MathMax(rates[0].open, rates[0].close) > 
             MathAbs(rates[0].close - rates[0].open) * 2)) // Падающая звезда
            return true;
      }
      // Простой бычий разворотный паттерн для позиций SELL
      else
      {
         // Проверьте бычье поглощение или молот
         if((rates[1].close < rates[1].open && rates[0].close > rates[0].open && 
             rates[0].close > rates[1].open) || // Бычье поглощение
            (MathMin(rates[0].open, rates[0].close) - rates[0].low > 
             MathAbs(rates[0].close - rates[0].open) * 2)) // Молоток
            return true;
      }
   }
   
   return false;
}

//+------------------------------------------------------------------+
//| Проверка пересечения скользящих средних|
//+------------------------------------------------------------------+
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)
   {
      // Проверьте наличие медвежьего креста (быстрая MA пересекается ниже медленной MA).
      if(fastMA[1] > slowMA[1] && fastMA[0] < slowMA[0])
         return true;
   }
   
   return false;
}

//+------------------------------------------------------------------+
//| Проверьте, значительно ли уменьшается прибыль |
//+------------------------------------------------------------------+
bool IsProfitDecreasing(string symbol, ulong ticket, double currentProfit)
{
   // В реальной реализации вы можете захотеть отслеживать историю прибыли
   // Это упрощенная версия - вы можете хранить предыдущие значения прибыли
   // и сравните, уменьшилась ли прибыль на определенный процент
   
   // Пока что мы будем использовать простой подход, основанный на движении цены
   static double lastProfit = 0;
   static ulong lastTicket = 0;
   
   if(lastTicket != ticket)
   {
      lastProfit = currentProfit;
      lastTicket = ticket;
      return false;
   }
   
   // Если прибыль снижается более чем на 20% по сравнению с пиком
   if(currentProfit < lastProfit * 0.8 && currentProfit > 0)
   {
      return true;
   }
   
   // Обновите последнюю прибыль, если текущая больше
   if(currentProfit > lastProfit)
   {
      lastProfit = currentProfit;
   }
   
   return false;
}

//+------------------------------------------------------------------+
//| Функция закрытия позиции|
//+------------------------------------------------------------------+
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);
}

//+------------------------------------------------------------------+
//| Функция деинициализации|
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+


Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/66130

Memory Memory

Мониторинг потребления памяти.

VR Locker Lite  - Торговая стратегия на основе положительного замка VR Locker Lite - Торговая стратегия на основе положительного замка

Работа с помощью положительного замка, торговый робот создает один положительный замок, трейдер сам решает что с ним делать.

YURAZ_RSAXEL Скрипт рисует уровни Рудолфа Акселя YURAZ_RSAXEL Скрипт рисует уровни Рудолфа Акселя

Скрипт рисует уровни Рудолфа Акселя

YURAZ_MCCH YURAZ_MCCH

Индикатор рассчитывает % роста или падения относительно CLOSE, написан с применением ООП, и легко интегрируется в любой советник или иной индикатор.