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

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

Просмотров:
2572
Рейтинг:
(27)
Опубликован:
2016.12.28 15:20
Обновлен:
2018.02.16 09:45
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Пример для расчёта размера лота c фиксированным уровнем маржи. То есть, если задать 10%, откроется позиция, размер маржи которой составит 10% от свободной маржи.

Входные параметры:

  • StopLoss (in pips) — уровень StopLoss
  • % risk — размер маржи под позицию, в процентах от свободной маржи

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

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

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

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

Шаг первый

      //--- getting lot size for open long position (CMoneyFixedMargin)
      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()-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 класса CMoneyFixedMargin получаем рассчитанный размер лота для позиции Buy с учётом StopLoss:

      double check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),m_symbol.Bid()-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)
           {
            if(m_trade.Buy(chek_volime_lot,NULL,m_symbol.Ask(),
               m_symbol.NormalizePrice(m_symbol.Ask()-ExtStopLoss),
               m_symbol.NormalizePrice(m_symbol.Ask()+ExtStopLoss)))
              {
               if(m_trade.ResultDeal()==0)
                  count--;
              }
            else
               count--;
           }
      else
         Print("CMoneyFixedMargin 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)).

Пример открытия позиции Buy, при 10% риска на свободную маржу:

Money Fixed Margin open.png

Что при этом распечатывалось в журнале:

Money Fixed Margin (EURUSD,M1)  2016.11.28 00:03:24   sl=0.0, CheckOpenLong: 0.28, Balance: 3000.00, Equity: 3000.00, FreeMargin: 3000.00
Money Fixed Margin (EURUSD,M1)  2016.11.28 00:03:24   sl=1.05792, CheckOpenLong: 0.28, Balance: 3000.00, Equity: 3000.00, FreeMargin: 3000.00
Trade   2016.11.28 00:03:31   instant buy 0.28 EURUSD at 1.06076 sl: 1.05792 tp: 1.06292 (1.06042 / 1.06076 / 1.06042)
Trades  2016.11.28 00:03:31   deal #2 buy 0.28 EURUSD at 1.06076 done (based on order #2)
Trade   2016.11.28 00:03:31   deal performed [#2 buy 0.28 EURUSD at 1.06076]
Trade   2016.11.28 00:03:31   order performed buy 0.28 at 1.06076 [#2 buy 0.28 EURUSD at 1.06076]
Money Fixed Margin (EURUSD,M1)  2016.11.28 00:03:31   CTrade::OrderSend: instant buy 0.28 EURUSD at 1.06076 sl: 1.05792 tp: 1.06292 [done at 1.06076]

Обратите внимание, что при расчёте лота в зависимости от риска на свободную маржу, StopLoss не имеет значения.

RSI EA RSI EA

RSI EA - торговля по уровням перекупленности/перепроданности по индикатору iRSI (Relative Strength Index, RSI).

StopAndTake MT5 StopAndTake MT5

При перетаскивании скрипта на график цены изменяется стоп или тейк всех открытых ордеров по данному инструменту.

MA Reverse MA Reverse

Торговля по Moving Average. Проверка на достаточность средств.

e-TurboFx e-TurboFx

Проводится анализ баров на наличие N баров одного типа, идущих подряд.