Расчет объема позиции для интрадей торговли в.1

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Расчет объема позиции для интрадей торговли в.1

Сообщение Haos » 14 фев 2018, 18:38

В данной статье рассматривается следующий алгоритм управления риском (соотношение размера депозита и объема открываемой позиции):
Депозит: 100 - 200 у.е. - 0,01 лот
Депозит: 200 - 300 у.е. - 0,02 лот
...
Депозит: 1000 - 1100 у.е. - 0,10 лот
Депозит: 1100 - 1200 у.е. - 0,11 лот
...
Депозит: 2000 - 2100 у.е. - 0,20 лот
...
(до 100 000 у.е.)
Таким образом размер лота увеличивается на каждые 100 у.е. роста баланса депозита. Это можно было бы реализовать одним предложением в коде, если бы не было заморочек с правильным округлением при расчете размера лота. Чтобы его избежать можно пойти другим путем:
1. Вначале отбрасывается дробная часть баланса.
2. Далее баланс переводится в строку и анализируется сама эта строка на предмет кол-ва символов в ней, потом извлекаются первые символы в зависимости от длины строки и формируется размер лота.
Поскольку данный вид соотношения размера депозита и объему открываемой позиции я реализовывал для ТС "Снайпер", то функция получила соответствующее название - f_GetLotSniper():
Код: выделить все
double f_GetLotSniper()
{
// Возвращает размер лота для торговли по системе Снайпер
// Проверено, работает верно
   double dblLotMin  = MarketInfo(Symbol(), MODE_MINLOT);
   double dblQ = dblLotMin;
   double dblBalance = MathFloor(AccountBalance());
   if(dblBalance <= 100) return(dblQ);
   
   string str1 = "", str2 = "", strQ = "";   
   string strBalance = DoubleToStr(dblBalance, 0);
   int    intLenth   = StringLen(strBalance);
 
   if(intLenth == 3) // депозит до 1000 у.е.
   {
      str1 = StringSubstr(strBalance, 0, 1);
      strQ = "0.0" + str1;
      dblQ = StringToDouble(strQ);
   }
   else if(intLenth == 4) // депозит от 1000 до 9999 у.е.
   {
      str1 = StringSubstr(strBalance, 0, 2);
      strQ = "0." + str1;
      dblQ = StringToDouble(strQ);     
   }
   else if(intLenth == 5) // депозит от 10 000 до 99 999 у.е.
   {
      str1 = StringSubstr(strBalance, 0, 1);
      str2 = StringSubstr(strBalance, 1, 2);
      strQ = str1 + "." + str2;
      dblQ = StringToDouble(strQ);     
   }
     
return(dblQ);   
}
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Расчет объема позиции для интрадей торговли в.1

Сообщение Haos » 14 фев 2018, 18:42

Пример скриптов, в которых использован данный алгоритм можно посмотреть в теме Скрипты для открытия позиции и частичном закрытии при профите
Также следует отметить еще один непосредственный плюс данного подхода: размер лота формируется непосредственно через четкие соотношения без "игры цифр" в виде округлений, где и скрываются множество ошибок в алгоритмах, а это, несомненно, играет решающую роль при работе с реальными деньгами, где критично важно, чтобы каждая сделка была открыта четко по всем заданным параметрам, а не с возможными сюрпризами.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.


Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 64

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron