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

Fixed Loss - эксперт для MetaTrader 5

Просмотров:
1385
Рейтинг:
(10)
Опубликован:
2020.03.09 17:52
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Как это работает

    Есть такая ситуация: мы знаем какой тип позиции (параметр 'Position Type') хотим открыть, мы знаем какой уровень убытка в Points задан (параметр 'Stop Loss, in points') и главное - мы знаем сколько можем позволить себе потерять на сделке в деньгах (параметр 'Loss, in money').

    Fixed Loss

    Советник создан для демонстрации работы этого принципа: если в рынке нет позиций, начинаем расчёт.

    Сам цикл расчёта лота в зависимости от риска на сделку (расчёт для позиции Buy):

    Шаг первый

    пересчитываем процент риска - в зависимости от текущего Баланса и допустимой потерей в деньгах (переменная balance)

          double balance=m_account.Balance();
          /*
          balance  -  100%
          InpLoss  -  x%
          x = InpLoss * 100.0 / balance
          */
          m_money.Percent(InpLoss*100.0/balance);
          //--- getting lot size for open long position (CMoneyFixedRisk)
          double sl=0.0;
          double check_open_long_lot=0.0;
          //--- variant #1: StopLoss=0.0
          sl=0.0;
          check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);
          Print("sl=0.0",
                ", CheckOpenLong: ",DoubleToString(check_open_long_lot,2),
                ", Balance: ",    DoubleToString(m_account.Balance(),2),
                ", Equity: ",     DoubleToString(m_account.Equity(),2),
                ", FreeMargin: ", DoubleToString(m_account.FreeMargin(),2));
          //--- variant #2: StopLoss!=0.0
          sl=m_symbol.Ask()-m_stop_loss;
          check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);
          Print("sl=",DoubleToString(sl,m_symbol.Digits()),
                ", CheckOpenLong: ",DoubleToString(check_open_long_lot,2),
                ", Balance: ",    DoubleToString(m_account.Balance(),2),
                ", Equity: ",     DoubleToString(m_account.Equity(),2),
                ", FreeMargin: ", DoubleToString(m_account.FreeMargin(),2));
          if(check_open_long_lot==0.0)
             return;

    в переменную check_open_long_lot при помощи метода CheckOpenLong класса CMoneyFixedRisk получаем рассчитанный размер лота для позиции Buy с учётом StopLoss:

          double check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),m_symbol.Ask()-ExtStopLoss);

    В журнал экспертов печатаются такие параметры: StopLoss, рассчитанный размер лота в зависимости от риска на сделку, баланс торгового счёта на момент расчёта, размер собственных средств на счете на момент расчёта, размер зарезервированных залоговых средств на момент расчёта.

    Если расчёт вернул значение "0.0" - выходим:

          if(check_open_long_lot==0.0)
             return;

    Шаг второй

    В переменную chek_volime_lot при помощи метода CheckVolume класса CTrade получаем размер лота для позиции Buy, на который у нас хватит средств. Здесь мы передаём такие параметры: m_symbol.Name() — имя символа, check_open_long_lot — объём позиции, которую мы хотим открыть (а этот параметр мы уже рассчитали ранее): 

          //--- check volume before OrderSend to avoid "not enough money" error (CTrade)
          double chek_volime_lot=m_trade.CheckVolume(m_symbol.Name(),check_open_long_lot,m_symbol.Ask(),ORDER_TYPE_BUY);

    Шаг третий

    Если метод CheckVolume вернул не "0.0", значит проверяем условие: у нас хватает средств на открытие позиции рассчитанного лота с учётом риска.

          if(chek_volime_lot!=0.0)
             if(chek_volime_lot>=check_open_long_lot)
                m_trade.Buy(chek_volime_lot,NULL,m_symbol.Ask(),m_symbol.Ask()-ExtStopLoss,m_symbol.Ask()+ExtStopLoss);
          else
             Print("CMoneyFixedRisk lot = ",DoubleToString(check_open_long_lot,2),
                   ", CTrade lot = ",DoubleToString(chek_volime_lot,2));

    Если средств хватает, то открываем позиции, если не хватает — то в журнал экспертов печатаются рассчитанный размер лота с учётом риска на сделку (DoubleToString(check_open_long_lot,2)) и размер лота, на который хватает средств (DoubleToString(chek_volime_lot,2)).


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

      Adding funds and martingale Adding funds and martingale

      Стратегия на индикаторе iBands (Bollinger Bands, Bands) и пользовательском индикаторе Silence. Используется мартингейл

      iRVI Time Control iRVI Time Control

      Индикатор на базе iRVI (Relative Vigor Index, RVI) в котором можно настраивать в какой временной период скрывать значения

      Intersection 2 iMA Choosing Strategies Intersection 2 iMA Choosing Strategies

      Торговля на пересечении двух iMA (Moving Average, MA). Выбор из нескольких стратегий для открытия

      Библиотека для работы с COM-объектами. Библиотека для работы с COM-объектами.

      Эта библиотека даёт возможность работать с COM-объектами, предоставленными некоторыми приложениями. Например: Excel, Word, Mathcad, Matlab. А также объект ADODB для работы с базами данных через драйвер ODBC. Библиотека работает и в MT4 и в MT5.