Обсуждение статьи "Параллельные вычисления в MetaTrader 5 штатными средствами"

 

Опубликована статья Параллельные вычисления в MetaTrader 5 штатными средствами:

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

Автор: Андрей

 

Спасибо автору, актуальная статья. Я тоже размышлял на эту тему, но до статьи не дошёл.

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

В связи с этим вопрос (не столько к автору, а больше к разработчикам из MQ): возможно ли введение пользовательских инструментов?

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

А по поводу буфера передачи данных, могу посоветовать создать глобальную структуру и передавать разнотипные данные структурой. По опыту знаю что результат вычислений не всегда удобно возвращать в виде массива, часто приходится отслеживать какие то счётчики, и чтоб не путать имена проще всё передать как структуру и уже обращаться к переменным как к членам структуры. Кстати в туже структуру могут входить и массивы.
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 
Urain:

В связи с этим вопрос (не столько к автору, а больше к разработчикам из MQ): возможно ли введение пользовательских инструментов?

Хм, идея понравилась.
 

Возможно я повторю уже высказанную здесь мысль о пользовательских инструментах, но хотелось бы добавить...

Сейчас эксперт (индикатор,скрипт) запускается только на конкретном символе. У него есть доступ к текущим данным других символов, но событие OnTick генерируется только для символа-хозяина, на графике которого запущен эксперт.

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

P.S.Ну или хорошо было бы добавить к функциям SymbolInf... что то  вроде события "поступил новый тик по данному инструменту".

 
lav888:

Сейчас эксперт (индикатор,скрипт) запускается только на конкретном символе. У него есть доступ к текущим данным других символов, но событие OnTick генерируется только для символа-хозяина, на графике которого запущен эксперт.

Сложно понять, почему разработчики повторили костыль. Ведь еще на момент продумывания архитектуры MQL5 уже существовал очень сильный API, в котором onTick срабатывал на любой тик любого подписанного инструмента.

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

Разработчики MQL5 ведут себя так, как будто изобретают велосипед заново: "мы подумаем над этой возможностью", "да, пожалуй вы правы, добавим" и т.д.

Неоднократно упоминалось, что на проработку архитектуры был потрачен не один год. Значит есть какие-то доводы, почему решили сделать так, а не иначе.

P.S. Возможно, причина кроется в том, что разработчики MetaTrader имеют малый опыт в брокераже и торговле, но огромный опыт в написании платформ. Другие же разработчики, наоборот, имели огромный опыт реального брокеража и рыночной торговли.

P.P.S. Написал свои мысли, не домыслы. Критиковать всегда легче, чем создавать. Разработчики, несмотря на явные промахи, заслуживают Уважения.

 
lav888:

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

P.S.Ну или хорошо было бы добавить к функциям SymbolInf... что то  вроде события "поступил новый тик по данному инструменту".

Такую "надстройку" можно реализовать штатными средствами MQL5: Мультивалютный обработчик тиков OnTickMarketWatch
 
Lizar:
Такую "надстройку" можно реализовать штатными средствами MQL5: Мультивалютный обработчик тиков OnTickMarketWatch

Спасибо. Именно эта статья и подтолкнула меня к вышеизложеным выводам. Но как вы сами заметили в этой статье:

Советы по использованию:

1. Этот вариант мультивалютного обработчика тиков достаточно ресурсоемкий. Вы можете ослабить нагрузку на процессор увеличивая задержку времени получения тиков в скрипте, используя переменную delay. Но при этом вы можете пропускать некоторое количество тиков.


Если увеличить время задержки до 1 сек., то тот же эффект можно получить и используя OnTimer(). К сожалению с теми же недостатками. 

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

 А о "пользовательских инструментах" или надстройке над экспертами... Я понимаю что это из разряда "помечтать" и об этом надо было думать на этапе проектирования...А жаль! 

 
lav888:

Спасибо. Именно эта статья и подтолкнула меня к вышеизложеным выводам. Но как вы сами заметили в этой статье:

Советы по использованию:

1. Этот вариант мультивалютного обработчика тиков достаточно ресурсоемкий. Вы можете ослабить нагрузку на процессор увеличивая задержку времени получения тиков в скрипте, используя переменную delay. Но при этом вы можете пропускать некоторое количество тиков.


Если увеличить время задержки до 1 сек., то тот же эффект можно получить и используя OnTimer(). К сожалению с теми же недостатками. 

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

 А о "пользовательских инструментах" или надстройке над экспертами... Я понимаю что это из разряда "помечтать" и об этом надо было думать на этапе проектирования...А жаль! 

Да, в общем-то согласен. А что касается мечтаний, то все, что мы сейчас имеем было когда-то чьей-то мечтой. Если будут весомые аргументы, то и  "пользовательские инструменты" появятся.
 

Ок! Теперь осталось что-бы нас услышали разработчики . Хорошо бы в этой надстройке сразу предусматривать функции управления потоками.

Можно было бы каждую обработку запускать в своём потоке. Возможно это позволило бы обрабатывать новый тик во время работы с текущим тиком. 

 

Полезная статья. Открыл новые горизонты.

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

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Я правильно понимаю, что в тестере (без включенной оптимизации) многопоточность по данному методу работать не будет? У меня при запуске теста, судя по логу, стопорится после создания всех индикаторов, видимо уходит в бесконечный цикл, т.к. одно из ядер проца остается нагруженным.
Причина обращения: