Функция определения количества лотов
Для практической работы трейдеру необходимо иметь возможность регулировать количество
лотов для новых ордеров. Создать для этой цели универсальную функцию затруднительно,
т.к. каждая торговая стратегия предусматривает свой собственный порядок управления
размерами ордеров. Например, некоторые стратегии предполагают возможность работы
только с одним рыночным ордером, другие стратегии позволяют открывать новые рыночные
ордера в условиях, когда какие-то рыночные ордера уже имеются. Известны также стратегии,
основанные на управлении различными отложенными ордерами, в том числе, в некоторых
случаях допускается присутствие в торговле одновременно нескольких отложенных и
рыночных ордеров.
Одним из наиболее распространённых методов расчёта размера открываемых ордеров (для группы
стратегий, допускающих одновременно только один рыночный ордер) является метод
прогрессивного вложения средств. Согласно этому методу залоговая стоимость каждого нового
ордера пропорциональна сумме свободных средств, имеющихся на момент совершения
торговой операции. В случае, если очередной рыночный ордер закрывается с прибылью,
то количество лотов для нового ордера увеличивается, а если с убытком, то уменьшается.
В представленном примере рассматривается пользовательская функция Lot(), позволяющая
устанавливать количество лотов для новых ордеров по одному из двух вариантов:
Вариант 1. Количество лотов для новых ордеров задаётся пользователем вручную.
Вариант 2. Количество лотов вычисляется в зависимости от количества выделенных пользователем
средств. Количество выделенных средств задаётся в виде процента от суммы свободных
средств.
Пользовательская функция Lot()
bool Lot()
Функция рассчитывает количество лотов для новых ордеров. В результате исполнения
функции изменяется значение глобальной переменной Lots_New - количество лотов.
Функция возвращает TRUE, если свободных средств хватает для открытия ордера на
минимальное количество лотов (для финансового инструмента, в окно которого присоединён
эксперт), в противном случае возвращает FALSE.
Функция использует значения глобальных переменных:
- Lots - количество лотов, заданное пользователем;
- Percent - процент от свободных средств, заданный пользователем.
Для вывода сообщений функция предполагает использование информационной функции Inform().
В случае, если функция Inform() не включена в эксперт, сообщения не выводятся.
Функция определения количества лотов Lot() оформлена в виде включаемого файла Lot.mqh:
bool Lot()
{
string Symb =Symbol();
double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);
double Min_Lot=MarketInfo(Symb,MODE_MINLOT);
double Step =MarketInfo(Symb,MODE_LOTSTEP);
double Free =AccountFreeMargin();
if (Lots>0)
{
double Money=Lots*One_Lot;
if(Money<=AccountFreeMargin())
Lots_New=Lots;
else
Lots_New=MathFloor(Free/One_Lot/Step)*Step;
}
else
{
if (Percent > 100)
Percent=100;
if (Percent==0)
Lots_New=Min_Lot;
else
Lots_New=MathFloor(Free*Percent/100/One_Lot/Step)*Step;
}
if (Lots_New < Min_Lot)
Lots_New=Min_Lot;
if (Lots_New*One_Lot > AccountFreeMargin())
{
Inform(11,0,Min_Lot);
return(false);
}
return(true);
}
Функция имеет простой код. В блоке 1-2 описаны глобальные переменные и возвращаемые
значения. В блоке 2-3 вычислены значения некоторых переменных. Для расчёта принят
следующий приоритет устанавливаемых значений: если пользователь задал ненулевое
количество лотов, то значение процента от свободных средств не принимается во внимание.
Внешние переменные Lots и Percent объявлены во включаемом файле Variables.mqh.
В блоке 3-4 выполняется расчёт для варианта, когда пользователем задано ненулевое
значение количества лотов во внешней переменной Lots. В этом случае производится
проверка. Если свободных средств хватает для того, чтобы открыть рыночный ордер
с указанным количеством лотов, то установленное пользователем значение присваивается
глобальной переменной Lots_New и используется в дальнейших расчётах. Если свободных
средств не хватает, то высчитывается максимально достижимое количество лотов, которое
и используется в дальнейшем (см. Математические функции).
Управление передаётся в блок 4-5 в случае, если пользователь установил нулевое количество
лотов. При этом принимается во внимание процент свободных средств, указанный пользователем
во внешней переменной Percent. Выполняется проверка: если указанное значение больше
ста (процентов), то в расчётах используется значение 100. Если пользователь указал
нулевое значение переменной Percent, то количество лотов приравнивается минимально
возможному значению, установленному в дилинговом центре. Для всех промежуточных
величин высчитывается количество лотов, соответствующее количеству выделенных пользователем
средств.
В блоке 5-6 выполняется необходимая проверка. Если вычисленное количество лотов
оказывается меньше, чем минимально допустимое (например, нулевое значение может
быть получено в блоке 4-5, если пользователь указал малое значение переменной Percent),
то переменной Lots_New присваивается минимальное значение. Далее проверяется, достаточно
ли свободных средств для открытия ордера в объёме ранее вычисленного количества
лотов (на счёте может быть недостаточно средств). Если имеющихся средств не хватает,
то после сообщения пользователю о недостатке средств осуществляется выход из функции,
при этом функция возвращает значение false. Если же проверка прошла успешно, то
возвращается значение true.