Вам пришлось проделать длинный путь, чтобы добраться до этого урока. Поздравляю!
Вы изучили основы языка MQL4, написали свой первый индикатор, а затем и первый советник.
Надеюсь, Вам понравилось это путешествие, и Вы готовы продолжать идти дальше по этой дороге вместе со мной.
Сегодня мы создадим наш первый скрипт, который просто-напросто будет выставлять стоп-лоссы и тейк-профиты для уже открытых ордеров. Он будет особенно полезен тем, кому лень выставлять стоп-лосс и тейк-профит вручную для каждого ордера.
Чего же мы ждём? Начнём!
Что такое скрипт?
Скрипт-язык - в Интернет - это интерпретируемый (объектно-ориентированный) алгоритмический язык, предназначенный для генерации динамических веб-страниц. Различают скрипт-языки:
- исполняемые на стороне клиента: JavaScript и VBScript; и
- исполняемые на стороне сервера: ASP, Perl, PHP и др.
Интерпретация — это процесс непосредственного покомандного выполнения программы без предварительной компиляции, «на лету»; в большинстве случаев интерпретация намного медленнее работы уже скомпилированной программы, но не требует затрат на компиляцию, что в случае небольших программ может повышать общую производительность.
MQL4 сам по себе является компилируемым языком. И файл *.ex4 - это скомпилированный и оптимизированный пи-код (по сути ассемблерные инструкции) для виртуальной машины MQL4.
Поэтому, в MQL4 под словом скрипт подразумевается совсем другое.
Что такое скрипт в MQL4?
Скрипт - это программа, которая исполняется единократно, сразу после чего завершается.
В отличие от экспертов, которые вызываются каждый раз, когда приходит новый тик, скрипты срабатывают только один раз.
И, в отличие от индикаторов, которые могут рисовать всякие линии на графике, скрипты не имеют доступа к индикаторным функциям.
Коротко - скрипт это советник, который срабатывает только раз.
Ну что? Создадим наш первый скрипт!
Опять помощник!
Помощника создаст за нас каркас программы.
Вызовите помощника: Файл -> Создать или нажав Ctrl+N. (рис. 1)
Мы создаём скрипт, поэтому выберите пункт "Пользовательский скрипт" и нажмите Далее.
Заполните поля Название, Автор и Ссылка и нажмите Готово.
При нажатии кнопки готово Вы получите примерно такой код:
Код:
//+------------------------------------------------------------------+
//| My_First_Script.mq4 |
//| Kirill |
//| StockProgrammer@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Kirill"
#property link "StockProgrammer@mail.ru"
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
Это потому что очень сложно найти скрипт, которому нужно исполнять какой-либо код в функциях init() и deinit(), потому что сама функция start() будет выполнена лишь раз. Но это не значит, что функции init() и deinit() запрещены в скриптах. Вовсе нет - Вы можете их использовать, если хотите.
А теперь надо добавить наш собственный код, чтобы сделать скрипт более полезным.
Код:
//+------------------------------------------------------------------+
//| My_First_Script.mq4 |
//| Kirill |
//| StockProgrammer@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Kirill"
#property link "StockProgrammer@mail.ru"
#property show_inputs
#include <stdlib.mqh>
extern double TakeProfit=250;
extern double StopLoss=35;
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
//----
int total,cnt,err;
total = OrdersTotal();
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()==OP_BUY) // long position is opened
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*StopLoss,Bid+Point*TakeProfit,0,Green);
err=GetLastError();
Print("error(",err,"): ",ErrorDescription(err));
Sleep(1000);
}
if(OrderType()==OP_SELL) // short position is opened
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*StopLoss,Ask-Point*TakeProfit,0,Red);
err=GetLastError();
Print("error(",err,"): ",ErrorDescription(err));
Sleep(1000);
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
Код:
//+------------------------------------------------------------------+
//| My_First_Script.mq4 |
//| Kirill |
//| StockProgrammer@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Kirill"
#property link "StockProgrammer@mail.ru"
Также были созданы две директивы #property.
Код:
#property show_inputs
Без этой директивы скрипт не будет принимать входных данных от пользователя, а потому не появится окошко настроек скрипта, как указанное на рис. 3.
В нашем скрипте пользователь может задавать значения переменных TakeProfit и StopLoss в этом окошке. Или он может оставить значения по-умолчанию.
Замечание: Если Ваша задача написать скрипт, который не требует задания входных параметров пользователем, лучше убрать эту директиву.
Код:
#include <stdlib.mqh>
Это означает, что отныне всё содержание файла "stdlib.mqh" является частью нашей программы, и мы спокойно можем пользоваться функцией ErrorDescription.
Код:
extern double TakeProfit=250;
extern double StopLoss=35;
Эти переменные будут использованы в функции start() для определения уровней тейк-профит и стоп-лосс всех уже открытых ордеров.
Код:
int start()
{
//----
int total,cnt,err;
total = OrdersTotal();
...
}
Мы объявили три переменные integer, используя однострочное объявление нескольких переменных. Затем мы присвоили значение, возвращаемое функцией OrdersTotal(), перменной total. Как Вы помните, функция OrdersTotal() возвращает общее количество открытых и отложенных ордеров.
Код:
for(cnt=0;cnt<total;cnt++)
{
...
}
Код:
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
(Пожалуйста, пересмотрите урок 15 - торговые функции).
Код:
if(OrderType()==OP_BUY) // long position is opened
{
...
}
OP_BUY, OP_SELL, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP
В вышеуказанном if условии мы осуществляем проверку того, что данный ордер является ордером на покупку. Если это так, то будет выполнен if-блок.
Код:
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*StopLoss,Bid+Point*TakeProfit,0,Green);
ticket: Тикет данного ордера нам предоставит функция OrderTicket().
price: Цену открытия нам предоставит функция OrderOpenPrice().
Замечание: Этот параметр используется для модификации цены открытия отложенных ордеров, и для открытых ордеров можно передавать 0.
stoploss: Здесь мы выставляем стоп-лосс на уровень равный разнице тек. цены bid и произведения StopLoss * Point. Т.е. стоп-лосс выставляем на StopLoss пунктов ниже тек. цены bid.
takeprofit: Здесь мы выставляем тейк-профит на уровень равный сумме тек. цены bid и произведения TakeProfit * Point. Т.е. тейк-профит выставляем на TakeProfit пунктов выше тек. цены bid.
expiration: У открытых ордеров не может быть срока истечения. Поэтому мы передаём 0.
arrow_color: Мы выбрали зелёную стрелку. Вы помните почему ;)
Код:
err=GetLastError();
Print("error(",err,"): ",ErrorDescription(err));
Sleep(1000);
Функция GetLastError() возвращает код последней произошедшей ошибки после выполнения какого-либо оператора.
(OrderModify() в нашем случае).
Но мы хотим напечатать не только код ошибки, но и её описание. Поэтому мы используем функцию ErrorDescription(). После чего всё это мы печатаем в лог эксперта функцией Print().
Затем мы используем функцию Sleep() чтобы дать нашему скрипту и терминалу передохнуть одну секунду (1000 милисекунд).
Замечание: Функция Sleep() откладывает дальнейшее выполнение программы на указанное время в милисекундах.
Код:
if(OrderType()==OP_SELL) // short position is opened
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*StopLoss,Ask-Point*TakeProfit,0,Red);
err=GetLastError();
Print("error(",err,"): ",ErrorDescription(err));
Sleep(1000);
}
Код:
return(0);
Теперь откомпилируем наш первый скрипт.
Нажмите F5. Как только скрипт откомпилирован, он появится в окошке Навигатор в категории Скрипты (см. рис. 4).
Замечание: Код, который на создал помощник и который мы модифицировали, хранится в файле "My_fist_Script.mq4". Этот файл лежит в папке: "MetaTrader\experts\scripts\". Все скрипты необходимо класть в эту папку и компилировать перед использованием в терминале.
Для исполнения скрипта просто щёлкните по нему дважды или же перетащите на график.
Во вкладке "Входные параметры" можно изменять значения переменных TakeProfit и StopLoss.
Надеюсь, Вам понравился этот урок, и Вы найдёте свой первый скрипт достаточно полезным.
Если что не понятно читать, читать и еще раз читать!!!
Лучше всего из первоисточника, т.е. с сайта http://articles.mql4.com/ru/
К примеру:
Язык MQL 4 для "чайников". Первое знакомство
http://articles.mql4.com/ru/363
Язык MQL4 для "чайников". Сложные вопросы простым языком
http://articles.mql4.com/ru/397
Язык MQL4 для "чайников". Пользовательские индикаторы (часть 1)
http://articles.mql4.com/ru/500