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

Code Block for "Trailing Stop" based on current market price. (Ask / Bid) - эксперт для MetaTrader 5

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

Этот блок кода работает, если вы используете либо стоп-лосс, либо нет.


Требования

  • Вам необходимо включить файл "Trade.mqh" , чтобы получить доступ к классу CTrade, который позволяет работать с позициями и ордерами.

#include <Trade\Trade.mqh> // <<------------------------------------------ Включите этот файл "Trade.mqh" для доступа к классу CTrade 

  • Вам необходимо задать входной параметр, чтобы настроить расстояние трейлинга по своему усмотрению. Это не обязательно, но для удобства.
input double Traling_Step = 3.0;
  • Для класса CTrade необходимо определить экземпляр. Имя может быть любым. Лучше всего поместить его после обработчика события OnInt .

  • Затем нужно создать оператор if, который будет проверять, запущена ли в данный момент какая-либо позиция. Этот оператор вызывает функцию Check_TrailingStop(); для каждого тика. Это важно, так как советник должен отслеживать резкие и плавные движения. Не забудьте поместить это утверждение в начало обработчика события OnTick для корректной работы.
//+------------------------------------------------------------------+
//| Функция инициализации эксперта|
//+------------------------------------------------------------------+
int OnInit()
  {
//--- создайте таймер
   EventSetTimer(60);

//---
   return(INIT_SUCCEEDED);
  }


CTrade trade; // <<------------------------------------------ Объявляем вызов "CTrade". Вы можете заменить "trade" win любым именем, которое вам нужно
void OnTick()
  {
   
   if(PositionsTotal() > 0) // вызывает функцию трейлинг-стопа для каждого тика, если есть/есть работающие позиции. 
     {
      Check_TralingStop(); 
     } 
     
       
  }

  • Вам нужно объявить пользовательскую функцию Check_TrailingStop(); ( в данном случае) , чтобы сделать все остальное. Вы можете использовать любое имя.
  • Пользовательская функция перебирает все открытые позиции и отслеживает их на требуемое расстояние.
void Check_TralingStop()
  {
   int totalPositions = PositionsTotal();
   for(int count =0; count < totalPositions; count++)
     {
      ulong TicketNo = PositionGetTicket(count); // Получите номер билета позиции, используя "индекс" позиции.

      if(PositionSelectByTicket(TicketNo)) // Выберите позицию, используя номер билета (мы уже выбрали номер билета).
        {
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) // Проверка позиции Тип.
           {
            double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
            double stopLoss  = PositionGetDouble(POSITION_SL);       // <<-------------------Get Position Current Stop Loss
            double takeProfit = PositionGetDouble(POSITION_TP);
            double bidPrice  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
            ulong ticket = PositionGetTicket(count);
            double trailingLevel = NormalizeDouble(bidPrice - (Traling_Step * Point()),_Digits);

            if(stopLoss < openPrice) // Нет стоп-лосса - это правда.
              {
               if(bidPrice > openPrice && trailingLevel > openPrice) // Выполняется только один раз для каждой позиции. Устанавливает первый SL.

                  trade.PositionModify(ticket,trailingLevel,takeProfit); // Измените трейлинг-стоп с помощью "CTrade.trade"
              }


            if(bidPrice > openPrice && trailingLevel > stopLoss) // проверьте, что трейлинг-уровень выше предыдущего уровня.
              {
               trade.PositionModify(ticket,trailingLevel,takeProfit); // Измените трейлинг-стоп с помощью "CTrade.trade"
              }

           }
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
           {
            double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
            double stopLoss  = PositionGetDouble(POSITION_SL);
            double takeProfit = PositionGetDouble(POSITION_TP);
            double bidPrice  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
            double askPrice  = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
            ulong ticket = PositionGetTicket(count);
            double trailingLevel = NormalizeDouble(askPrice + (Traling_Step * Point()),_Digits);

            if(stopLoss < openPrice) // Нет стоп-лосса - это правда.
              {
               if(askPrice < openPrice && trailingLevel < openPrice) // Выполняется только один раз для каждой позиции. Устанавливает первый SL.

                  trade.PositionModify(ticket,trailingLevel,takeProfit); // Измените трейлинг-стоп с помощью "CTrade.trade"
              }

            if(askPrice < openPrice && trailingLevel < stopLoss) // проверьте, что трейлинг-уровень выше предыдущего уровня.
              {
               trade.PositionModify(ticket,trailingLevel,takeProfit); // Измените трейлинг-стоп с помощью "CTrade.trade"
              }
           }

        }
     }
  }










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

    ConvertServerTime ConvertServerTime

    Функция для преобразования времени сервера из одного часового пояса брокера в другой.

    Bollinger Bands Squeeze Bollinger Bands Squeeze

    Он сигнализирует о том, что период низкой волатильности на рынке скоро закончится, предвещая значительное движение цены.

    Simple Code for Detect  A  "New Bar or New Candle " Received Simple Code for Detect A "New Bar or New Candle " Received

    Этот блок кода обнаруживает новый бар или новую свечу, когда он получен.

    Logarithmic Moving Average Logarithmic Moving Average

    Логарифмическая скользящая средняя постоянно рассчитывает среднее логарифмическое значение самой высокой и самой низкой цены за период.