MQL для тебя

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

Язык MQL — Урок 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() достаточно сложная и требует много параметров.

Давайте разберемся с ними:1 — валюта по которой открывать ордер (мы использовали уже известную функцию Symbol() для указания текущей валюты)
2 — тип открываемого ордера (OP_BUY покупка по рыночной цене, OP_SELL продажа по рыночной цене)
3 — размер лота (у нас в скрипте уже лот рассчитан в переменной Lot, его и используем)
4 — цена (для покупки текущая рыночная цена содержится в служебной переменной Ask, а для продажи в Bid)
5 — проскальзывание (со времени отправки команды на сервер «открыть ордер» и ее исполнением цена может успеть изменится. Мы поставили 3 пункта. Этим мы сказали серверу брокера что если цена изменится максимум на 3 пункта — открыть ордер, а если больше — не открывать.)
6 — размер стоплосса (расчет надеюсь понятен?)
7 — размер тейкпрофита (если понятен расчет стоплосса то и тут все понятно)
8 — комментарий (каждому ордеру можно присвоить свой комментарий. Оставим этот параметр пустым)
9 — магический номер(зачем он нужен? Когда работают несколько советников — по этому номеру они находят «свои» ордера. Мы оставили 0, хотя сюда можно написать любое число.)
10− срок жизни отложенного ордера(пока нам не интересно, ведь мы используем рыночные ордера а не отложенные)
11− цвет стрелки (для наглядности можно указать цвет и тогда на графике будет нарисована стрелочка в том месте где открылся ордер.

Мы использовали служебную константу CLR_NONE — не рисовать)

С параметрами разобрались, но это еще не все (а вы думали будет легко?) Функция OrderSend() возвращает номер тикета (уникальный номер ордера) или −1 в случае ошибки. Если при расчете лота все действия выполнялись на компьютере, то здесь идет взаимодействие с сервером брокера форекс. А значит может возникнуть большое количество ошибок. По хорошему надо проверять — какую ошибку вернула функция и выполнять соответствующие действия. Но я покажу вам один простой способ как избежать большинства из них.

Для этого мы используем простую конструкцию:
while(!IsTradeAllowed()) Sleep(100);

Дословно означает «подождем пока сервер не будет готов принять от нас команду»
функция while() будет выполнять следующую за ней команду до бесконечности если условие переданное ей истенно. Это так называемый цикл. Условием мы передаем другую функцию IsTradeAllowed() — возвращается TRUE, если эксперту разрешено торговать и поток для выполнения торговых операций свободен, иначе возвращает FALSE. Но нам надо как раз наоборот: чтобы было TRUE когда терминал занят. Для этого перед функцией стоит восклицательный знак. Он интвертирует условие и мы получаем то что и хотели. Функция Sleep() — ничего не делает, но и не дает выполнятся программе указанное количество милисекунд.

В итоге мы получаем код нашего скрипта на языке MQL4:
//±-----------------------------------------------------------------+
//| test.mq4 |
//| Copyright c 2009, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//±-----------------------------------------------------------------+
#property copyright "Copyright c 2009, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
#property show_inputs
extern int MaxRisk=2;
extern bool Buy=false; //для открытия ордера на покупку
extern bool Sell=false; //для открытия ордера на продажу
extern int TakeProfit=100;
extern int StopLoss=100;
//±-----------------------------------------------------------------+
//| script program start function |
//±-----------------------------------------------------------------+
int start()
{
//----
double Free =AccountFreeMargin();
double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
double Lot =MathFloor(Free*MaxRisk/100/One_Lot/Step)*Step;
if(Lot<Min_Lot) Lot=Min_Lot;
if(Lot>Max_Lot) Lot=Max_Lot;
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;}
while(!IsTradeAllowed()) Sleep(100);
if(Buy) OrderSend(Symbol(),OP_BUY,Lot,Ask,3,buySL,buyTP,"«,0,0,CLR_NONE);
while(!IsTradeAllowed()) Sleep(100);
if(Sell) OrderSend(Symbol(),OP_SELL,Lot,Bid,3,sellSL,sellTP,»",0,0,CLR_NONE);
//----
return(0);
}
//±-----------------------------------------------------------------+

Теперь этим скриптом, написанном на языке MQL4 удобно торговать. Например по стратегии Hedge Hog.

Однако есть одно «но» — не каждому удобно находится около терминала MT4 в 00:00 по GMT (как требует предложенная стратегия форекс). Поэтому на следующем уроке по изучению языка MQL, мы займемся написанием советника форекс (который торгует сам).

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

Если Вы хотите изучать язык MQL или вам понравилась данная публикация - Вы можете подписаться на получение новых материалов сайта mql4you.ru по RSS или по e-mail:

Отзывов (11) на «Язык MQL — Урок 5 «открытие ордеров»»

  1. Язык MQL - Урок 6 “эксперт Hedge Hog” | MQL для тебя 12.01.2010 в 14:24 1

    [...] форекс и добавляем параметры аналогичные нашему скрипту MT4, написанному [...]

  2. Дмитрий 12.03.2010 в 12:53 2

    mql5. Попробовал открыть ордер вот таким образом:

    ...

    void OnStart()

    {

    double buyTP=0; //тейкпрофит для покупки

    double sellTP=0; //тейкпрофит для продажи

    double buySL=0; //стоплосс для покупки

    double sellSL=0; //стоплосс для продажи

    double Ask,Bid;

    MqlTradeRequest my_request;

    MqlTradeResult my_result;

    Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);

    Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);

    string symbol=Symbol();

    if(TakeProfit>0)

    {

    buyTP=Ask+TakeProfit*_Point;

    sellTP=Bid-TakeProfit*_Point;

    }

    if(StopLoss>0)

    {

    buySL=Ask-StopLoss*_Point;

    sellSL=Bid+StopLoss*_Point;

    }

    my_request.action=TRADE_ACTION_DEAL;

    my_request.magic=1;

    my_request.deviation=0;

    my_request.order=1;

    my_request.sl=buySL;

    my_request.tp=buyTP;

    my_request.symbol=symbol;

    my_request.type=ORDER_TYPE_BUY;

    my_request.type_filling=ORDER_FILLING_AON;

    my_request.volume=0.1;

    my_request.type_time=ORDER_TIME_GTC;

    OrderSend(my_request,my_result);

    Не работает. Что надо сделать, чтобы было правильно?

  3. Амир 16.03.2010 в 14:55 3

    Что-то не получилось не сходятся коды написанные на сайте и в ссылке скрипт test Пожалуйста разъясните очень хочется научиться программировать Спасибо

  4. palt 16.03.2010 в 20:23 4

    Для простоты можно воспользоваться классом CTrade из Trade\Trade.mqh

    Пример: OrderOpen.mq5

  5. palt 16.03.2010 в 20:48 5

    Все очень просто. В конце статьи можете скачать рабочий скрипт. А читая статью разобраться как он работает. Редактор изменяет некоторые символы при публикации. Это касается кавычек и знаков минус. Поэтому я и выкладываю исходные коды в конце статей.

  6. Амир 12.05.2010 в 14:22 6

    Добрый день! непонятна следующая строка можно подробнее?

    if(TakeProfit>0)

    {buyTP=Ask+TakeProfit*Point;

    sellTP=Bid-TakeProfit*Point;}

  7. Anton 19.06.2010 в 0:13 7

    Спасибо за этот блог. Очень интересно.

    Вопрос:

    Что значит двойное равно == ? Например:

    if(Lot==0)

  8. leo52 05.08.2010 в 16:52 8

    Александр, не могли бы Вы наглядно показать описание скрипта автоматического открытия отложенных ордеров STOP и LIMIT на основе скрипта test на определенном расстоянии от цены и друг от друга с TP и SL и определенным количеством ордеров и лотов?Заранее благодарен,Тимур.

  9. palt 20.08.2010 в 8:57 9

    Anton

    В языке MQL двойное равно «==» означает проверку на равенство, в то время как одинарный знак равно «=» означает присваивание значения.

  10. palt 20.08.2010 в 9:45 10

    Амир

    Здесь мы проверяем внешний параметр TakeProfit и если он задан (больше 0), то для открываемых ордеров рассчитываем значение тейкпрофита.

  11. palt 20.08.2010 в 10:40 11

    leo52

    Здесь нет ничего сложного. Вместо OP_BUY пишем OP_BUYSTOP для STOP ордеров или OP_BUYLIMIT для LIMIT ордеров. А вместо Ask и Bid указываем необходимую нам цену. Количество устанавливаемых ордеров тоже не проблема. Нужно вызывать функцию OrderSend столько раз — сколько ордеров мы хотим установить.


Оставьте отзыв


Другие публикации рубрики "MQL Школа":

  • В рубриках: MQL Школа

  • 
      Всего подписчиков:

    Он-лайн Форекс семинар

    Рекомендуемые Советники Форекс для MetaTrader 4