Документация по MQL4

 
Renat 24.05.05 08:41

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

Вероятно, к концу июля будет первая версия.


Действительно, и на сайте появились статьи, и индикаторы и описание функций с примерами в MetaEditor.
Вместе стем, пользуясь этими сведениями грамотно написать эксперта очень трудно.

Я не хотел бы, чтоб моё сообщение выглядело как придирки или нападки на на разработчиков. МТ4 - замечательный, уникальный в своём роде инструмент, предоставляющий массу возможностей. Очень хочется ими воспользоваться, но не всегда понятно как это сделать..

Я написал не менее 2 десятков работающих экспертов и индикаторов разной степени сложности на MQL II, можно сказать, имею некоторый опыт. В настоящее время использую 2-3. Мой ДЦ планирует в ближайшее время переходить на MT4, поэтому вопрос о перенаписании старого кода на MQL4 стоит остро.

Однако, я не могу этого сделать по причине отсутствия в имеющейся документации на MQL4 важных сведений.
Вот, например, какие сведения предоставляет пользователю встроенный в MetaEditore help о функциях init, deinit и start:
Сразу же после присоединения к графику программа начинает работу с функции init(). Функция init(), присоединенная к графику программы, запускается также сразу после старта клиентского терминала и в случае смены финансового инструмента и/или периода графика.

Каждая присоединенная к графику программа завершает работу функцией deinit(). Функция deinit() запускается также при завершении работы клиентского терминала, при закрытии графика, а также непосредственно перед сменой финансового инструмента и/или п ериода графика.

При поступлении новых котировок выполняется функция start() у присоединенных советников и пользовательских индикаторов. Если при поступлении новых котировок выполнялась функция start(), запущенная на предыдущей котировке, то очередной вызов функции start() выполнится только после инструкции return(). Все пришедшие во время выполнения программы новые котировки программой игнорируются.

Отсоединение программы от графика, смена финансового инструмента и/или периода графика, закрытие графика, а также завершение работы клиентского терминала прерывает выполнение программы.

Выполнение скриптов не зависит от приходящих котировок.


Таким образом, о функции init() известно лишь то, что она "запускается". Мне кажется, это всё равно, что в инструкции по вождению автомобиля написать, что у него есть колесо и этим ограничиться!
Можно ли на основе этих сведений грамотно написать эксперт?

Почему-то на сегодняшний день считается хорошим тоном в случае возникновения подобных вопросов отсылать пользователя на форум. Сразу хочу ответить, что я потратил несколько дней в поисках ответов на аналогичные вопросы на форуме и ответа не нашёл.
По этому поводу у меня 2 замечания.
1. Приципиальное. Без всяких сомнений форум очень полезен, в ряде случаев это действительно единственный источник информации, последняя надежда. Но! Форум - не место для публикации документации, а место для обсуждения ранее опубликованной документации и особенностей её применения.
2. Практическое. Позиция разработчиков "мы не успеваем" не оправдана, поскольку легче один раз дать подробную инструкцию, нежели ежедневно отвечать на одни и те же вопросы на форуме без всякой надежды этот поток вопросов уменьшить.

Мне представляется, что при правильном подходе к делу в том же хелпе должен появиться подраздел, именованый "Назначение, необходимость и правила использования специальной функции init()", где на 1-2 стр. текста должны быть изложены эти правила. При таком положении вещей разработчики будут иметь моральное право отетить на форуме "Внимательно изучайте документацию".
----------------------------------------------
Другой пример.
Мои эксперты на MQL II построены на пользовательских функциях. Насколько я понял (не знаю правильно ли, нигде ж не написано), понятие "пользовательская функция" в MQL4 упразднено. Зато появились скрипты. И вместе с ними появился целый букет вопросов:
1. Скрипт - это нечто такое, что вместо пользовательской функции?
2. Каково его назначение? Можно ли в нём использовать те или иные функции?
(пользовательские функции и индикаторы в MQL II были описаны по-человечески., в т.ч. указывалось, что в iCustom нелья использовать торг. функции, польз. ф-ию, а в UserFunction параметры передаются в той последовательности, что в Inputs и т.д.)
А что известно о скриптах? Что "Выполнение скриптов не зависит от приходящих котировок"?:) А от чего оно зависит?
3. Как практически использовать скрипт? Простой вопрос. Может ли скрипт быть запрошен и запущен из эксперта? Нет? Тогда чем скрипт отличается от эксперта? В описании некоторых ф-ий читаем "Это значение будет верным только в том случае, если эксперты, пользовательские индикаторы и скрипты прикреплены с помощью мыши". А как ещё? Программно? Но как именно?
4. Читаю на форуме о других возможностях использования подпрограмм - через DLL, но как и по каким правилам её созавать и как использовать не понятно.
.. и т.д
Эти простые сведения нигде не описаны. Можно ли при этом грамотно написать программу?
---------------------------------------------
Терминология.
Все понятия, кот используются для описания MQL должны быть определены. Неопределённых же достаточно.
Например, в описании ф-ии WindowOnDropped( ) читаем:"Возвращает индекс окна, в котором прикреплен эксперт, пользовательский индикатор или скрипт". Возникает вопрос: что такое "индекс окна"? Где это узнать?
Получается, что нужен Словарь терминов.
---------------------------------------------

Уважаемые разработчики! Вы создали замечтельный инструмент, как супер-межгалактический космический корабль, с множеством рычажков, кнопочек, лампочек, но беда в том, что неизвестно как этими средствами воспользоваться, поэтому никто на вашем корабле никуда и не полетит (десяток завсегдатоев форума не в счёт, речь о тысячах простых юзеров). Вам самим не обидно?

Вывод (и одновременно всё та же просьба к разработчикам) один: имеется настоятельная потребность в толковой Документации по MQL4. Если нет возможности сделать всё одним махом, то делайте постепенно, выкладывая завершённые фрагменты на сайте и в очередных билдах.

С наилучшими пожеланиями, СК.
 
ОК.
Производители не сочли нужным ответить. Но со своим уставом в чужой дом не ходят, придётся пользоваться здешним, т.е. использовать форум для ликбеза. Ничего не поделаешь.

Обращаюсь к пользователям МТ4, имеющим представление об MQL4.
Не сочтите за труд объяснить что это за функции такие : init() и deinit() ?
Каково их назначение?
Почему в одних случаях они используются, а в других нет?
 
К сожалению, Вы совершенно не читаете существующую документацию и при этом жалуетесь на ее отсутствие. И даже не ввели слово start в поиске по сайту: "Поиск по сайту"

1. Функции — MetaQuotes Language 4
Функции MetaQuotes Language 4: определение функции, вызов функции, специальные функции init, deinit и start.

"Функции"


2. Forex / Форекс Трейдинг: Пример Эксперта MQL 4 — Expert Advisors
Forex / форекс трейдинг: пример эксперта MQL4 - Expert Advisors. Принципы построения пользовательских программ на языке MQL 4. В данной механической торговой системе также рассмотрены примеры реализации таких функций как выставление уровней тейкпрофита с поддержкой трейлинг-стопа.

"Пример Эксперта"


3. Особенности Написания Пользовательских Индикаторов — Статьи по MetaQuotes Language 4
Написание пользовательских индикаторов в торговой системе MetaTrader 4 также имеет ряд особенностей.

"Особенности написания Пользовательских Индикаторов"


4. Инсталляция MetaTrader 4 Data Center
Инсталляция MetaTrader 4 Data Center: Создание специального прокси-сервера MetaTrader Data Center посвящено решению актуальной проблемы при совместной работе нескольких пользователей - экономии траффика. Данная статья будет особенно интересна администраторам дилинговых залов, локальных сетей, а также провайдерам и пользователям клиентского терминала.

"Инсталляция MetaTrader 4 Data Center"


5. Переменные — MetaQuotes Language 4
Переменные MetaQuotes Language 4: описания, определение локальных переменных, определение глобальных переменных, инициализация переменных, описание внешних объектов.

"Переменные"


"Функции"
Специальные Функции init, deinit и start
Сразу же после присоединения к графику программа начинает работу с функции init(). Функция init(), присоединенная к графику программы, запускается также сразу после старта клиентского терминала и в случае смены финансового инструмента и/или периода графика.


Каждая присоединенная к графику программа завершает работу функцией deinit(). Функция deinit() запускается также при завершении работы клиентского терминала, при закрытии графика, а также непосредственно перед сменой финансового инструмента и/или периода графика.

При поступлении новых котировок выполняется функция start() у присоединенных советников и пользовательских индикаторов. Если при поступлении новых котировок выполнялась функция start(), запущенная на предыдущей котировке, то очередной вызов функции start() выполнится только после инструкции return(). Все пришедшие во время выполнения программы новые котировки программой игнорируются.

Отсоединение программы от графика, смена финансового инструмента и/или периода графика, закрытие графика, а также завершение работы клиентского терминала прерывает выполнение программы.
 
К сожалению, Вы совершенно не читаете существующую документацию и при этом жалуетесь на ее отсутствие. И даже не ввели слово start в поиске по сайту: "Поиск по сайту"


Напрасно Вы так.
Полагаю, в данном случае Вы не правы.

К тому списку ссылок, кот. Вы приводите, можно добавить, что содержание большинства из них полностью скопировано в help, встроенный в MetaEditor. Я полностью прочёл не только все ссылки на сайте, но и весь help.
Насколько я понимаю, Вы лишь бегло просмотрели моё предыдущее сообщение, поэтому не обратили внимание, что там приводится та же цитата, что и последняя в Вашем сообщении. Там же я изложил своё представление о полноте содержания этого текста.

Таким образом, следующие вопросы для меня остаются не выясненными:
1. Каково назначение специальных функций init() и deinit() ?
2. Почему в одних случаях они используются, а в других нет?
3. Особенности их использования (если таковые имеются).
 
Еще раз повторю:
Специальные Функции init, deinit и start

Сразу же после присоединения к графику программа начинает работу с функции init(). Функция init(), присоединенная к графику программы, запускается также сразу после старта клиентского терминала и в случае смены финансового инструмента и/или периода графика.


Каждая присоединенная к графику программа завершает работу функцией deinit(). Функция deinit() запускается также при завершении работы клиентского терминала, при закрытии графика, а также непосредственно перед сменой финансового инструмента и/или периода графика.

При поступлении новых котировок выполняется функция start() у присоединенных советников и пользовательских индикаторов. Если при поступлении новых котировок выполнялась функция start(), запущенная на предыдущей котировке, то очередной вызов функции start() выполнится только после инструкции return(). Все пришедшие во время выполнения программы новые котировки программой игнорируются.
 
Замечательно:)
Даже я бы сказал, это становится забавным.

Ренат..
 



При поступлении новых котировок выполняется функция start() у присоединенных советников и пользовательских индикаторов. Если при поступлении новых котировок выполнялась функция start(), запущенная на предыдущей котировке, то очередной вызов функции start() выполнится только после инструкции return(). Все пришедшие во время выполнения программы новые котировки программой игнорируются.


Я правильно понимаю что при игнорировании терминал теряет эти котировки и начнет выполнять функцию start() уже после прихода следующей за проигнорированными котировки?
 
терминал теряет

Терминал ничего не теряет (терминал многозадачный), а вот занятый эксперт не получает уведомления о том, что появилась новая котировка. Но, если эксперт использует ожидания (торговые операции или Sleep) и вызывает RefreshRates, то он конечно же получает доступ к реальному состоянию рыночной ситуации.

Если эксперт тормозит или вызывает Sleep по несколько секунд, то терминал не будет явно уведомлять эксперта о приходе новой котировки. Эксперт, занимающий непозволительно много времени (больше долей секунды), должен самостоятельно заниматься обновлением своего "снимка/snapshot" рыночной ситуации через вызов RefreshRates.
 
ОК.
А можно прибл. такими же словами о ф-иях init и deinit ?
Я и правда не понимаю их назначение. Но есть надежда, что я не совсем тупой и пойму достаточно быстро.
Хотя бы немного комментариев?
 
Если по логике построения индикатора/эксперта есть смысл в первоначальных приготовлениях (начальный расчет, открытие файла и тд), то все это можно сделать в функции init, которая по сути является конструктором. Соответственно, если по логике необходимо осуществить некие завершающие действия (например, закрытие файла) в конце эксперта, то их можно поместить в функцию deinit (деструктор).

Функции init и deinit можно удалять из кода программы, так как они факультативны.

Настоятельно не рекомендуется пытаться проводить какие либо торговые операции или массовые перерасчеты рыночных данных в функциях init и deinit. В функции init можно запросто наткнуться на отсутствие исторических данных. Функции init и deinit должны отрабатываться максимально быстро и ни в коем случае не должны делать Sleep. Init и deinit предназначены для быстрой подготовки/завершения эксперта. Также не рекомендуется в init ставить начальный запуск основного тела эксперта из функции start.
 
Большое спасибо. Теперь понятно.
Чтобы полностью разобраться в общей логике построения программ на MQL4 хотелось бы ещё уточнить:

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

2. В инструкции к #include <имя_файла> написано, что "Препроцессор заменяет эту строку содержимым файла".
Следует ли понимать "заменяет" буквально? Т.е. значит ли это, что созданный таким образом эксперт будет идентичен такому эксперту, в кот. вместо #include <имя_файла> непосредственно содержится собственно код этого файла?
-Если да, то к какой из спец. ф-ий будет относиться эта чать кода эксперта?
-Если нет, то как понимать "заменяет"?
-Может ли подключённый таким способом файл содержать торговые ф-ии?
-Каковы другие ограничения и особенности?

(если на какие-либо мои вопросы есть подробные инструкции на сайте или в helpе, можно просто указать ссылку)
Причина обращения: