Лучше один раз увидеть: яркие отличия MQL5 от MQL4

 

До сих пор не написал ни одного боевого советника на MQL5. Даже не знаю, почему так несправедливо вышло...

 

Видел мнение, что одно и то же ТЗ юзера на MQL4 стоит реализовать дешевле (по деньгам и, видимо, по времени и нервам), чем на MQL5. Это вполне возможно (разность стоимостей), т.к. даже в страшном сне сложно представить, что эти юзеры хотят. Поэтому своей замечательной библиотекой на "все случаи жизни" обойтись не всегда должно получаться.

 

Вот когда пишешь для себя любимого, то, вроде, все гораздо проще. Сам и мыслишь для себя логично и кодишь соответственно.

 

Если упустить вопросы реализации виртуализации ордеров, а говорить только о боевой части одной ТС для себя, то какие самые яркие отличия MQL5 от MQL4? Или это надуманно, и достаточно себе любимому написать один раз хорошую библиотеку, забыв потом про номер MQL? 

 

1. Что чаще всего требуется - получения цены с графика.

В МТ4 это Close[i] или iClose(NULL,0,i), просто взял значение и все. Учитывая, что пользователь сначала открывает график, при этом будет разумно и естественно дождаться обновления данных, дальше терминал сам обеспечивает свежесть данных и т.о. доступ к цена график на котором висит советник происходит без проблем. Выполнение каких-либо проверок не требуется и не подразумевается самой функций  iClose(). Т.е. программист вообще не заморачивается проблемами получения данных цены.

В МТ5 это выполняется функцией  CopyClose() или CopyRates(), функции возвращают true/false, что намекает на то, что может и не получиться скопировать, т.е. надо проверять результат и в случае неудачи принимать меры. Т.е. такое вот элементарнейшее действие разветвляет алгоритм. Можно и начале функции скопировать все требуемые данные, но это будет означать что во многих случаях будут выполняться ненужные действия, потому-что не всегда все нужно.

2. Получение данных индикаторов.

В МТ4 достаточно один раз написать вызов iCustom() для какого-нибудь индикатора и все, дальше копируешь туже функцию и если надо меняешь буфер и индекс. Т.е. требуется быть внимательным один раз.

в МТ5 сначала надо загрузить индикатор  и получить его хэндл. По трудозатратам это аналогично вышеописанному пункту для МТ4. Далее, для получения значения требуется вызывать функцию CopyBuffer(), т.е. надо быть внимательным второй раз. Функция может вернуть true/false, значить требуется проверка, опять разветвление алгоритма.

3. Собственно эксплуатация советника.

Известно, что в МТ4 очень просто обеспечить независимую работу нескольких советников, в МТ5 же это же вообще не реально. Значит в МТ4 просто запускаешь еще одного советника. Потом смотришь, оставить или снять. При это, естественно, работающие советники как работали так и работают. В МТ5 запуск советника, это событие, потому-что может работать только один советник. Поэтому надо семь раз отмерить, прежде чем снять одного советника и запустить другого.

4. Сейчас не знаю как обстоит дело, но было... В МТ5 после открытия позиции, в списке истории еще отсутствуют данные об ордере и сделке, требуется какая-то доля секунды. Это усложняет алгоритм. В МТ4 на одном тике можно последовательно выполнить много действий, в МТ5 надо усложнять алгоритм (делать ожидание обновления списка) или же учитывать по результату OrderSend(). Этот пункт кому-то может показаться неубедительным, но это не удивительно, найдется кто-нибудь кому и пункты 1-3 будут не убедительны.

5. Взгляд на работу советника с точки зрения статистики. МТ4 позволяет отработать все  торговые сигналы независимо, что дает более достоверный результат при оценке аналитической части советника.

6. ArraySort() в МТ4 позволят сортировать многомерные массивы по первому измерению, в МТ5 только одномерные сортируются.

7. Тестер. Отладка советника в тестере. В МТ4 полноценный график, можно графические объекты создавать... значки сдвигать... все как по настоящему. В МТ5 возможности работы с графиком ограничены.

8. Время графических объектов. В МТ4 скопировал мышкой и вставил в код. В МТ5 за один мах мышкой время не скопируешь, приходится набирать вручную. 

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

10. МТ4 через год (когда узнал о нем) после своего появления был полностью в рабочем состоянии и не менялся. В МТ5 годами выполнялись значительные принципиальные изменения. Сначала убрали параметры PositionSelet(), что потребовало переделки написанных советников, потом меняли идентификаторы из-за чего некоторые советники снова требовали переделки. Может и другие какие изменения, за всем не уследишь. 

Еще немного.

В МТ4 переменные Point, Digits... В МТ5 эти же переменные начинаются с подчеркивания. Это выглядит как будто это все кто-то наскоряк на шару придумал... а экспертописателям их ставить, пальцы топырить. Мелочь конечно, но как-то раздражает. Чувствуется непродуманность.

В МТ5 доступ к разным данным через идентификаторы. Чтобы получить одно значение надо сначала написать функцию с названием в пол экрана, потом еще идентификатор написать размером еще пошире чем пол экрана. Эта проблема решается использованием стандартных классов, но там свои "моментики", не все названия очевидны, например у класса работы с позицией были методы Type и PositionType (как-то так). Для определения направления позиции используется метод PositionType, а не Type. Мелочь конечно, но все это требует повышенного внимания и потребляет энергию.

 
Integer:

1. Что чаще всего требуется - получения цены с графика.

В МТ4 это Close[i] или iClose(NULL,0,i), просто взял значение и все. Учитывая, что пользователь сначала открывает график, при этом будет разумно и естественно дождаться обновления данных, дальше терминал сам обеспечивает свежесть данных и т.о. доступ к цена график на котором висит советник происходит без проблем. Выполнение каких-либо проверок не требуется и не подразумевается самой функций  iClose(). Т.е. программист вообще не заморачивается проблемами получения данных цены.

В МТ5 это выполняется функцией  CopyClose() или CopyRates(), функции возвращают true/false, что намекает на то, что может и не получиться скопировать, т.е. надо проверять результат и в случае неудачи принимать меры. Т.е. такое вот элементарнейшее действие разветвляет алгоритм. Можно и начале функции скопировать все требуемые данные, но это будет означать что во многих случаях будут выполняться ненужные действия, потому-что не всегда все нужно.

Якобы "простой" метод Close[i] в MetaTrader 4 в разы дольше, чем CopyClose() в пятерке за счет того, что обычно нужно делать много запросов в историю.

То есть, аналитический перебирающий бары код в пятерке заведомо быстрее в разы за счет прямой работы с локальным массивом. Особенно это важно с учетом доступности глубокой истории, которую надо постоянно прочесывать. И еще более важно, что можно запрашивать только нужный объем истории (100 баров вместо хх миллионов), а не автоматически принудительно создавать копию истории текущего чарта, реально тормозя отработку пришедшего тика.

Вы хоть в курсе, что в четверке работает автоматический механизм репликации текущего чарта в область рыночного окружения эксперта? Так вот в пятерке этого нет, что экономит много ресурсов.


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

И в MQL4 надо вообще-то проверять результат обращения к истории. А можно и в пятерке не проверять - это зависит от качества программиста. Обманывать себя придумками про ненужность проверок не надо.


2. Получение данных индикаторов.

В МТ4 достаточно один раз написать вызов iCustom() для какого-нибудь индикатора и все, дальше копируешь туже функцию и если надо меняешь буфер и индекс. Т.е. требуется быть внимательным один раз.

в МТ5 сначала надо загрузить индикатор  и получить его хэндл. По трудозатратам это аналогично вышеописанному пункту для МТ4. Далее, для получения значения требуется вызывать функцию CopyBuffer(), т.е. надо быть внимательным второй раз. Функция может вернуть true/false, значить требуется проверка, опять разветвление алгоритма.

В пятерке никаких проблем - создаешь однократно индикатор, получаешь его хендл и потом всегда можешь быстро извлекать из него данные. Аналогично пункту первому - в пятерке преимущество в скорости работы и экономии памяти.

Контроль результатов аналогично пункту первому - в пятерке больше контроля. И если разработчик безбашенный и верит, что "данные всегда есть в четверке", то и в пятерке может не проверять.



3. Собственно эксплуатация советника.

Известно, что в МТ4 очень просто обеспечить независимую работу нескольких советников, в МТ5 же это же вообще не реально. Значит в МТ4 просто запускаешь еще одного советника. Потом смотришь, оставить или снять. При это, естественно, работающие советники как работали так и работают. В МТ5 запуск советника, это событие, потому-что может работать только один советник. Поэтому надо семь раз отмерить, прежде чем снять одного советника и запустить другого.

Запускайте сколько хотите экспертов на разных символах. Если хотите на одном символе торговать множеством советников, то лучше подумайте над практической целесообразностью и откажитесь. Обманывать себя теоретической возможностью не надо - это кончается печально в трейдинге.

Если есть сильная потребность, то легко пишется виртуализатор, которые еще и спред будет здорово экономить. Это уже неоднократно обсуждалось.


4. Сейчас не знаю как обстоит дело, но было... В МТ5 после открытия позиции, в списке истории еще отсутствуют данные об ордере и сделке, требуется какая-то доля секунды. Это усложняет алгоритм. В МТ4 на одном тике можно последовательно выполнить много действий, в МТ5 надо усложнять алгоритм (делать ожидание обновления списка) или же учитывать по результату OrderSend(). Этот пункт кому-то может показаться неубедительным, но это не удивительно, найдется кто-нибудь кому и пункты 1-3 будут не убедительны.

Если работаете в обычном синхронном режиме, то результат транзакции в историю прилетает сразу вместе с кодом ответа. Некоторые разработчики совершают ошибки в параметре TO запроса истории сделок, что выглядит для них как "транзакция еще не пришла". Просто забывают время TO хотя бы на несколько секунд в будущее сдвинуть.

В асинхронном режиме сделки отлично ловятся в обработчике транзакций.

5. Взгляд на работу советника с точки зрения статистики. МТ4 позволяет отработать все  торговые сигналы независимо, что дает более достоверный результат при оценке аналитической части советника.

Не понятно.

Если про тестер, то в пятерке он реально на голову выше, да еще и мультисимвольный.


6. ArraySort() в МТ4 позволят сортировать многомерные массивы по первому измерению, в МТ5 только одномерные сортируются.

Скорее всего сортировку расширим в MQL5. Но это не принципиальная проблема.


7. Тестер. Отладка советника в тестере. В МТ4 полноценный график, можно графические объекты создавать... значки сдвигать... все как по настоящему. В МТ5 возможности работы с графиком ограничены.

В пятерке тоже будет полная обработка объектов в визуализаторе. Дело в том, что в четверке сам движок тестера внутри терминала, а не вынесен наружу как у пятерки.


8. Время графических объектов. В МТ4 скопировал мышкой и вставил в код. В МТ5 за один мах мышкой время не скопируешь, приходится набирать вручную. 

Как часто люди вручную прописывают даты в графический объект?

В пятерке работа с датой даже удобнее за счет специализированного контрола даты.


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

Вы не в курсе, что есть 3 режима отображения сделок + двойные сортировки по каждой колонке.


В пятерке отчеты тестера торговых стратегий гораздо лучше.


10. МТ4 через год (когда узнал о нем) после своего появления был полностью в рабочем состоянии и не менялся. В МТ5 годами выполнялись значительные принципиальные изменения. Сначала убрали параметры PositionSelet(), что потребовало переделки написанных советников, потом меняли идентификаторы из-за чего некоторые советники снова требовали переделки. Может и другие какие изменения, за всем не уследишь. 

МТ4 менялся очень много все 9 лет - были выпущены сотни билдов. Вот сейчас очередной релиз выходит.

Пятерка тоже менялась, становясь все более мощной платформой. И жаловаться тут неуместно.


Еще немного.

В МТ4 переменные Point, Digits... В МТ5 эти же переменные начинаются с подчеркивания. Это выглядит как будто это все кто-то наскоряк на шару придумал... а экспертописателям их ставить, пальцы топырить. Мелочь конечно, но как-то раздражает. Чувствуется непродуманность.

Подчеркивания, чтобы показать их deprecated статус. Нельзя использовать такие простые переменные, объявленные на глобальном уровне, но выглядящие как обычные локальные переменные.

Для чистоты языка и кода нужно переходить на Symbol(), Period(). Тут как раз продуманность и избавление от наследия старого.


В МТ5 доступ к разным данным через идентификаторы. Чтобы получить одно значение надо сначала написать функцию с названием в пол экрана, потом еще идентификатор написать размером еще пошире чем пол экрана. Эта проблема решается использованием стандартных классов, но там свои "моментики", не все названия очевидны, например у класса работы с позицией были методы Type и PositionType (как-то так). Для определения направления позиции используется метод PositionType, а не Type. Мелочь конечно, но все это требует повышенного внимания и потребляет энергию.

Объем экосистемы языка и рыночного окружения таков, что нельзя пытаться обойтись ни короткими идентификаторами, ни придумыванием не менее коротких отдельных функций.

Извлечение постоянно увеличивающего набора характеристик через рост идентификаторов при неизменности количества функций - это классический метод масштабирования.

Для борьбы со сложностью у нас есть хорошо работающие методы интеллисенса и автодополнения.

Жаловаться на это не имеет смысла - это касается любых языков и их API.

 

Integer, Спасибо за такой развернутый ответ! Прочел несколько раз очень внимательно. По Вашему описанию выходит, что с нуля гораздо тяжелее выполнить ТЗ на MQL5, нежели MQL4.

С другой стороны, каждый раз велосипед не изобретаем же. Т.е. не вижу непреодолимых препятствий, кроме постоянных багов и изменений в самом MQL5 (сужу по множеству репортов об ошибках), придумать MQL_Integer, у которого будет полностью своя логика с работой с ордерами, индикаторами и прочее. Затем реализовать этот именной MQL на MQL4 и MQL5. И в каждом MQx-файле затем просто инклудить библиотечку на все случаи жизни. Тем самым забыв вообще про номер используемого MQL. Вопрос в другом, а стоит ли такая овчинка выделки? И почему каждый программист-любитель (я, например) вынужден изобретать свой велосипед. О чем думали разработчики - не знаю.

Почему не пишется официально MQL4-логика на MQL5 - тоже не понятно.

Что касается отсутствия виртуализации ордеров и других неудобств MT5, не хотелось бы загаживать вычищенный от срача четверочный форум. Скажу только, что мне на MT4 приходится использовать свою кривую виртуализацию по схеме: в виртуальном тестере в реал-тайме смотрим текущие позиции всех ТС, затем синхронизируем их с реалом. Т,е. и на MT4 виртуализация не супер, но, конечно, много круче MT5. Но если все же извращаться, как сам делаю, то вообще без разницы, на каком MT запускать.


Правда, на четверке все значительно нагляднее и, что вообще архиважно, вручную вмешаться в торговлю гораздо проще. Это задница, когда надо срочно вмешаться руками, а нихрена не понятны связи визуально. Писать свой GUI - выход, но сколько еще можно валить на свои плечи и, главное, ради чего...


В целом, если рассуждать, как фрилансер, можно подготовить все же библиотечку, чтобы выполнять ТЗ юзеров все с одинаковыми усилиями. Но опять же, а стоит ли овчинка выделки? Может, проще забить на фриланс в пятерке и фрилансить только в черверке, не заморачиваясь со всякими псевдо-универсальными библиотеками...


Возможно, вижу все по-дилетантски. Повторюсь, крайне плохо все еще, что MQL5 меняется все время. Убить же можно уйму времени на отладке ранее рабочих кодов. Пока вижу смысл использования MQL5 не для торговли: только тестер с кастомной историей + Облако.

 

Вопрос фрилансерам, которые кодят под четверку и пятерку. Скажите, среднестатистически, на каком MQL получается быстрее закодить нормальное ТЗ юзеров? С учетом всех уже заранее приготовленных вами своих удобных библиотек, конечно.

Считаю, что язык тот лучше для фрилансера, который позволяет быстрее выполнять ТЗ. Скорость же выполнения кода - это даже не вторично. И мне, как программисту-любителю, пишущему только для себя, важна только скорость реализации торговой идеи в коде, а не скорость выполнения кода. Т.к. почти все идеи - мусор. А если удается найти что-то стоящее (ну очень редко), то если потребует ускорение, вывернусь, но ускорю на чем угодно.

 
hrenfx:

Вопрос фрилансерам, которые кодят под четверку и пятерку. Скажите, среднестатистически, на каком MQL получается быстрее закодить нормальное ТЗ юзеров? С учетом всех уже заранее приготовленных вами своих удобных библиотек, конечно.

Считаю, что язык тот лучше для фрилансера, который позволяет быстрее выполнять ТЗ. Скорость же выполнения кода - это даже не вторично. И мне, как программисту-любителю, пишущему только для себя, важна только скорость реализации торговой идеи в коде, а не скорость выполнения кода. Т.к. почти все идеи - мусор. А если удается найти что-то стоящее (ну очень редко), то если потребует ускорение, вывернусь, но ускорю на чем угодно.

Лучше то, что лучше знаешь
 
hrenfx:

Integer, Спасибо за такой развернутый ответ! Прочел несколько раз очень внимательно. По Вашему описанию выходит, что с нуля гораздо тяжелее выполнить ТЗ на MQL5, нежели MQL4.

Как же вам хочется верить в глупости.

Слушать надо тех, кто полжизни положил на разработку того, что вы обсуждаете.

 
Renat:

Как же вам хочется верить в глупости.

Слушать надо тех, кто полжизни положил на разработку того, что вы обсуждаете.

Почти все технари являются скептиками, веры нет никому. Но есть благодарность тем, кто помогает разобраться, отвечает на вопросы. Даже если ответы не на 100% объективные.

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

 
hrenfx:

Почти все технари являются скептиками, веры нет никому. Но есть благодарность тем, кто помогает разобраться, отвечает на вопросы. Даже если ответы не на 100% объективные.

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

1. мое мнение, очень субьективное - с точки зрения "просто закодить что-то" МТ5 намного проще, достаточно взглянуть на функцию закрытия ордеров в стратегиях с доливками :)

2. а вот, например, мнение человека, который находится в ТОП 10 фрилансеров - https://www.mql5.com/ru/users/abolk

Безындикаторный советник (сетки, неваляшки и т.п.) -- средняя и высокая ценовая категория. Советники этого класса индпошив. Проблема "разработчиков" таких советников на реале - неполня обработка (открытие, закрытие, модификация) совокупности ордеров (МТ4).

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

3. самое принципиальное отличие - отсутствие хеджирования в МТ5, вот как раз у меня без локов пока не получается создать ТС с "достаточной" прибылью именно по этой причине, в МТ5 очень мало вариантов "защиты" сделки, поэтому пока приходится писать на МТ5, НО только у тех брокеров, которые сами, своими усилиями и костыльными методами, добавили возможность хеджирования позиции, причем, есть же разные варианты с доливками на одном символе, например, атташе-локи, когда даже попадая во флет можно частично закрывать некоторые ордера с прибылью, в МТ5 такое врядли возможно, потому что все будет накапливаться в одну убыточную позу, при попытке закрыть ее частично будет фиксироваться убыток, а не прибыль

Вывод : для программирования МТ5 проще, для создания прибыльных ТС - сложнее

 

Renat:

Если хотите на одном символе торговать множеством советников, то лучше подумайте над практической целесообразностью и откажитесь. Обманывать себя теоретической возможностью не надо - это кончается печально в трейдинге.

Если есть сильная потребность, то легко пишется виртуализатор, которые еще и спред будет здорово экономить.

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

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