MQL для чайников, программирование на MQL4, MQL5
24 Авг
Будет ли работать советник форекс, если я закрою терминал Metatrader 4? Можно ли сделать так, чтобы советник MT4 работал при выключенном компьютере?
Подобных вопросов довольно много. Отвечу сразу: советники форекс работают пока запущен терминал Metatrader 4. Но есть возможность заставить их работать и при выключенном компьютере. Для этого арендуется VPS (виртуальный выделенный сервер).
Сразу возникают вопросы: А где его взять? А как с ним работать?
Брокерская компания Forex4you предлагает заказать VPS прямо в личном кабинете. В Интернете полно предложений по аренде VPS или VDS (VDS это выделенный сервер, а не виртуальный. Поэтому цена его аренды приличная). Достаточно набрать в любом поисковике слово «VPS» и выбрать наиболее понравившееся предложение. Когда Вы выберете тариф (можно самый дешевый, но обязательно с установленной операционной системой Windows !!! т.к. Metatrader 4 работает только на этой операционной системе) и оплатите его Вам на почту придет письмо с IP адресом, логином и паролем. Обычно тут и возникают вопросы (что делать дальше?)
Опишу как настроить свой VPS и работать с ним:
Для начала подключимся к нашему VPS. Для этого запустим программу «Подключение к удаленному рабочему столу»
Введем IP адрес
Введем логин и пароль
Мы попали на рабочий стол удаленного компьютера (нашего VPS)
В принципе дальнейшая работа ничем не отличается от работы с Вашим локальным компьютером.
Теперь давайте поговорим о Безопасности VPS.
Хакеры прекрасно знают об этой технологии, а кому хочется подарить своего советника неизвестно кому? Да и платим мы. Поэтому не дадим свой виртуальный сервер никому. Кроме того существуют вирусы, но ресурсы нашего VPS сильно ограничены. Нормального антивируса не поставишь.
Рассмотрим как нас могут атаковать:
1. Хакеры используют программы которые ищут открытые стандартные порты
2. Хакеры используют стандартное имя пользователя «Администратор»
3. Простые пароли подбираются программой
4. Вирусы используют «дыры» в операционной системе
5. Вирусы используют любопытство пользователя (предлагают что-то посмотреть и т.д.)
Начнем защищаться VPS с конца списка. Чтобы вирус не проник на Наш VPS:
1) не будем ставить посторонние программы (любые кроме терминала Metatrader 4).
2) Читать почту на VPS не будем.
3) Интернет странички с VPS открывать не будем.
4) Операционная система прекрасно умеет обновляться сама, поэтому как только она предложит установить обновления — будем соглашаться.
Этого достаточно чтобы защититься от вирусов. И антивирус не нужен!
Теперь займемся защитой VPS от хакеров. Пароль надо придумать сложный (более 8 символов, а лучше 12−15 символов) состоящий из больших и маленьких букв и цифр (например: R73jf5Kms2Ua). Имя пользователя надо будет сменить на нестандартное (например: Ivan934). Изменить стандартный порт на произвольный (например: 5567)
После этого хакеры не будут подозревать о нашем существовании, но если и узнают, то замучаются подбирать имя пользователя и пароль.
Настраивать начнем с файрволла (в Windows его называют «брандмауэр»). Хотя везде и пишут что он ненадежен, но на самом деле основная проблема заключается в его правильной настройке. Итак открываем «панель управления»:
Находим «Брандмауэр» и запускаем его:
25 Мар
Столкнулся с проблемой и вот уже третий день бьюсь и решить не могу. В готовом советнике решил вместо лота ввести % риска, поэтому нужен расчёт лота к стопу, например при депо 10 000 риск 1% при стопе 100 пп это будет примерно лот 0.1 а вот при стопе 200 лот уже лот должен быть 0.05, для того чтобы риск 1% остался на том же уровне. Надеюсь всё понятно изложил.
Для расчета лота в зависимости от стоплосса мы должны знать стоимость 1 пункта.
Расчет стоимости пункта
Все валютые пары можно условно разделить на три категории — пары с обратной котировкой (EURUSD, GBPUSD), пары с прямой котировкой (USDJPY, USDCHF) и кросс-курсы (GBPCHF, EURJPY и т.п.).
1. Для валютных пар с обратной котировкой стоимость пункта, выраженная в долларах, рассчитывается по формуле
PIP = LOT_SIZE * TICK_SIZE,
где LOT_SIZE — размер лота, TICK_SIZE — размер тика.
Для валютных пар с обратной котировкой стоимость пункта постоянна и не зависит от текущей котировки.
Пример:
Для EURUSD размер лота 100,000 евро, размер тика — 0.0001
PIP = 100,000 * 0.0001 = $10.00
2. Для валютных пар с прямой котировкой стоимость пункта, выраженная в долларах, рассчитывается по формуле
PIP = LOT_SIZE * TICK_SIZE / CURRENT_QUOTE,
где LOT_SIZE — размер лота, TICK_SIZE — размер тика, CURRENT_QUOTE — текущая котировка пары.
Для валютных пар с прямой котировкой стоимость пункта меняется в зависимости от текущей котировки.
Пример:
Для USDJPY размер лота 100,000 долларов, размер тика — 0.01. При котировке USDJPY 114.66
PIP = 100,000 * 0.01 / 114.66 = $8.72
3. Для кросс-курсов стоимость пункта, выраженная в долларах, рассчитывается по формуле
PIP = LOT_SIZE * TICK_SIZE * BASE_QUOTE / CURRENT_QUOTE,
где LOT_SIZE — размер лота, TICK_SIZE — размер тика, BASE_QUOTE — текущая котировка базовой (первой) валюты к доллару США, CURRENT_QUOTE — текущая котировка пары.
Для кросс-курсов стоимость пункта меняется в зависимости от текущих котировок как самой пары, так и базовой валюты.
Пример:
Для GBPJPY размер лота 100,000 фунтов, размер тика — 0.01, базовая валюта — GBPUSD. При котировке GBPJPY 230.82 и котировке GBPUSD 2.0107
PIP = 100,000 * 0.01 * 2.0107 / 230.82 = $8.71
Разработчики MetaTrader позаботились об этом и предоставили нам функцию: MarketInfo(Symbol(),MODE_TICKVALUE) — стоимость 1 пункта в валюте депозита для 1 лота. Напишем скрипт для расчета лота:
//±-----------------------------------------------------------------+
//| Расчет лота в зависимости от размера стоплосса |
//| Copyright © 2010. |
//| http://mql4you.ru |
//±-----------------------------------------------------------------+
#property copyright "Copyright © 2010."
#property link "http://mql4you.ru"
#property show_inputs
extern int MaxRisk=2;
extern int StopLoss=100;
//±-----------------------------------------------------------------+
int start()
{double Free =AccountFreeMargin();
double LotVal =MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта для 1 лота
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)/(StopLoss*LotVal)/Step)*Step;
if(Lot<Min_Lot) Lot=Min_Lot;
if(Lot>Max_Lot) Lot=Max_Lot;
Alert(Lot);
return(0);}
//±-----------------------------------------------------------------+
Скачать скрипт: lotstop.mq4
17 Мар
Добрый день! В интернете полно стратегий для 3 часового или 6 часового тайм-фрейма. В MetaTrader 4 нет таких интервалов. Там после часового идет 4 часовой, а после 4 часового идет дневной. Можно ли как-нибудь настроить нестандартный таймфрейм?
Отвечаю: Нестандартный тайм-фрейм в MT4 настроить Можно!
Опишу пример открытия 3 часового графика для валютно пары GBPUSD. Первое что нужно сделать — это открыть часовой график необходимой нам валюты:
После этого запускаем скрипт period_converter.mq4 (он есть в стандартной поставке терминала Metatrader 4)
Указываем множитель (количество свечей в необходимом нам периоде):
Нажимаем кнопочку «OK». После этого идем в меню Файл — Открыть автономно:
Откроется окно:
Находим в нем выбранную нами валютную пару и тайм-фрейм H3. Нажимаем кнопочку «Открыть».
В итоге получаем 3 часовой график для GBPUSD:
19 Фев
Размер каталога в который установлен MetaTrader постоянно растет. Что можно почистить для уменьшения размера?
Эта проблема не только терминала MetaTrader, но и многих других программ. Дело в том, что терминал MT4 сохраняет поступающие котировки валют, журналы работы и другие служебные данные. Объемы современных жестких дисков позволяют хранить эту информацию особо не переживая за ее размер. Но если для Вас размер является критическим, то можно почистить следующие папки:
C:\Program Files\<каталог терминала>\history\*.* — история котировок
C:\Program Files\<каталог терминала>\logs\*.* — журналы работы терминала
C:\Program Files\<каталог терминала>\mailbox\*.* — почтовый ящик
C:\Program Files\<каталог терминала>\deleted\*.* — история открытых и в последствии удаленных графиков
C:\Program Files\<каталог терминала>\experts\logs\*.* — журналы работы экспертов
C:\Program Files\<каталог терминала>\tester\history\*.* — история работы тестера
C:\Program Files\<каталог терминала>\tester\logs\*.* — журналы работы тестера
Для себя я сделал командный файл для очистки этих папок: clear.bat
И один раз в неделю запускаю его. Так как я много пишу советников для Metatrader 4 и разумеется приходится их постоянно тестировать и оптимизировать, соответственно за неделю каталог с установленным у меня терминалом МТ4 вырастает от десятка Мегабайт до одного Гигабайта — на помощь мне и приходит командный файл clear.bat.
3 Фев
Что значит 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 | Ошибка при работе с объектом |
1 Фев
Добрый день!
Подскажите как выключить компьютер из 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
12 Янв
Как работать со сложными индикаторами?
Сложный индикатор 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. Обратите внимание что значений в буфере должно быть больше чем период следующего индикатора.
12 Янв
Посмотрите мой код:
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(...);
12 Янв
Я нашел ошибку: при делении 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