MQL для тебя

MQL для чайников, программирование на MQL4, MQL5

Вопрос №1

Я нашел ошибку: при делении 1 на 2 вместо 0.5 получается 0. Как исправить?

Это не ошибка, а особенность языка MQL.

Дело в том что при делении целого числа на целое в языке MQL4 возвращается целое число. Это конечно не привычно, но необходимо запомнить. Если вы хотите получить вещественное число, то числитель или знаменатель так же должен быть вещественным числом.

Например: 1 / 2=0, 1.0 / 2=0.5, 1 / 2.0=0.5 или 1.0 / 2.0=0.5

Рекомендуемый ДЦ - Alpari !

На предыдущих уроках по изучению языка MQL мы написали скрипт Metatrader4 — «test» для расчета лота. Теперь мы знаем сколько использовать средств для торговли и можем спокойно открывать ордера в Metatrader 4 автоматически.

Но зачем их открывать в ручную если это можно поручить компьютеру? Да и не удобно запускать скрипт на Metatrader 4, а потом еще открывать ордер. Опять же цена между этими действиями не стоит на месте, а постоянно меняется и мы можем потерять несколько пунктов прибыли.

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

В нашем тестовом скрипте на MQL4, мы будем открывать рыночные ордера так как мы обучаемся, а любое обучение идет от простого к сложному.

Все эти типы ордеров програмно открываются одной и той же функцией: OrderSend().

Кроме того ордера бывают на покупку и на продажу валюты. Значит скрипту надо указать эти сведения.

Введем в параметры нашего скрипта еще 2 параметра:
extern bool Buy=false; //для открытия ордера на покупку
extern bool Sell=false; //для открытия ордера на продажу

Оба параметра имеют логический (bool) тип. Значит они будут принимать только два значения: true (истина) и false (ложь). Мы установили их значение в false чтобы при запуске нашего скрипта в MT4 с параметрами по умолчанию ничего не происходило. Если бы мы установили их в true то при запуске с параметрами по умолчанию у нас открылось 2 ордера. Один на покупку, а второй на продажу. В большинстве случаев нам это не нужно. Будем при запуске говорить скрипту «какой ордер открыть».

Тип ордера мы теперь можем указать скрипту, но осталось непонятно как указать стоплосс и тейкпрофит. Согласитесь, что их тоже желательно указывать в параметрах. Например так:
extern int TakeProfit=100;
extern int StopLoss=100;
мы выбрали тип int (целое число), а скрипту поручим переводить их в пункты в зависимости от котировки валютной пары. Для этого достаточно их умножить на служебную переменную Point (размер пункта текущего инструмента в валюте котировки).

Но а как быть если наша стратегия не подразумевает установку тейкпрофита или стоплосса?
воспользуемся знакомой нам функцией проверки условия if:
double buyTP=0; //тейкпрофит для покупки
double sellTP=0; //тейкпрофит для продажи
double buySL=0; //стоплосс для покупки
double sellSL=0; //стоплосс для продажи
if(TakeProfit>0)
  {buyTP=Ask+TakeProfit*Point;
   sellTP=Bid-TakeProfit*Point;}
if(StopLoss>0)
  {buySL=Ask-StopLoss*Point;
   sellSL=Bid+StopLoss*Point;}

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

Итак, наши команды для открытия ордеров будут выглядеть:
if(Buy) OrderSend(Symbol(),OP_BUY,Lot,Ask,3,buySL,buyTP,"«,0,0,CLR_NONE);
if(Sell) OrderSend(Symbol(),OP_SELL,Lot,Bid,3,sellSL,sellTP,»",0,0,CLR_NONE);

С помощью функции if() мы проверяем какой ордер нужно открыть. А функцией OrderSend() открываем.
Функция OrderSend() достаточно сложная и требует много параметров.

Давайте разберемся с ними: Читать полностью »

Рекомендуемый ДЦ - Forex4you !

На предыдущем уроке Язык 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().
Все это мы знаем из предыдущих уроков.

Читать полностью »

Рекомендуемый ДЦ - Alpari !

На прошлом уроке «Язык 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 и наполнять его полезными функциями.

Рекомендуемый ДЦ - Forex4you !

На первом уроке по изучению языка MQL мы научились запускать редактор MetaEditor и создавать новый скрипт MQL4. Но как мы можем увидеть, созданный нами скрипт MT4 пока не выполняет никаких функций в торговом терминале Metatrader 4.

В данном уроке мы научимся его выполнять какую — нибудь полезную функцию. Для примера, рассмотрим одну из полезных функций, которую мы реализуем на языке MQL4 — «расчет лота в зависимости от имеющихся у нас свободных средств».

Для этого мы должны определится с допустимым риском для нашего депозита на форекс (т.е. какое кол-во средств мы будем задействовать в торговле при использования советника форекс или в нашем случаи — скрипта для Metatrader 4).

Все учебники по форекс и опытные трейдеры рекомендуют:  "никогда не рискуйте при заключении сделок на форекс более чем 2−5% от своего депозита". Ну что ж, давайте прислушаемся к их советам. Но т.к. четкой цифры нет, то нам нужно чтобы созданный нами скрипт запрашивал эту цифру.

Теперь давайте реализуем эту функцию на языке MQL4:

Введем в начале скрипта команду: #property show_inputs
У нас получилось:
//±-----------------------------------------------------------------+
//| 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
//±-----------------------------------------------------------------+
//| script program start function                                                   |
//±-----------------------------------------------------------------+

int start()
{
//----

//----
return(0);
}
//±-----------------------------------------------------------------+
команда #property show_inputs означает выводить окно со свойствами перед запуском нашего скрипта MQL.

Попробуем запустить наш получившийся скрипт. Но для этого его нужно предварительно откомпилировать !

Компиляция — это преобразование нашей получившийся программы из языка понятного нам (в данном случаи MQL) в язык понятный компьютеру. Для компиляции скрипта MQL нажмем клавишу «компилировать» —  Компиляция
При этом в нижней части экрана высветится:

Компиляция в MetaEditor

Это сообщение означает, что наш скрипт на языке MQL проверен на отсутствие ошибок и преобразован в код, понятный компьютеру. Читать полностью »

Рекомендуемый ДЦ - Forex4you !

Редактор MetaEditor является составной частью клиентского терминала Metatrader 4, он предназначен для создания, редактирования и компиляции исходного текста программ, написанных на языке MQL. С его помощью можно разрабатывать советники, индикаторы, скрипты и библиотеки функций. В редактор MetaEditor встроен мастер создания советников, который помогает быстро создавать новые MQL-программы. Кроме того в терминал встроен тестер стратегий, который позволяет проверить поведение на исторических данных.

Программы, написанные на MQL, имеют различные свойства и предназначение:

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

Пользовательский индикатор — самостоятельно написанный технический индикатор. Пользовательские индикаторы используются только для анализа динамики цен.

Скрипт — программа, предназначенная для одноразового выполнения каких-либо действий. В отличие от экспертов, скрипты запускаются не потиково, а один раз при вызове.

И так приступим:

Для вызова редактора MetaEditor необходимо в окне терминала нажать клавишу image001.

Перед нами откроется окно, вызываемого нами, редактора — MetaEditor:

image003

Теперь мы можем создать новую программу: Советник, Скрипт, Пользовательский индикатор, нажатием клавиши image005

Теперь запускаем мастер создания советника, скрипта и т.п.:

image007

В предложенном списке выбираем «какую программу мы хотим создать».

Для начала, предлагаю начать изучение языка MQL со скриптов (как наиболее простых программ, написанных на языке MQL4). Читать полностью »

Язык MQL — Введение

Уважаемый читатель, подписчик рассылки данного блога !

Прежде всего хочу объяснить для чего и для кого создан данный сайт и мой курс «MQL для тебя» в частности.

Как не удивительно это будет звучать, но курс «MQL для тебя» предназначен, в основном, для трейдеров форекс, желающих научиться создавать всевозможные советники форекс, пользовательские индикаторы и скрипты для торгового терминала Metatrader 4 (и в дальнейшем Metatrader 5), хотя и программисты, не знакомые с языком программирования MQL, могут почерпнуть новые для себя знания.

Давайте разберемся, почему же основная аудитория сайта  — это трейдеры форекс?

Представим себе (или возможно данные ситуации у вас уже возникали при работе на форекс), вы обнаружили интересную закономерность в поведении цены или нашли новую стратегию форекс, а как проверить, что эта закономерность или стратегия, будет действительно работать, приносить вам прибыль не один день, а на протяжении длительного времени?

Можно конечно сидеть перед графиком торгового терминала и  на листочке записывать все сигналы и их результаты, но на это уйдет слишком много времени и сил. А если учесть тот факт, что рынок постоянно меняется и, поэтому, те торговые стратегии или сигналы форекс, которые работали еще вчера или может пару месяцев назад и приносили прибыль, а 4−5 месяцев назад они, к сожалению приносили одни только убытки. К тому же, если вы, например, хотите проверить «с листочком» большой период на малых таймфреймах (например M5 или M15), то это отберет у вас очень много времени и сил. И даже, если вы проделали эту трудоемкую аналитическую работу, то как подобрать оптимальные параметры данной стратегии, например «Стоп-лосс» и «Тейкп-профит» или любой другой параметр торговой системы, которых иногда бывает до 10 и более? Ведь они при заключении каждой сделки, пусть немного, но могут отличаться.

Да и желание заставить компьютер зарабатывать для вас деньги, при помощи советников форекс, никто не отменял.

Вот поэтому я и предлагаю АВТОМАТИЗИРОВАТЬ торговлю трейдера !

Можно конечно заказать написание советника у опытного программиста, но это будет стоить для вас приличных денег. А представьте ситуацию, что идея окажется не рабочей... платить то, все равно прийдется! И насколько я знаю, трейдеры неохотно хотят делиться с программистом своим «Граалем» и основная причина: «...программист получит мою идею, а я ему еще и платить должен?...». Читать полностью »