КАК ЗАРАБОТАТЬ НА ФОРЕКСЕ
Пятница, 03.05.2024, 11:31
Приветствую Вас Гость | RSS
 
Главная Учимся программировать на языке MQL4-Урок 18 - Ваш первый скриптРегистрацияВход
<a href="http://instaforex.com/ru/">Форекс портал</a>
Меню сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Урок 18 - Ваш первый скрипт

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

Вы изучили основы языка 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(), потому что сама функция 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
Мы добавили директиву #property show_inputs в наш скрипт.
Без этой директивы скрипт не будет принимать входных данных от пользователя, а потому не появится окошко настроек скрипта, как указанное на рис. 3.
В нашем скрипте пользователь может задавать значения переменных TakeProfit и StopLoss в этом окошке. Или он может оставить значения по-умолчанию.

Замечание: Если Ваша задача написать скрипт, который не требует задания входных параметров пользователем, лучше убрать эту директиву.


Рис. 3 - Окошко настроек скрипта.
Код:
#include <stdlib.mqh>
Дальше в нашем коде мы будем использовать функцию ErrorDescription(), которая возвращает строковое описание по коду произошедшей ошибки. Тело этой функции находится в файле "stdlib.mqh", так что нам надо его включить в нашу программу, используя директиву #include.
Это означает, что отныне всё содержание файла "stdlib.mqh" является частью нашей программы, и мы спокойно можем пользоваться функцией ErrorDescription.

Код:
extern double TakeProfit=250;
extern double StopLoss=35;
Тут мы объявили две внешние переменные, которые пользователь может задать в окошке настроек скрипта (рис. 3) или же он может оставить значения по умолчанию.
Эти переменные будут использованы в функции start() для определения уровней тейк-профит и стоп-лосс всех уже открытых ордеров.

Код:
int start()
{
//----

int total,cnt,err;

total = OrdersTotal();

...

}
Мы уже находимся внутри функции start(), которая будет вызвана только один раз - когда Вы перетащите скрипт на график.
Мы объявили три переменные integer, используя однострочное объявление нескольких переменных. Затем мы присвоили значение, возвращаемое функцией OrdersTotal(), перменной total. Как Вы помните, функция OrdersTotal() возвращает общее количество открытых и отложенных ордеров.

Код:
 for(cnt=0;cnt<total;cnt++)
{

...

}
Мы запускаем цикл, в котором переменная цикла cnt, при выполнение очередного шага цикла, будет увеличиваться на 1. Т.е. переменная cnt меняется от 0 включительно до total не включительно, т.е. последнее значение cnt будет total-1. Это потому что ордеров всего total, а их индексация начинается с 0.

Код:
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
Выбираем ордер по индексу (флаг SELECT_BY_POS). Выбор ордера необходим для некоторых функций, которые встретяться дальше.

(Пожалуйста, пересмотрите урок 15 - торговые функции).

Код:
 if(OrderType()==OP_BUY) // long position is opened
{

...

}
Функция OrderType() возвращает тип открытого ордера, который может принимать одно из значений:

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);
Итак, рассматриваемая сделка является открытой сделкой BUY. Значит, мы хотим выставить ей указанные пользователем StopLoss и TakeProfit. Для этого мы используем функцию OrderModify() со следующими параметрами:

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(), переменной err.
Функция 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);
Пришло время завершить работу нашего скрипта, используя функцию return().

Теперь откомпилируем наш первый скрипт.

Нажмите 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
Поиск
<a href="http://instaforex.com/ru/">Форекс портал</a>
Copyright MyCorp © 2024
Бесплатный конструктор сайтов - uCoz