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

Вот оно!!! — Лот у нас получился с 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;
результат:

Получилось отлично.
Осталось добавить информацию о валюте и риске в выводимое окно.
Риск содержится в переменной MaxRisk, а текущая валюта выдается функцией Symbol().
Все это мы знаем из предыдущих уроков.
Изменим вызов функции "Alert()":
Alert(Symbol(),"(«,MaxRisk,»%)=",Lot);
Результат:

Все хорошо, но брокер форекс ограничил не только количество знаков после запятой для лота, но и максимальный и минимальный размер лота. А наш скрипт «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);
}
//±-----------------------------------------------------------------+
Результат его работы следующий:

Вроде бы больших изменений нет, но теперь мы научили наш скрипт рассчитывать лот согласно всем ограничениям нашего брокера форекс с Metatrader 4 и этот расчет можно использовать для более серьезных вещей, в том числе и при дальнейшем использовании в любых скриптах или советниках форекс MT4, которые вы в дальнейшем будете создавать.
Скачать: скрипт test
Если Вы хотите изучать язык MQL или вам понравилась данная публикация - Вы можете подписаться на получение новых материалов сайта mql4you.ru по или по e-mail: |
Отзывов (25) на «Язык MQL — Урок 4 «улучшенный расчет лота»»
[...] предыдущих уроках по изучению языка MQL мы написали скрипт Metatrader4 — “test” для расчета лота. Теперь мы знаем сколько [...]
В функции Alert ошибка — неаравильное расположение кавычек
Честно говоря не понимаю где ошибка: Alert(Symbol(),"(«,MaxRisk,»%)=",Lot)?
Компилятор не ругается. При запуске окно выдается. Возможно кавычки потерялись при копировании. Выложил рабочий скрипт для скачивания в конце статьи.
Странно... У меня компилятор уперся... Пока не изменил последнюю функцию — наклон кавычек был почему то нестандартный, в обратную сторону...
Вполне возможны такие странности. При написании других статей я заметил что редактор заменяет два знака минус одним тире. Как это побороть я пока не придумал. Поэтому и стал выкладывать исходный код для скачивания.
При копировании кавычки меняют наклон почему-то...
Iv посмотрите комментарии выше. Там эта ситуация рассматривалась. Скачайте скрипт в конце статьи. Он полностью рабочий.
пасиб за урок
Объясните пожалуйста знак » не нашел его на клаве :)))
Так редактор иногда заменяет двойные кавычки: "
у меня получилось. Грамотный курс
вместо: » вставьте обычные двойные кавычки: "
и будет вам счастье
Недавно заинтересовался. Вот понемногу изучаю. Выкладываете доступно. Но некоторые нюансы уточняю по справочнику.
Немного изменил строку алерта:
Alert("Максимальный Лот при «+MaxRisk+»% риска = "+Lot);
лот начал писать с 8ю символами после точки, в чем может быть ошибка?
Остальной код без изменений.
В вашем варианте алерта выводит 2 символа после запятой.
Владимир
Воспользуйтесь функцией DoubleToStr() . Пример: Alert("Максимальный Лот при «+MaxRisk+»% риска = "+DoubleToStr(Lot,2));
Palt, благодарю ))
Теперь все отлично.
Уважаемы палт,
А почему надо вставлят запятами внутри кавычки? В пример в MQL4 есть только меж последовательные строки
,MaxRisk,
ПС я изучал MQL4 из 3 источников и курсов. Ваш самой удачной. Удача и спосибо Вам!
венцислав
Запятыми отделяются параметры, которые мы передаем в функции. Если один параметр, то запятые не ставятся.
П.с. Я рад что мой блог приносит пользу!
Правильно ли я догадываюсь, что в ситуации, когда
if(Lot<Min_Lot) Lot=Min_Lot;
мы просто не сможем торговать, потому, что денег не хватит даже на один лот.
Barry
Не совсем верно. Мы рассчитываем лот с риском в % в зависимости от свободных средств. Соответственно может получиться что при риске (например 2%) рассчитанный лот окажется меньше минимального, а средств еще хватает. В этом случае и сработает условие.
спасибо за уроки... есть ли функция отвечающия за тип счета (мини, микро, стандартный)?
Строку:
if(Lot<Min_Lot) Lot=Min_Lot;
я бы убрал. Рисковое это дело
спасибо за урок. А можно как в с++ использовать else после if?
Almas
К сожалению — нет.
alex
Можно и убрать. Хотя торговля на Форексе сама по себе связана с риском.
123sten123
Конечно можно. MQL очень похож на С++
Оставьте отзыв