Депозит: 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);
}