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

Simple Trailing 2 - эксперт для MetaTrader 5

Просмотров:
2447
Рейтинг:
(12)
Опубликован:
2019.12.09 07:34
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Описание трейлинга

Главное: трейлинг начинает работать ТОЛЬКО ДЛЯ ПРИБЫЛЬНЫХ ПОЗИЦИЙ!

Параметры:

Trailing, in seconds
пауза между очередной проверкой на возможность трейлинга, в секундах; при установке значения менее 10 - трейлинг будет проводится только на новом баре
Trailing Stop
минимальное итоговое расстояние от текущей цены до StopLoss, в pips (1.00045-1.00055=1 pips)
Trailing Step
шаг трейлинга, в pips (1.00045-1.00055=1 pips)
Deviation 
допустимое максимальное проскальзывание, in points (1.00045-1.00055=10 points)
Print log
вывод подробного логирования

Принцип работы:

Для сокращения кода и большей наглядности используются следующие торговые классы из Стандартной библиотеки:   CPositionInfo (Класс для работы со свойствами открытой позиции),   CTrade (Класс для совершения торговых операций) и CSymbolInfo (Класс для работы со свойствами торгового инструмента).

Соответственно для работы в "шапке" программы объявляются объекты этих классов

#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
//---
CPositionInfo  m_position;                   // object of CPositionInfo class
CTrade         m_trade;                      // object of CTrade class
CSymbolInfo    m_symbol;                     // object of CSymbolInfo class
//--- input parameters


Также в "шапке" объявляются служебные переменные - для хранения значений трейлинга пересчитанного в double, а также для хранения времени последнего трейлинга и времени бара

double   m_trailing_stop         = 0.0;      // Trailing Stop           -> double
double   m_trailing_step         = 0.0;      // Trailing Step           -> double

double   m_adjusted_point;                   // point value adjusted for 3 or 5 points
datetime m_last_trailing         = 0;        // "0" -> D'1970.01.01 00:00';
datetime m_prev_bars             = 0;        // "0" -> D'1970.01.01 00:00';


Переходим в OnInit

Первым делом исключаем возможную ошибку во входных параметрах - когда трейлинг включён ("Trailing Stop" больше нуля), а шаг трейлинга ("Trailing Step") равен нулю:

   if(InpTrailingStop!=0 && InpTrailingStep==0)
     {
      string err_text=(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")?
                      "Трейлинг невозможен: параметр \"Trailing Step\" равен нулю!":
                      "Trailing is not possible: parameter \"Trailing Step\" is zero!";
      //--- when testing, we will only output to the log about incorrect input parameters
      if(MQLInfoInteger(MQL_TESTER))
        {
         Print(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);
         return(INIT_FAILED);
        }
      else // if the Expert Advisor is run on the chart, tell the user about the error
        {
         Alert(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);
         return(INIT_PARAMETERS_INCORRECT);
        }
     }


Инициализируем объект m_symbol и сразу обновляем все параметры и цены по символу

   if(!m_symbol.Name(Symbol())) // sets symbol name
     {
      Print(__FILE__," ",__FUNCTION__,", ERROR: CSymbolInfo.Name");
      return(INIT_FAILED);
     }
   RefreshRates();


Инициализируем объект m_trade

   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(m_symbol.Name());
   m_trade.SetDeviationInPoints(InpDeviation);


Проводим настройки в зависимости от количества знаков символа

//--- tuning for 3 or 5 digits
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;

   m_trailing_stop         = InpTrailingStop          * m_adjusted_point;
   m_trailing_step         = InpTrailingStep          * m_adjusted_point;


Переходим к OnTick

Сначала проверяется ситуация когда пауза между трейлингом равна или больше 10 секунд

   if(InpTrailingFrequency>=10) // trailing no more than once every 10 seconds
     {
      datetime time_current=TimeCurrent();
      if(time_current-m_last_trailing>10)
        {
         double level;
         if(FreezeStopsLevels(level))
            Trailing(level);
         else
            return;
         m_last_trailing=time_current;
        }
     }


если пауза задана менее 10 секунд - значит трейлинг работает только на новом баре:

//--- we work only at the time of the birth of new bar
   datetime time_0=iTime(m_symbol.Name(),Period(),0);
   if(time_0==m_prev_bars)
      return;
   m_prev_bars=time_0;
   if(InpTrailingFrequency<10) // trailing only at the time of the birth of new bar
     {
      double level;
      if(FreezeStopsLevels(level))
         Trailing(level);
     }

В обоих случаях объявляется переменная level в которую записывается результат выполнения функции FreezeStopsLevels.


Функция FreezeStopsLevels проверяет три параметра: дистанцию заморозки торговых операций (метод FreezeLevel), минимальный отступ для ордеров (метод StopsLevel) и текущий спред (спред вычисляется как разница между ценой Ask и Bid). В конечном итоге выбирается максимальное значение из трёх параметров и (для подстраховки) умножается на 3.0.

//+------------------------------------------------------------------+
//| Check Freeze and Stops levels                                    |
//+------------------------------------------------------------------+
bool FreezeStopsLevels(double &level)
  {
//--- check Freeze and Stops levels
   /*
      Type of order/position  |  Activation price  |  Check
      ------------------------|--------------------|--------------------------------------------
      Buy Limit order         |  Ask               |  Ask-OpenPrice  >= SYMBOL_TRADE_FREEZE_LEVEL
      Buy Stop order          |  Ask               |  OpenPrice-Ask  >= SYMBOL_TRADE_FREEZE_LEVEL
      Sell Limit order        |  Bid               |  OpenPrice-Bid  >= SYMBOL_TRADE_FREEZE_LEVEL
      Sell Stop order         |  Bid               |  Bid-OpenPrice  >= SYMBOL_TRADE_FREEZE_LEVEL
      Buy position            |  Bid               |  TakeProfit-Bid >= SYMBOL_TRADE_FREEZE_LEVEL
                              |                    |  Bid-StopLoss   >= SYMBOL_TRADE_FREEZE_LEVEL
      Sell position           |  Ask               |  Ask-TakeProfit >= SYMBOL_TRADE_FREEZE_LEVEL
                              |                    |  StopLoss-Ask   >= SYMBOL_TRADE_FREEZE_LEVEL

      Buying is done at the Ask price                 |  Selling is done at the Bid price
      ------------------------------------------------|----------------------------------
      TakeProfit        >= Bid                        |  TakeProfit        <= Ask
      StopLoss          <= Bid                        |  StopLoss          >= Ask
      TakeProfit - Bid  >= SYMBOL_TRADE_STOPS_LEVEL   |  Ask - TakeProfit  >= SYMBOL_TRADE_STOPS_LEVEL
      Bid - StopLoss    >= SYMBOL_TRADE_STOPS_LEVEL   |  StopLoss - Ask    >= SYMBOL_TRADE_STOPS_LEVEL
   */
   if(!RefreshRates() || !m_symbol.Refresh())
      return(false);
//--- FreezeLevel -> for pending order and modification
   double freeze_level=m_symbol.FreezeLevel()*m_symbol.Point();
   if(freeze_level==0.0)
      freeze_level=(m_symbol.Ask()-m_symbol.Bid())*3.0;
//--- StopsLevel -> for TakeProfit and StopLoss
   double stop_level=m_symbol.StopsLevel()*m_symbol.Point();
   if(stop_level==0.0)
      stop_level=(m_symbol.Ask()-m_symbol.Bid())*3.0;

   if(freeze_level<=0.0 || stop_level<=0.0)
      return(false);

   level=(freeze_level>stop_level)?freeze_level:stop_level;

   double spread=m_symbol.Spread()*m_symbol.Point()*3.0;
   level=(level>spread)?level:spread;
//---
   return(true);
  }


Главная функция - Trailing

Для работы с позицией, эту позицию сначала нужно выбрать. Чтобы выбрать позицию нужно обойти все позиции

   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         if(m_position.Symbol()==m_symbol.Name())


S-v1 S-v1

Торговая панель, с возможностью использования в тестере.

Bollinger Band Two MA and Zig-Zag 2 Bollinger Band Two MA and Zig-Zag 2

Модификация первой версии "Bollinger Band Two MA and Zig-Zag"

Trailing Equity Money Trailing Equity Money

Трейлинг по Equity. Расчёты в деньгах депозита (не в процентах!). Работа с глобальными переменными терминала

Currency v1.0 Currency v1.0

Скрипт формирует массив всех возможный торговых пар из 182 сочетаний валют