Язык MQL — Урок 3 «расчет лота»

На прошлом уроке «Язык MQL — Урок 2» мы научили наш первый скрипт MT4 — «test«, написанный на языке MQL4 рассчитывать размер лота, а точнее запрашивать у нас размер средств которыми мы хотим рискнуть при торговле на форекс при помощи терминала Metatrader 4. В данном уроке я предлагаю заняться самим расчетом данного лота !

Для расчета желаемого лота, скрипту MT4 необходимо знать «какими средствами мы располагаем» на нашем депозите форекс. Можно конечно в ручную ему это сообщать (как мы сделали с риском), но зачем делать лишнюю работу, если в нашем распоряжении язык MQL4? Пусть наш скрипт «test» сам берет эту цифру из торгового терминала Metatrader 4 !

Для этих целей (для определения размера средств в MT4)  в языке MQL4 предназначена функция — AccountFreeMargin()

Все вычислительные операции в советниках или скриптах MQL необходимо делать в функции start.

Поэтому добавим в эту функцию строчку:
double Free=AccountFreeMargin();

теперь в переменной типа double (число с плавающей точкой) и именем Free у нас будет содержаться размер свободных средств.

Еще нам необходимо знать стоимость одного лота по заданной валютной паре — для этого воспользуемся функцией MarketInfo(string symbol, int type).

Эта функция возвращает различную информацию в зависимости от переданных ей параметров. Первым идет строковый параметр для указания валюты. Можно указать напрямую (например: «EURUSD»), но мы хотим универсальности от нашего скрипта, написанного на MQL (что бы скрипт сам определял валютную пару на графике, котором он запущен).

Воспользуемся функцией Symbol() котороя вернет нам название текущей валюты.

Второй параметр функции MarketInfo используем: MODE_MARGINREQUIRED (Размер свободных средств, необходимых для открытия 1 лота)

Теперь соберем все вместе и получим:
double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
Итак, переменная One_Lot будет содержать стоимость одного лота по текущей валюте.
С помощью простейших математических операций рассчитаем НАШ лот:
double Lot= Free*MaxRisk/100/One_Lot;
Free — свободные средства
MaxRisk/100 — процент(наш параметр MaxRisk надо перевести в %. Для этого его делим на 100)
One_Lot — стоимость одного лота

Пример расчета лота для EURUSD (курс для примера возьмем 1.4615):
у нас есть Free=1000$ (свободные средства)
MaxRisk= 2
2% от 1000$ это 1000*2/100=20$

стандартный размер контракта (1 лот) = 100000
при покупке 100000 EUR мы должны заплатить 100000*1.4615=146150$
но у нас есть плечо (возьмем для примера 500), соответственно мы заплатим One_Lot=146150/500=292.3$ (все эти вычисления делает MarketInfo(Symbol(),MODE_MARGINREQUIRED))

Наш лот получится: Lot=20/292.3= 0,0684

Хорошо! Оптимальный лот для открытия торговой позиции в Metatrader 4  мы рассчитали.

А как же его теперь увидеть на экране монитора?
Для этого воспользуемся функцией Alert(), в качестве параметра укажем НАШ рассчитанный лот.

//+——————————————————————+
//| test.mq4 |
//| Copyright © 2009, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+——————————————————————+

#property copyright «Copyright © 2009, MetaQuotes Software Corp.»
#property link «http://www.metaquotes.net»
#property show_inputs
extern int MaxRisk=2;
//+——————————————————————+
//| script program start function |
//+——————————————————————+

int start()
{
//—-
double Free =AccountFreeMargin();
double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double Lot =Free*MaxRisk/100/One_Lot;
Alert(Lot);
//—-
return(0);
}
//+——————————————————————+

Ну и теперь компилируем и запускаем наш экспериментальный скрипт МТ4 — «test« (это мы уже делать умеем из прошлого урока MQL — 2).

В итоге мы получим следующее сообщение в терминале MT4:

Вывод сигналов на экран в Metatrader 4

В следующем уроке по изучению языка MQL, мы продолжим улучшать наш скрипт для Metatrader 4 и наполнять его полезными функциями.

Похожие статьи:

39 комментариев

  1. Подписался на вашу рассылку, очень полезный сайт, давно хотел научиться писать советники для Metatrader 4 !

  2. Очень приятно что мой труд не пропадает даром. Это придает уверенности и подстегивает на продолжение.

  3. Редактор mql5:
    ‘AccountFreeMargin’ — function is not defined;
    ‘MODE_MARGINREQUIRED’ — undeclared identifier;
    ‘MarketInfo’ — function is not defined.

  4. вместо AccountFreeMargin() используется: AccountInfoDouble(ACCOUNT_FREEMARGIN)
    MarketInfo() — в MT5 не существует. И аналога парметру MODE_MARGINREQUIRED в MT5 нет. Буду думать над расчетом лота в MT5.

  5. Редактор mql5.
    Вместо использования MarketInfo() и MODE_MARGINREQUIRED предлагаю сделать вот так (на случай покупки):

    double BestBid=SymbolInfoDouble(Symbol(), SYMBOL_BID);
    long Leverage=AccountInfoInteger(ACCOUNT_LEVERAGE);
    double One_Lot= 100000*BestBid/Leverage;
    Alert(One_Lot);

  6. Этот расчет не совсем верен. Точнее он верен только для валютных пар: второй валютой в которых является валюта депозита. Дело в том, что залог рассчитывается в валюте депозита и для покупки например GBPJPY необходимо сначала за валюту депозита купить JPY, а затем уже за JPY покупать GBP. Вот этим и занималась функция MarketInfo(Symbol(),MODE_MARGINREQUIRED); Для проверки я написал скрипт на MQL4: NewLot
    Результаты работы скрипта:
    Результаты расчета лота
    формат вывода: Валюта:лот1:лот2:лот3:лот4
    лот1 — рассчитан по мной предложенному алгориму
    лот2 — рассчитан на покупку (цикл использующий AccountFreeMarginCheck)
    лот3 — рассчитан на продажу(цикл использующий AccountFreeMarginCheck)
    лот4 — рассчитан по Вашему алгоритму
    Раз разработчики убрали функцию MarketInfo(Symbol(),MODE_MARGINREQUIRED);
    остается рассчитывать лот используя цикл по AccountFreeMarginCheck (возвращает размер свободных средств, которые останутся после открытия указанной позиции по текущей цене на текущем счете).

  7. ОК. Справочник по mql5 описывает функцию AccountFreeMarginCheck следующим образом:

    double AccountFreeMarginCheck(
    string symbol, // имя символа
    int trade_operation, // тип операции
    double volume // объем
    );

    Вопрос: где найти описание типов торговых операций (trade_operation), используемых этой функцией? Раздел «Типы торговых операций» из справочника по mql5 описывает торговые операции только для функции OrderSend().

  8. Похоже на опечатку. В описании функции: «Возвращает размер свободных средств, которые останутся после открытия указанной позиции по текущей цене на текущем счете.» речь идет о позиции. Поэтому логично предположить, что использовать надо «Тип позиции», а не «Тип операции».
    Типы позиции:
    POSITION_TYPE_BUY — Покупка
    POSITION_TYPE_SELL — Продажа

  9. Странно. В pdf-версии справочника mql5 в разделе «Информация о счете» указаны 4 функции, «возвращающие параметры текущего счета», и среди них AccountFreeMarginCheck. Но в справочнике MetaEditor’е 5.00 Build 249 в том же самом разделе указаны только три их них; AccountFreeMarginCheck отсутствует. Нет этой функции и в выпадающих подсказках у самого редактора.
    Опять незадача.

  10. Я нашел. Правда называется немного не так, и использует тип ордера (ENUM_ORDER_TYPE). Вот пример:
    #include Trade\AccountInfo.mqh
    void OnStart()
    {CAccountInfo ac;
    double afm=ac.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,0.1);
    Alert(afm);
    return;}

  11. Круто! Работает.
    Из той же структуры можно вытащить и размер свободных средств на счёте (для расчёта размера открываемой позиции).
    Видимо, в ходе дальнейшего обучения придётся осмысливать концепцию организации данных в mql5.

  12. Премного благодарен за полезные уроки. Намного интереснее, чем читать учебник и разбираться над каждой страницей… Уже всем знакомым рассказал про Ваш сайт. Всем нравится. Спасибо Вам

  13. Круто, просто и доходчиво. Спасибо!
    Просьба давайте ещё наш скрипт, научим вычислять размер лота в зависимости от стоплосса или можно отдельной функцией сделать для советника (ещё один кирпичик так сказать) Столкнулся с проблемой и вот уже третий день бьюсь и решить не могу. В готовом советнике решил вместо лота ввести % риска, поэтому нужен расчёт лота к стопу, например при депо 10 000 риск 1% при стопе 100 пп это будет примерно лот 0.1 а вот при стопе 200пп уже лот должен быть 0.05, для того чтобы риск 1% остался на том же уровне. Надеюсь всё понятно изложил.

  14. Вы пошите: Все вычислительные операции в советниках или скриптах MQL необходимо делать в функции start.

    А как пройти в функцию start? Нажать меню файл что ли? Помогите чета мне совсем сложно, никак не могу найти это слово.

  15. Как запустить редактор написано в уроке «Редактор MetaEditor» И когда Вы создадите скрипт или советник (с помощью мастера), то в окне редактора его можно редактировать (как например в Word).

  16. А где мне взять скрипт тест у меня навигаторе нет такого вообще

  17. Извините! У меня после ввода данных не компилируется. Пишет — «Free» — varaiable not defined ошибку найти не могу…

  18. Евгений
    перевожу на русский язык «переменная Free не определена». Соответственно ее надо описать: double Free;

  19. Александр, подскажите, почему мы уже не ставим знак # перед extern int MaxRisk=2;?

  20. компилятор выдает ошибку One_Lot — variable not defined
    что это значит?

  21. при компиляции ошибок не выдаёт, а в окне «Алерт» выдаёт значение 0. ЧЯДНТ?

  22. ‘One_Lot’ — variable not defined C:\Program Files\Alpari Limited MT4\experts\scripts\test_01.mq4 (17, 8)
    ‘One_Lot’ — variable not defined C:\Program Files\Alpari Limited MT4\experts\scripts\test_01.mq4 (18, 29)

    У меня в третьем уроке после нажатия компилировать выдаёт две вышеизложенные ошибки помогите кто может!

  23. После выполнения четвёртого урока проблема сама собой куда то рассосалась!

    Хорошо написано без лишней воды.
    Спасибо!

    Продолжу освоение.

  24. Уважаемый Александр.
    Подскажите пожалуйста, как узнать какой берётся залог у разных брокеров при встречных ордерах?

  25. хочется сделать так, чтобы когда ставишь советника у одного брокера, лот рассчитывался по его правилам по встречных ордерах, у другого по его правилам, просто везде по разному считается, нужно чтобы советник сам определял как рассчитывается залог при встречных ордерах
    Заранее спасибо!

  26. Здравствуйте Александр.
    У меня такая проблема, я протестировал советника на Metatrader 4, всё работает, потом открыл счёт но только в MetaTrader — E-Global Trade & Finance Group, для проверки посмотрел что выводит
    for (int i = 1; i <= 33; i +=1)
    Alert(i, «) «, MarketInfo(OrderSymbol(), i));
    он выводит все нули, и не знаю как быть, в чём может быть причина? в демо-счёте Metatrader 4 всё работает, а в демо-счёте MetaTrader — E-Global Trade & Finance Group выводит все нули, помогите пожалуйста
    Заранее спасибо

  27. почему то функция Symbol() выдает один и тот же интсремент . Убираешь его график вообще, все равно выдает значение для него

  28. После компилирования пишет ошибку ‘Alert’ — declaration without type

  29. Большое спасибо за то, что учите писать советника. Но вот застрял на 2-х ошибках. Научите, пожалуйта, как исправить их:
    1) ‘)’ — unexpected end of program pro2.mq4 219 15 2) ‘{‘ — unbalanced parentheses pro2.mq4 2 5

    С уважением, Юрий

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *