Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 3826
- Рейтинг:
- Опубликован:
- 2016.12.16 12:11
- Обновлен:
- 2018.02.16 08:49
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Пример для расчёта размера лота в зависимости от риска на сделку.
Обновлено: 28 декабря 2016 -> версия 1.001
Что изменилось:
добавлено два варианта вывода (распечатки) рассчитанного лота. Вариант 1 — при указании StopLoss, равного нулю.
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 — см. в листинге кода ниже:
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.ResultDeal()==0)
count--;
}
else
count--;
Проверка первая: если окончание работы метода Buy вернуло "true", но при этом значение, возвращаемое методом ResultDeal() вернуло "0" (такое бывает, например, при реквотах) — счётчик "count" уменьшаем на единицу.
Проверка вторая: если окончание работы метода Buy вернуло "false" — счётчик "count" уменьшаем на единицу.
Для чего уменьшать счётчик "count" на единицу? Для того, чтобы не ждать снова 980 тиков, а попробовать зайти сразу в следующем тике.
Как это работает:
Задаётся процент риска на сделку (параметр % risk) и Стоп Лосс (параметр StopLoss (in pips)). Так определяются параметры возможной потери депозита.
Для симуляции торговли организован такой цикл:
if(count%980==0) // we pass 980 tics
{
//--- getting lot size for open long position (CMoneyFixedRisk)
Начальное значение count=-21 задаётся исключительно для "разогрева" тестера стратегий. Далее рассчитывается остаток от деления переменной count на число 980 (число взято просто с потолка). То есть каждые 980 тиков осуществляется заход в цикл расчёта лота с учётом рисков на сделку.
Сам цикл расчёта лота в зависимости от риска на сделку (расчёт для позиции Buy):
Шаг первый
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:
В журнал экспертов печатаются такие параметры: StopLoss, рассчитанный размер лота в зависимости от риска на сделку, баланс торгового счёта на момент расчёта, размер собственных средств на счете на момент расчёта, размер зарезервированных залоговых средств на момент расчёта.
Если расчёт вернул значение "0.0" - выходим:
return;
Шаг второй
В переменную chek_volime_lot при помощи метода CheckVolume класса CTrade получаем размер лота для позиции Buy, на который у нас хватит средств. Здесь мы передаём такие параметры: m_symbol.Name() — имя символа, check_open_long_lot — объём позиции, которую мы хотим открыть (а этот параметр мы уже рассчитали ранее):
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>=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):
Была открыта позиция Buy (распечатка из Журнала тестера) — рассчитанный размер лота с учётом риска на сделку составил 2.23.
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:
Это почти соответствует риску 10% от депозита 3000.

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

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

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

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