MQL для тебя

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

Что значит 2010.02.01 17:00 MyExpert GBPUSD,M15: OrderModify error 130
почему обычно эта ошибка возникает?

Очень много подобных вопросов мне приходит. Поэтому публикую таблицу кодов ошибок. Например посмотрев вышеописанную ошибку error 130 становится понятно, что функция OrderModify пытается изменить стоп-лосс или тейк-профит слишком близко к текущей цене.

Коды ошибок

GetLastError() — функция, возвращающая коды ошибок. Кодовые константы ошибок определены в файле stderror.mqh. Для вывода текстовых сообщений следует использовать функцию ErrorDescription(), определенную в файле stdlib.mqh.

Коды ошибок, возвращаемые торговым сервером или клиентским терминалом:

Значение Описание
0 Нет ошибки
1 Нет ошибки, но результат неизвестен
2 Общая ошибка
3 Неправильные параметры
4 Торговый сервер занят
5 Старая версия клиентского терминала
6 Нет связи с торговым сервером
7 Недостаточно прав
8 Слишком частые запросы
9 Недопустимая операция нарушающая функционирование сервера
64 Счет заблокирован
65 Неправильный номер счета
128 Истек срок ожидания совершения сделки
129 Неправильная цена
130 Неправильные стопы
131 Неправильный объем
132 Рынок закрыт
133 Торговля запрещена
134 Недостаточно денег для совершения операции
135 Цена изменилась
136 Нет цен
137 Брокер занят
138 Новые цены
139 Ордер заблокирован и уже обрабатывается
140 Разрешена только покупка
141 Слишком много запросов
145 Модификация запрещена, так как ордер слишком близок к рынку
146 Подсистема торговли занята
147 Использование даты истечения ордера запрещено брокером
148 Количество открытых и отложенных ордеров достигло предела, установленного брокером.

Коды ошибок выполнения MQL4 программы:

Значение Описание
4000 Нет ошибки
4001 Неправильный указатель функции
4002 Индекс массива — вне диапазона
4003 Нет памяти для стека функций
4004 Переполнение стека после рекурсивного вызова
4005 На стеке нет памяти для передачи параметров
4006 Нет памяти для строкового параметра
4007 Нет памяти для временной строки
4008 Неинициализированная строка
4009 Неинициализированная строка в массиве
4010 Нет памяти для строкового массива
4011 Слишком длинная строка
4012 Остаток от деления на ноль
4013 Деление на ноль
4014 Неизвестная команда
4015 Неправильный переход
4016 Неинициализированный массив
4017 Вызовы DLL не разрешены
4018 Невозможно загрузить библиотеку
4019 Невозможно вызвать функцию
4020 Вызовы внешних библиотечных функций не разрешены
4021 Недостаточно памяти для строки, возвращаемой из функции
4022 Система занята
4050 Неправильное количество параметров функции
4051 Недопустимое значение параметра функции
4052 Внутренняя ошибка строковой функции
4053 Ошибка массива
4054 Неправильное использование массива-таймсерии
4055 Ошибка пользовательского индикатора
4056 Массивы несовместимы
4057 Ошибка обработки глобальныех переменных
4058 Глобальная переменная не обнаружена
4059 Функция не разрешена в тестовом режиме
4060 Функция не подтверждена
4061 Ошибка отправки почты
4062 Ожидается параметр типа string
4063 Ожидается параметр типа integer
4064 Ожидается параметр типа double
4065 В качестве параметра ожидается массив
4066 Запрошенные исторические данные в состоянии обновления
4067 Ошибка при выполнении торговой операции
4099 Конец файла
4100 Ошибка при работе с файлом
4101 Неправильное имя файла
4102 Слишком много открытых файлов
4103 Невозможно открыть файл
4104 Несовместимый режим доступа к файлу
4105 Ни один ордер не выбран
4106 Неизвестный символ
4107 Неправильный параметр цены для торговой функции
4108 Неверный номер тикета
4109 Торговля не разрешена
4110 Длинные позиции не разрешены
4111 Короткие позиции не разрешены
4200 Объект уже существует
4201 Запрошено неизвестное свойство объекта
4202 Объект не существует
4203 Неизвестный тип объекта
4204 Нет имени объекта
4205 Ошибка координат объекта
4206 Не найдено указанное подокно
4207 Ошибка при работе с объектом

Добрый день!
Подскажите как выключить компьютер из MQL? Мой советник выставляет ордер в определенное время и хотелось бы выключать компьютер после этого.

В заголовочном файле WinUser32.mqh описана функция ExitWindowsEx() из системной библиотеки user32.dll. Она предназначена для завершения работы Windows. Эта функция прекрасно работает в старых версиях Windows, но в связи с ужесточившейся безопасностью в современных версиях не все так просто. Поэтому предлагаю воспользоваться другим способом. В Windows есть программа shutdown.exe Она предназначена для завершения работы. Для запуска программ из MQL необходимо импортировать из системной библиотеки kernel32.dll функцию WinExec():

#import "kernel32.dll"
int WinExec(string lpCmdLine,int uCmdShow);

После этого в любом месте советника ее можно будет вызвать:

WinExec("shutdown.exe -s -f",1);

Скачать пример:  скрипт Shutdown

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

На прошлом уроке по изучению языка MQL4 мы научились использовать индикаторы Forex в своих советниках для MT4. Но сразу возникает вопрос: «А как быть, если мы не нашли необходимого нам индикатора?» - Конечно же мы его можем написать сами на языке MQL4.

Поэтому на сегодняшнем уроке мы будем изучать: "Как создать свой индикатор для MT4".

Возьмем для примера «Стратегию форекс на внутреннем Баре». Прочитав данную стратегию — мы понимаем что нам не хватает подсветки этого самого "внутреннего бара".

Давайте исправим эту ситуацию, написав свой индикатор форекс.

Запускаем мастер создания советников в MetaEditor:

Мастер создания индикаторов

Назовем наш создаваемый индикатор форекс - "inBar" и добавим параметр для изменения цвета подсветки:

Параметры индикатора

Следующее окно оставим без изменений:

Назначение буферов вывода

После нажатия кнопочки «Готово» получим пустой шаблон индикатора для Metatrader4:

//±-----------------------------------------------------------------+
//| inBar.mq4 |
//| Copyright © 2010. |
//| http://mql4you.ru |
//±-----------------------------------------------------------------+
#property copyright "Copyright © 2010."
#property link "http://mql4you.ru"
#property indicator_chart_window
extern color BoxColor=Red;
//±-----------------------------------------------------------------+
int init() {return(0);}
//±-----------------------------------------------------------------+
int deinit() {return(0);}
//±-----------------------------------------------------------------+
int start()
{int counted_bars=IndicatorCounted();
return(0);}
//±-----------------------------------------------------------------+ 

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

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

Сегодня разберемся, как работать в языке MQL4 с внешними индикаторами. Невозможно встроить все индикаторы форекс в терминал Metatrader. Постоянно появляются новые индикаторы Forex и усовершенствуються старые индикаторы. Поэтому разработчики терминала Metatrader4 позаботились о работе с внешними индикаторами в языке MQL.

Рассмотрим например индикатор форекс "ZigZag":

Индикатор ZigZag

Он не встроен в терминал MT4, хотя и поставляется вместе с ним. Если взглянуть на график валютной пары, то прекрасно видно преимущества данного индикатора Forex.

Было бы здорово, если бы трейдер покупал внизу и продавать вверху точек излома индикатора  ZigZagа. Стратегию я такую не нашел. Поэтому просто проверю — действительно это так или нет. Но для начала необходимо сформулировать условия торговли: — покупаем когда ZigZag рисует линию вниз. — продаем когда ZigZag рисует линию вверх. — окончание линии ZigZagа анализируем при открытии следующей свечи — стоп-лосс ставим на 5 пунктов вниз или вверх от экстремума ZigZagа — тейк-профит ставим в 5 раз больше величины стоп-лосса — при образовании нового фрактала, стоп-лосс переносим вслед за ценой

Правила сформулировали, теперь можно заняться созданием советника форекс для Metatrader 4 на языке MQL4.
Читать полностью »

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

Доброе время суток, Уважаемые читатели!
Хотел сегодня рассмотреть очередного советника форекс, но понял, что мне надоело копировать функции из одного советника в другой. Поэтому сегодня рассмотрим что такое «Библиотеки функций MQL» и как с ними работать.

Для создания библиотеки функций MQL4 вызываем мастера создания советников в Metaeditor-е торгового терминала MT4:

Мастер создания библиотек

Вводим имя библиотеки функций (например MyLib):

Параметры библиотеки функций

Копируем в созданную библиотеку наши функции GetLot(), NewOrder(), DelOrders(), DelOrder(), EditOrder() и CloseOrder(). Компилируем и получаем ошибку: Читать полностью »

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

И так, продолжим изучать язык MQL4: сегодня мы разберемся как создавать советники форекс для MT4, на основе пользовательских индикаторов Metatrader 4. Для примера, попробуем создать советник форекс на основе индикаторов форекс по "Стратегии форекс «Линия баланса».

Создадим новый советник «expert2» и скопируем в него наши функции GetLot() и NewOrder().

Ордера в этой стратегии форекс закрываются по стоп-лоссу и поэтому функция CloseOrder() нам не нужна. Для начала необходимо изучить торговую стратегию. В ней сказано что торговля ведется только отложенными ордерами Buy Stop и Sell Stop.

Перепишем нашу функцию NewOrder() так, чтобы она умела открывать такие типы ордеров Forex — т.е. отложенные ордера Buy Stop и Sell Stop:

int NewOrder(int Cmd,double Lot,double PR=0,double TP=0,double SL=0)
{while(!IsTradeAllowed()) Sleep(100);
if(Cmd==OP_BUY)
{PR=Ask;
if(TP==0 && TakeProfit>0) TP=Ask+TakeProfit*Point;
if(SL==0 && StopLoss>0) SL=Ask-StopLoss*Point;}
if(Cmd==OP_SELL)
{PR=Bid;
if(TP==0 && TakeProfit>0) TP=Bid-TakeProfit*Point;
if(SL==0 && StopLoss>0) SL=Bid+StopLoss*Point;}
int tic=OrderSend(Symbol(),Cmd,Lot,PR,3,SL,TP,,0,0,CLR_NONE);
if(tic<0) Print(»Ошибка открытия ордера: ",GetLastError());
return(tic);}

Мы вынесли переменные для цены, тейк-профита, стоп-лосса в параметры функции и указали им значение по умолчанию «0». Теперь эту функцию можно вызывать как и раньше с 2 параметрами, а можно с указанием дополнительных параметров. Это нам пригодится для открытия отложенных ордеров форекс.

Кроме того в условии расчета тейк-профита и стоп-лосса мы проверяем эти параметры на соответствие «0». Это поможет избежать в дальнейшем ситуации когда мы передаем эти параметры, а функция их пересчитывает. Читать полностью »

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

На прошлом уроке Язык MQL — Урок 6 «эксперт Hedge Hog» мы написали советник Forex торгующий по стратегии Hedge Hog. Сегодня займемся его тестированием и оптимизацией в Metatrader.

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

Для этого необходимо выполнить следующие действия:
1. Проверить его на тестере стратегий MT4
2. Провести оптимизацию советника и проверить ее результат
3. Проверить, как работает советник форекс на демо-счете
4. Проверить советник на центовом счете форекс

Пункты 1,2,4 обязательны к выполнению! Пункт 3 желателен, но необязателен. Дело в том, что проверка на демо-счете и центовом счете занимают много времени. В отличии от тестера стратегий Metatrader 4 — торговля на них идет в реальном режиме времени. Поэтому один из этих этапов, начинающие трейдеры форекс частенько пропускают. Я настоятельно рекомендую НЕ пропускать 4 пункт - тестирование советника форекс на центовом счете. Советник может прекрасно работать на тестере и демо счете, а на реальном, как не странно, не торговать вовсе или «слить» ваш депозит. На реальном счете (центовый счет — это реальный счет с минимально разрешенными суммами депозита) присутствуют такие моменты, которых нет в тестере или на демо счете. Это отказы в обслуживании брокером форекс, проскальзывание цен и т.д.

Итак, начнем по порядку.

Запускаем тестер стратегий MT4 Запуск тестера , выбираем наш советник «expert1». Выбираем символ "EURUSD" как того требует стратегия Hedge Hog. Модель рекомендую выбрать "Все тики" как наиболее точный метод тестирования. Указываем интервал дат истории для тестирования. Я указал за декабрь месяц 2009 года. Выбираем Период на котором будет работать наш советник. Я выбрал часовой, хотя для нашего советника это не важно.

Настройки тестирования

Нажимаем кнопочку «Старт» и ждем окончания процесса тестирования советника.
У меня советник не совершил ни одной сделки. А в журнале появилось много ошибок. Дело в том что я использовал сервер Алпари для тестирования. У них 5 значные котировки, а стратегия «Hedge Hog» писалась для 4 значных котировок.

Это легко исправимо. Достаточно тейкпрофит увеличить в 10 раз (вместо 14 пунктов указать 140 пунктов). Нажимаем кнопочку «Свойства эксперта» и в появившемся окошке изменяем.

Свойства советника

Нажимаем «OK» и запускаем тестирование еще раз.
Теперь появились сделки. Открываем график: Читать полностью »

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

Как я и обещал, сегодня мы займемся написанием эксперта Hedge Hog на языке MQL, но сначала давайте объединим уже полученные ранее знания и напишем собственные функции на MQL4.

Сразу возникает вопрос: «Что это нам даст?»

Ну во первых это уменьшит количество строк в нашем советнике для Metatrader 4. Во вторых можно не тратить время при написании следующих советников форекс, а просто использовать ранее написанные функции в новом коде.

Функции MQL4 — это кирпичики из которых можно легко сложить рабочий эксперт MT4, не отвлекаясь каждый раз на одну и ту-же работу.

Расчет лота в MT4, поместим в функцию — "Функция расчета лота":
double GetLot(int Risk)
{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*Risk/100/One_Lot/Step)*Step;
 if(Lot<Min_Lot) Lot=Min_Lot;
 if(Lot>Max_Lot) Lot=Max_Lot;
 if(Lot*One_Lot>Free) return(0.0);
return(Lot);}

Обратите внимание на строчку: if(Lot*One_Lot>Free) return(0.0);

В ней мы производим проверку на достаточность средств на торговом счету форекс. И если их окажется недостаточно, возвращаем 0.

Для открытия ордера Metatrader 4, при помощи советника форекс,  напишем функцию — "Функция открытия ордера":
int NewOrder(int Cmd,double Lot)
{double TP=0; //тейкпрофит
 double SL=0; //стоплосс
 double PR=0; //Цена
 while(!IsTradeAllowed()) Sleep(100);
 if(Cmd==OP_BUY)
   {PR=Ask;
    if(TakeProfit>0) TP=Ask+TakeProfit*Point;
    if(StopLoss>0) SL=Ask-StopLoss*Point;}
 if(Cmd==OP_SELL)
   {PR=Bid;
    if(TakeProfit>0) TP=Bid-TakeProfit*Point;
    if(StopLoss>0) SL=Bid+StopLoss*Point;}
 int tic=OrderSend(Symbol(),Cmd,Lot,PR,3,SL,TP,"«,0,0,CLR_NONE);
 if(tic<0) Print(»Ошибка открытия ордера: «,GetLastError());
return(tic);}

В этой функции на языке MQL мы использовали новые для нас команды MQL4:

Print() — Выдать сообщение в журнал.

GetLastError() — Номер последней ошибки.

Никогда не помешает знать об возникновении ошибки для будующей отладки эксперта. Кроме того мы поручили нашей функции MQL4 самой определять цену по типу ордера, расчет тейкпрофита и стоплосса.

Функция start() нашего скрипта сильно упростится:

 double Lot=GetLot(MaxRisk);
 if(Lot==0) {Alert(»Недостаточно средств!");return(0);}
 RefreshRates();
 if(Buy)  NewOrder(OP_BUY,Lot);
 if(Sell) NewOrder(OP_SELL,Lot);

Новая функция RefreshRates() — функция обновления данных в предопределенных переменных (Ask, Bid и т.д.) При запуске нашего скрипта в окне терминала Metatrader появляется окошко с параметрами. Пока мы их изменяем цена может изменится. Вот мы и обновим ее значение в переменных.

Теперь займемся советником Hedge Hog.

Для начала изучим: Стратегию Hedge Hog.

На первый взгляд — все просто. Нужно открывать каждый торговый день ан форекс, с понедельника по пятницу в 00:00 по GMT, два рыночных ордера в противоположные стороны (один на покупку, второй на продажу) без стоп-лоссов и с тейк-профитами в 14 пунктов равным объемом по валютной паре EURUSD.

Итак, для создания советника MT4, запускаем мастер в редакторе MetaEditor:

Мастер создания экспертов в редакторе MetaEditor

выбираем «Советник» и нажимаем «Далее>» Читать полностью »

Вопрос №3

Как работать со сложными индикаторами?

Сложный индикатор Metatrader 4 — это пользовательский индикатор форекс, который строится не на основании цены, а на основании показаний другого индикатора MT4.

В торговом терминале MetaTrader такие индикаторы создаются наложением одного индикатора форекс на другой. В MQL для этих целей предназначены функции ...OnArray.

Например для расчета Moving Average на основании показаний индикатора RSI используем:
double rsiBuf[20];
ArraySetAsSeries(rsiBuf,true);
for(i=0;i<20;i++) rsiBuf[i]=iRSI(NULL,0,8,PRICE_CLOSE,i);
double ma1=iMAOnArray(rsiBuf,0,14,0,MODE_SMA,1);

Таким образом можно строить целые цепочки индикаторов  форекс в Metatrader 4. Обратите внимание что значений в буфере должно быть больше чем период следующего индикатора.

  • Комментарии к записи Вопрос №3 отключены
  • В рубриках: FAQ по MQL и Metatrader
  • Вопрос №2

    Посмотрите мой код:
    for(int i=0;i<OrdersTotal();i++)
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        OrderClose(...);
    Почему при его выполнении закрываются не все ордера, а через один?

    Дело в том, что при закрытии ордера Форекс в Metatrader 4 или удалении отложенного ордера Buy Stop или Sell Stop - позиция оставшихся смещается. 

    Представим, что у нас есть 3 ордера Forex. Их позиции изначально: 0, 1, 2. При закрытии ордера в позиции 0 следующие ордера будут иметь позиции 0,1. Цикл же этого не учитывает и при следующем проходе будет попытка закрыть ордер в позиции 1. Поэтому более правильным вариантом на MQL будет следующий:
    for(int i=OrdersTotal() −1;i>=0;i--)
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        OrderClose(...);