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

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

Просмотров:
3534
Рейтинг:
(23)
Опубликован:
2016.12.16 12:11
Обновлен:
2018.02.16 08:49
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Пример для расчёта размера лота в зависимости от риска на сделку.

Обновлено: 28 декабря 2016 -> версия 1.001

Что изменилось:

добавлено два варианта вывода (распечатки) рассчитанного лота. Вариант 1 — при указании StopLoss, равного нулю.

      //--- 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));

и  вариант 2 — см. в листинге кода ниже:

      //--- variant #2: StopLoss!=0.0
      sl=m_symbol.Ask()-ExtStopLoss;
      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(m_trade.Buy(chek_volime_lot,NULL,m_symbol.Ask(),m_symbol.Ask()-ExtStopLoss,m_symbol.Ask()+ExtStopLoss))
              {
               if(m_trade.ResultDeal()==0)
                  count--;

              }
            else
               count--;

Проверка первая: если окончание работы метода Buy вернуло "true", но при этом значение, возвращаемое методом ResultDeal() вернуло "0" (такое бывает, например, при реквотах) — счётчик "count" уменьшаем на единицу.

Проверка вторая: если окончание работы метода Buy вернуло "false" — счётчик "count" уменьшаем на единицу.

Для чего уменьшать счётчик "count" на единицу? Для того, чтобы не ждать снова 980 тиков, а попробовать зайти сразу в следующем тике.

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

Задаётся процент риска на сделку (параметр % risk) и Стоп Лосс (параметр StopLoss (in pips)). Так определяются параметры возможной потери депозита.

Входные параметры Money Fixed Risk 

Для симуляции торговли организован такой цикл:

   static long count=-21;
   if(count%980==0) // we pass 980 tics
     {
      //--- getting lot size for open long position (CMoneyFixedRisk)

Начальное значение count=-21 задаётся исключительно для "разогрева" тестера стратегий. Далее рассчитывается остаток от деления переменной count на число 980 (число взято просто с потолка). То есть каждые 980 тиков осуществляется заход в цикл расчёта лота с учётом рисков на сделку.

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

Шаг первый

      //--- 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.Bid()-ExtStopLoss;
      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)).

Пример (для проверки в тестере выберите EURUSD, M1, период тестирования с 2016.11.28, депозит $3000):

Money Fixed Risk.png 

Была открыта позиция Buy (распечатка из Журнала тестера) — рассчитанный размер лота с учётом риска на сделку составил 2.23.

Money Fixed Risk (EURUSD,M1)    2016.11.28 00:03:24   sl=0.0 CheckOpenLong: 0.01, Balance: 3000.00, Equity: 3000.00, FreeMargin: 3000.00
Money Fixed Risk (EURUSD,M1)    2016.11.28 00:03:24   sl=1.05942 CheckOpenLong: 2.23, Balance: 3000.00, Equity: 3000.00, FreeMargin: 3000.00
Trade   2016.11.28 00:03:32   instant buy 2.23 EURUSD at 1.06076 sl: 1.05942 tp: 1.06142 (1.06042 / 1.06076 / 1.06042)
Trades  2016.11.28 00:03:32   deal #2 buy 2.23 EURUSD at 1.06076 done (based on order #2)
Trade   2016.11.28 00:03:32   deal performed [#2 buy 2.23 EURUSD at 1.06076]
Trade   2016.11.28 00:03:32   order performed buy 2.23 at 1.06076 [#2 buy 2.23 EURUSD at 1.06076]
Money Fixed Risk (EURUSD,M1)    2016.11.28 00:03:32   CTrade::OrderSend: instant buy 2.23 EURUSD at 1.06076 sl: 1.05942 tp: 1.06142 [done at 1.06076]
Money Fixed Risk (EURUSD,M1)    2016.11.28 00:48:32   sl=0.0 CheckOpenLong: 0.01, Balance: 3000.00, Equity: 2828.29, FreeMargin: 462.80
Money Fixed Risk (EURUSD,M1)    2016.11.28 00:48:32   sl=1.05899 CheckOpenLong: 2.60, Balance: 3000.00, Equity: 2828.29, FreeMargin: 462.80
Money Fixed Risk (EURUSD,M1)    2016.11.28 00:48:32   CMoneyFixedRisk lot = 2.60, CTrade lot = 0.43
Trade   2016.11.28 00:53:15   stop loss triggered #2 buy 2.23 EURUSD 1.06076 sl: 1.05942 tp: 1.06142 [#3 sell 2.23 EURUSD at 1.05942]
Trades  2016.11.28 00:53:15   deal #3 sell 2.23 EURUSD at 1.05942 done (based on order #3)
Trade   2016.11.28 00:53:15   deal performed [#3 sell 2.23 EURUSD at 1.05942]
Trade   2016.11.28 00:53:15   order performed sell 2.23 at 1.05942 [#3 sell 2.23 EURUSD at 1.05942]

при втором заходе в цикл оказалось, что денег на открытие второй позиции не хватает.

Также обратите внимание, на распечатку рассчитанного лота, когда не указан StopLoss (когда StopLoss=0.0) — если не указывать StopLoss, то рассчитанный лот будет равен минимально возможному лоту.

В итоге позиция была закрыта по стоп-лоссу с убытком 298.82:

Money Fixed Risk history

Это почти соответствует риску 10% от депозита 3000.

Master_MM_Droid Master_MM_Droid

Четыре торговых стратегии в одном советнике.

The Puncher The Puncher

Торговля по индикаторам: iStochastic (Stochastic Oscillator) и iRSI (Relative Strength Index, RSI).

Forex Entry Forex Entry

Используются значения Parabolic SAR и трёх EMA (с периодами 10, 25 и 50).

SendClose SendClose

Советник открывает или закрывает позиции при пересечении линий.