Язык MQL — Урок 4 «улучшенный расчет лота»

На предыдущем уроке Язык MQL — Урок 3 “расчет лота” мы научили наш скрипт «test« рассчитывать лот в зависимости от свободных средств на торговом счете форекс. Но чего то ему не хватает, давайте взглянем еще раз на рисунок:

Расчет лота на MQL
Вот оно!!! — Лот у нас получился с 4 знаками после запятой. А брокер форекс требует 2 знака после запятой. Конечно в ручную не составит труда откинуть лишние 2 знака, но мы стремимся автоматизировать нашу торговлю, т.е. всю работу свалить на компьютер. Кроме того — на рисунке не понятно по какой валютной паре рассчитан автоматически лот. Да и цифру максимального риска не помешает видеть на экране монитора.

Итак, давайте продолжим улучшать наш скрипт «test».

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

Для того чтобы узнать сколько знаков после запятой разрешено вашим брокером форекс — воспользуемся известной нам функцией MarketInfo(string symbol, int type).

Только вторым параметром будем передавать MODE_LOTSTEP шаг изменения размера лота.

double Step =MarketInfo(Symbol(),MODE_LOTSTEP); переменная Step будет содержать шаг изменения лота.
Если разделить наш лот на шаг (например 0.01) мы получим: 0.0684/0.01=6.84
Теперь возьмем целую часть от этого числа (функция MathFloor()) = 6 и умножим на шаг (0.01) получим 0.06 (то что и требовалось).

Объединим это с нашим расчетом:

double Lot =MathFloor(Free*MaxRisk/100/One_Lot/Step)*Step;
результат:

вывод информации в Metatrader 4

Получилось отлично.

Осталось добавить информацию о валюте и риске в выводимое окно.
Риск содержится в переменной MaxRisk, а текущая валюта выдается функцией Symbol().
Все это мы знаем из предыдущих уроков.

Изменим вызов функции «Alert()»:
Alert(Symbol(),«(«,MaxRisk,«%)=»,Lot);

Результат:
скрипт на MQL

Все хорошо, но брокер форекс ограничил не только количество знаков после запятой для лота, но и максимальный и минимальный размер лота. А наш скрипт «test» это не учитывает. Срочно исправляем этот недочет, для этого добавим в наш скрипт следующий код:

double Min_Lot=MarketInfo(Symbol(),MODE_MINLOT);
double Max_Lot=MarketInfo(Symbol(),MODE_MAXLOT);
if(Lot<Min_Lot) Lot=Min_Lot;
if(Lot>Max_Lot) Lot=Max_Lot;

знакомая нам функция MarketInfo() с параметром MODE_MINLOT — вернет нам размер минимально разрешенного лота, а с параметром MODE_MAXLOT — размер максимального лота.

Функция if() — выполняет проверку условия и в зависимости от результата выполняет или нет следующую за ней команду.
if(Lot<Min_Lot) Lot=Min_Lot; — если рассчитанный лот меньше минимального, то используем минимальный.
if(Lot>Max_Lot) Lot=Max_Lot; — если рассчитанный лот больше максимального, то используем максимальный.

Вот полный код нашего созданного скрипта «test» на языке MQL:

//+——————————————————————+
//| 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 Step =MarketInfo(Symbol(),MODE_LOTSTEP);
double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
double Lot =MathFloor(Free*MaxRisk/100/One_Lot/Step)*Step;
if(Lot<Min_Lot) Lot=Min_Lot;
if(Lot>Max_Lot) Lot=Max_Lot;
Alert(Symbol(),«(«,MaxRisk,«%)=»,Lot);
//—-
return(0);
}
//+——————————————————————+

Результат его работы следующий:
улучшенный скрипт "test" для Metatrader 4

Вроде бы больших изменений нет, но теперь мы научили наш скрипт рассчитывать лот согласно всем ограничениям нашего брокера форекс с Metatrader 4 и этот расчет можно использовать для более серьезных вещей, в том числе и при дальнейшем использовании в любых скриптах или советниках форекс MT4, которые вы в дальнейшем будете создавать.

Скачать: скрипт test

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

42 комментария

  1. В функции Alert ошибка — неаравильное расположение кавычек

  2. Честно говоря не понимаю где ошибка: Alert(Symbol(),»(«,MaxRisk,»%)=»,Lot)?
    Компилятор не ругается. При запуске окно выдается. Возможно кавычки потерялись при копировании. Выложил рабочий скрипт для скачивания в конце статьи.

  3. Странно.. У меня компилятор уперся.. Пока не изменил последнюю функцию — наклон кавычек был почему то нестандартный, в обратную сторону…

  4. Вполне возможны такие странности. При написании других статей я заметил что редактор заменяет два знака минус одним тире. Как это побороть я пока не придумал. Поэтому и стал выкладывать исходный код для скачивания.

  5. Iv посмотрите комментарии выше. Там эта ситуация рассматривалась. Скачайте скрипт в конце статьи. Он полностью рабочий.

  6. вместо: » вставьте обычные двойные кавычки: »

    и будет вам счастье

  7. Недавно заинтересовался. Вот понемногу изучаю. Выкладываете доступно. Но некоторые нюансы уточняю по справочнику.

    Немного изменил строку алерта:
    Alert(«Максимальный Лот при «+MaxRisk+»% риска = «+Lot);
    лот начал писать с 8ю символами после точки, в чем может быть ошибка?
    Остальной код без изменений.
    В вашем варианте алерта выводит 2 символа после запятой.

  8. Владимир
    Воспользуйтесь функцией DoubleToStr() . Пример: Alert(«Максимальный Лот при «+MaxRisk+»% риска = «+DoubleToStr(Lot,2));

  9. Уважаемы палт,
    А почему надо вставлят запятами внутри кавычки? В пример в MQL4 есть только меж последовательные строки

    ,MaxRisk,

    ПС я изучал MQL4 из 3 источников и курсов. Ваш самой удачной. Удача и спосибо Вам!

  10. венцислав
    Запятыми отделяются параметры, которые мы передаем в функции. Если один параметр, то запятые не ставятся.
    П.с. Я рад что мой блог приносит пользу!

  11. Правильно ли я догадываюсь, что в ситуации, когда

    if(Lot<Min_Lot) Lot=Min_Lot;

    мы просто не сможем торговать, потому, что денег не хватит даже на один лот.

  12. Barry
    Не совсем верно. Мы рассчитываем лот с риском в % в зависимости от свободных средств. Соответственно может получиться что при риске (например 2%) рассчитанный лот окажется меньше минимального, а средств еще хватает. В этом случае и сработает условие.

  13. спасибо за уроки… есть ли функция отвечающия за тип счета (мини, микро, стандартный)?

  14. Строку:
    if(Lot<Min_Lot) Lot=Min_Lot;
    я бы убрал. Рисковое это дело 🙂

  15. спасибо за урок. А можно как в с++ использовать else после if?

  16. alex
    Можно и убрать. Хотя торговля на Форексе сама по себе связана с риском.

  17. Скажите, а есть ли какойто список всех используемых функций в MQL4 с расшифровкой?

  18. Здравствуйте я Вам сообщение отправлял на мыло, не уверен дошло ли оно…

  19. Все получилось!) Большое спасибо! Но в строках «Сигналы» создал кучу сигналов)) можно ли их удалить?

  20. День добрый ,подскажите пожалуйста как можно вот в скрипте сделать следующее.Вот сначала устанавливает бай и сел потом сетка лимитников но! Надо чтоб сетка лимитников устанавливались не от цены а от тейк профитов бая и села ордера вот как такое прописать в скрипте ?

  21. Спасибо за курс.
    Но в этом уроке есть небольшая ошибка.
    Она находиться в этой строке текста

    Изменим вызов функции «Alert()»:
    Alert(Symbol(),»(«,MaxRisk,»%)=»,Lot);

    Нужно написать

    Alert(Symbol(),»(«,MaxRisk,»%)=»,Lot);

    Иначе вместо 2% скрипт пишет «,MaxRisk,»%

  22. Спасибо за курс.

    Но в этом уроке есть небольшая ошибка.

    Она находиться в этой строке текста

    Изменим вызов функции «Alert()»:

    Alert(Symbol(),»(«,MaxRisk,»%)=»,Lot);

    Нужно написать

    Alert(Symbol(),»(«,MaxRisk,»%)=»,Lot);

    Иначе вместо 2% скрипт пишет «,MaxRisk,»%

  23. При отправке комментария меняется текст.

    Я имел в виду
    В строке нужно написать нужно изменить кавычки с « на «

  24. Помогите пожалуйста

    я хотел стделть скрипт на основе индикатора RVI
    что бы он выдавал текущее значение зеленой и красной линии. но почему-то он показывает нули — 0 : 0

    скриптом хотел проверить правильно ли я достал эти значения как видимо что-то не так

    //+——————————————————————+
    //| 23.mq4 |
    //| Copyright 2012, MetaQuotes Software Corp. |
    //| http://www.metaquotes.net |
    //+——————————————————————+
    #property copyright «Copyright 2012, MetaQuotes Software Corp.»
    #property link «http://www.metaquotes.net»
    #property show_inputs
    extern int ExtRVIPeriod=10;
    double ExtRVIBuffer[];
    double ExtRVISignalBuffer[];
    //+——————————————————————+
    //| script program start function |
    //+——————————————————————+
    int start()
    {
    int i,j,nLimit,nCountedBars;
    double dValueUp,dValueDown,dNum,dDeNum;
    //—-
    if(Bars<=ExtRVIPeriod+8) return(0);
    //—-
    nCountedBars=IndicatorCounted();
    //—- check for possible errors
    if(nCountedBarsExtRVIPeriod+4)
    nLimit=Bars-nCountedBars;
    //—- RVI counted in the 1-st buffer
    for(i=0; i<=nLimit; i++)
    {
    dNum=0.0;
    dDeNum=0.0;
    for(j=i; jExtRVIPeriod+8)
    nLimit=Bars-nCountedBars+1;
    for(i=0; i<=nLimit; i++)
    ExtRVISignalBuffer[i]=(ExtRVIBuffer[i]+2*ExtRVIBuffer[i+1]+2*ExtRVIBuffer[i+2]+ExtRVIBuffer[i+3])/6;
    //—-
    Alert(ExtRVIBuffer[i],» : «,ExtRVISignalBuffer[i]);
    return(0);
    }
    //+——————————————————————+

  25. У меня при депозите 1000 евро, выводит максимальный лот 100 по паре GBPUSD. 100 лотов купить не могу, денег не хватает. Получается что программа не работает?

  26. Разобрался сам. Поставил перед последним степ делить, а не умножать((

  27. хорошо бы лот расчитывать исходя из риска И планируемоего стоп лосса

  28. Действительно класс ный сайт. Подробно и как то легко усваивается. А что пишут про ошибки, то ни с одной еще до сих пор не встретился.
    Спасибо palt за ваши уроки. Главное не сделайте их платными.
    Пусть те кто у вас научится и заработает первые средства не пожалеет, а от чистого сердца пожертвует потом в знак благодарности сколько захочет. Это ведь тоже труд правильно подать знания, которые пошли на пользу.

  29. Бывает ситуация, когда процента риска не хватает для минимального объема. Добавил одну строку!

    if(LotMax_Lot) Lot=Max_Lot;

    Alert(Symbol(),»(«MaxRisk «,MaxRisk,»%»)=»,Lot,» лот»);

  30. Ya xotel sprosit. Kak mojno dobavit takoy usluviya. Price<MA50 programma ponimaet 4to MA eto moving everage,??? (((( ya izvinayus ya iwe novi4ok!!! ))) kto ta znaet skajite pojalusta

  31. Да действительно хороший сайт, я на нем учился писать первые советники

  32. Немного не правильно. Когда ставишь например 1 процент риска по идее он должен показывать результат 0.00. Вместо этого он показывает 0.01. Но это же не верно. Как исправить, кто поможет? Спасибо!

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

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