Рассчитываем размер позиции с помощью MQL4

Основой торговли на форекс является грамотное управление рисками. Управление рисками включает в себя набор правил, которые обеспечивают безопасность вашего торгового счета от убыточных сделок и непредвиденных событий на рынке.

Например, если размер вашей позиции составляет 25% от вашего счета, после 4 убыточных сделок, вы все потеряете. Если бы вы использовали только 2,5% размер позиции, после 4 убыточных сделок у вас все равно бы осталось больше, чем 90% от баланса вашего депозита.

Давайте рассмотрим, как можно рассчитывать размер позиции с помощью MQL4.

Как рассчитывается размер позиции?

Предположим, что вы хотите рисковать только 1% от вашего депозита в каждой сделке. При этом ваш торговый счет составляет 10 000$. Это означает, что ваш риск для каждой сделки будет равен 100$:

10 000$ * 1% = 100$

Для текущей сделки ваш стоп-лосса размещается на расстоянии 20 пунктов от цены открытия. Если это сделка по EURUSD, каждый пункт для стандартного размера лота составит 10$. Это означает, что 20 пунктов составят 200$:

20 пунктов * 10$ = 200$

Так как вы хотите рисковать 100$ и иметь стоп-лосс равным 20 пунктам, размер вашей позиции составит 0,5 стандартных лота:

100$ / 20 * 10$ = 0.5

Получается, что для расчета размера позиции вам нужно:

  • Баланс вашего счета.
  • Процент риска для одной сделки.
  • Размер стоп-лосса в пунктах.
  • Стоимость пункта.

Как рассчитать размер позиции в MQL4?

MQL4 имеет следующие встроенные функции, которые помогут нам легко рассчитать размер позиции:

  • AccountBalance() возвращает доступный баланс для нашей учетной записи.
  • MarketInfo(Symbol(), MODE_TICKVALUE) возвращает значение тика для текущего инструмента.

Также нам нужно учитывать количество десятичных знаков в обменном курсе валюты для четерыхзначных и пятизначных котировок.

#property strict
 
//Размер риска и размер стоп-лосса.
extern double MaxRiskPerTrade=1; //Процент риска.
extern int StopLoss=20; //Размер стоп-лосса.
 
//Определяем функцию для расчета размера позиции и возврата размера лота.
double CalculateLotSize(double SL){
   double LotSize=0;
   double nTickValue=MarketInfo(Symbol(),MODE_TICKVALUE);
   if(Digits==3 || Digits==5){
      nTickValue=nTickValue*10;
   }
   //Применяем формулу для расчета размера позиции и присваиваем значение переменной
   LotSize=(AccountBalance()*MaxRiskPerTrade/100)/(SL*nTickValue);
   return LotSize;
}
 
int OnInit()
{
   return(INIT_SUCCEEDED);
}
 
void OnDeinit(const int reason)
{
 
}
 
void OnTick()
{
   //Выводим размер позиции в лотах.
   Alert("Размер позиции в лотах: ",CalculateLotSize(StopLoss));
}

Результатом работы советника для депозита в размере 4 417.96$ будет:

размер позиции для MQL4

Как мы видим, размер позиции составляет 0.220898. Это может создать проблему при отправке ордеров, поскольку MetaTrader может принимать только ордера, округленные до минимального размера добавочного лота. Другими словами, вы можете отправить ордер на 1 лот, но ордер на 1,00005 лотов не будет принят.

Мы можем узнать, каков минимальный размер лота с помощью функции MarketInfo(Symbol(), MODE_LOTSTEP). Обычно это значение равно 0,01. Используя эту функцию и некоторые другие математические функции, мы можем округлить полученным нами число:

LotSize=MathRound(LotSize/MarketInfo(Symbol(),MODE_LOTSTEP))*MarketInfo(Symbol(),MODE_LOTSTEP);

0.220898/0.01 = 22.0898 — округляем — 22 — 22 * 0.22 лота

Вот как теперь будет выглядеть наш код целиком:

#property strict
 
//Размер риска и размер стоп-лосса.
extern double MaxRiskPerTrade=1; //Процент риска.
extern int StopLoss=20; //Размер стоп-лосса.
 
//Определяем функцию для расчета размера позиции и возврата размера лота.
double CalculateLotSize(double SL){
   double LotSize=0;
   double nTickValue=MarketInfo(Symbol(),MODE_TICKVALUE);
   if(Digits==3 || Digits==5){
      nTickValue=nTickValue*10;
   }
   //Применяем формулу для расчета размера позиции и присваиваем значение переменной
   LotSize=(AccountBalance()*MaxRiskPerTrade/100)/(SL*nTickValue);
   LotSize=MathRound(LotSize/MarketInfo(Symbol(),MODE_LOTSTEP))*MarketInfo(Symbol(),MODE_LOTSTEP);
   return LotSize;
}
 
int OnInit()
{
   return(INIT_SUCCEEDED);
}
 
void OnDeinit(const int reason)
{
 
}
 
void OnTick()
{
   //Выводим размер позиции в лотах.
   Alert("Размер позиции в лотах: ",CalculateLotSize(StopLoss));
}

Результат будет следующим:

размер позиции в MQL4 после округления

Эта функция очень удобна, так как только с двумя параметрами можно рассчитать размер позиции, соответствующий вашей стратегии управления рисками.

В приведенном выше примере стоп-лосс был установлен фиксированным, однако в некоторых стратегиях стоп-лосс может быть переменным, и в этом случае эта функция все еще будет работать, так как рассчитанный размер лота также зависит от стоп-лосса. Кроме того, эта функция подходит для всех торговых инструментов, поскольку значение тика известно MetaTrader с учетом валюты вашего счета и торгового инструмента, к которому вы применяете данную функцию.

Комментарии (6)
  1. Добрый день
    Непонятно откуда берется переменная SL ?

    1. Передается в функцию при вызове))

      1. SL нигде не определен. Какое значение передается ? Может ли случиться что передастся НОЛЬ и тогда будет ошибка функции. Т.к. на ноль делить нельзя

  2. SL нигде не определен. Какое значение передается ? Может ли случиться что передастся НОЛЬ и тогда будет ошибка функции. Т.к. на ноль делить нельзя

  3. Как в расчете лота при плавающем стопе учесть комиссию брокера?