Русский

Учебник по MQL4  Создание обычной программы  Функция определения количества лотов


Функция определения количества лотов


Для практической работы трейдеру необходимо иметь возможность регулировать количество лотов для новых ордеров. Создать для этой цели универсальную функцию затруднительно, т.к. каждая торговая стратегия предусматривает свой собственный порядок управления размерами ордеров. Например, некоторые стратегии предполагают возможность работы только с одним рыночным ордером, другие стратегии позволяют открывать новые рыночные ордера в условиях, когда какие-то рыночные ордера уже имеются. Известны также стратегии, основанные на управлении различными отложенными ордерами, в том числе, в некоторых случаях допускается присутствие в торговле одновременно нескольких отложенных и рыночных ордеров.

Одним из наиболее распространённых методов расчёта размера открываемых ордеров (для группы стратегий, допускающих одновременно только один рыночный ордер) является метод прогрессивного вложения средств. Согласно этому методу залоговая стоимость каждого нового ордера пропорциональна сумме свободных средств, имеющихся на момент совершения торговой операции. В случае, если очередной рыночный ордер закрывается с прибылью, то количество лотов для нового ордера увеличивается, а если с убытком, то уменьшается.

В представленном примере рассматривается пользовательская функция Lot(), позволяющая устанавливать количество лотов для новых ордеров по одному из двух вариантов:

Вариант 1. Количество лотов для новых ордеров задаётся пользователем вручную.

Вариант 2. Количество лотов вычисляется в зависимости от количества выделенных пользователем средств. Количество выделенных средств задаётся в виде процента от суммы свободных средств.

Пользовательская функция Lot()

bool Lot()

Функция рассчитывает количество лотов для новых ордеров. В результате исполнения функции изменяется значение глобальной переменной Lots_New - количество лотов. Функция возвращает TRUE, если свободных средств хватает для открытия ордера на минимальное количество лотов (для финансового инструмента, в окно которого присоединён эксперт), в противном случае возвращает FALSE.

Функция использует значения глобальных переменных:

  • Lots - количество лотов, заданное пользователем;
  • Percent - процент от свободных средств, заданный пользователем.

Для вывода сообщений функция предполагает использование информационной функции Inform(). В случае, если функция Inform() не включена в эксперт, сообщения не выводятся.

Функция определения количества лотов Lot() оформлена в виде включаемого файла Lot.mqh:

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

Функция имеет простой код. В блоке 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.