Асинхронное и многопоточное программирование в MQL

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Roman
1128
Roman  
Назрела необходимость писать код mql в асинхронном или многопоточном режиме.
С асинхронным и многопоточным написанием кода знаком, по модулю asyncio из Python.

Как известно, все эксперты и скрипты в mql, исполняются каждый в одном потоке.
Всвязи с этим есть некое недопонимание по этому поводу.
В портированной на mql язык библиотеке WinAPI, есть функции по работе с потоками через WinAPI.
Если использовать эти функции многопоточности в коде mql, то переданные mql функции так же будут исполнятся многопоточно?
И то что эксперт/скрипт по умолчанию исполняется однопоточно, это не будет препятствовать в использовании многопоточности WinAPI ?

Если возможно использовать многопоточность WinAPI в mql программах, подскажите пожалуйста гайд или статьи как работать с этими потоками WinAPI в mql.
Базовый принцип то мне понятен из asyncio, но не хватает наглядных примеров для mql.
Про справку Microsoft я в курсе, но пока не изучал её, так как пока нет чёткого представления логики использования потока WinAPI в mql, и что конкретно искать в справке.
Направьте в нужное русло, если есть примеры или статьи для mql то будет вообще шикарно.
 
Vict
732
Vict  

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

Примеры легко гуглятся - "winapi multithreading". Вообще нужно понимать (возможно и без меня знаете) - многопоточное программирование это другой уровень, без ног можно остаться. Сомневаюсь, что Python (хотя я в питоне 0) мог раскрыть все грани сего занятия. Вряд ли наобум получится приличный многопоточный неговнокод.

Roman
1128
Roman  
Vict:

Вы не задумались о ещё одном вопросе - как проинициализировать стандартную мкл библиотеку для нового потока?

Да, задумывался, стандартная библиотека WinAPI, портирована из Windows API, которая взаимодействует через стандартные dll.
Соответственно инициализировать нужно стандартные dll, и для этого в WinAPI так же есть портированные функции.
Но с этим предстоит так же разбираться, как инициализировать и деинициализировать dll, как я понимаю примеры C++ по инициализации dll должны быть рабочими и в mql.
Так как функции инициализации те же самые из Windows API, главное найти правильные не устаревшие примеры, с этим и проблема. Поиск по гуглу не всегда даёт нужный результат.
На форуме много профессиональных программистов, могут и показать кусочек кода как это делать правильно.  Инициализация, выделение памяти, деинициализация и т.д.
А дальше уже работа с потоками. Очень странно, что в разделе "Статьи", до сих пор нет на эту тему ни одной статьи.

Vict:

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

Что вы подразумеваете под "остаться без ног"?
Если правильно работать с потоками или асинхрнностью, то не каких инвалидностей не должно быть.
В этом и стоит задача, научиться правильно применять потоки Windows API в mql, или асинхронность.
В Python работал в основном с асинхронностью, прекрасно всё летает, с потоками в Python из за GIL есть проблемы. По этому потоки в Python лучше не использовать.

Maxim Romanov
7419
Maxim Romanov  
Roman:
Назрела необходимость писать код mql в асинхронном или многопоточном режиме.
С асинхронным и многопоточным написанием кода знаком, по модулю asyncio из Python.

Как известно, все эксперты и скрипты в mql, исполняются каждый в одном потоке.
Всвязи с этим есть некое недопонимание по этому поводу.
В портированной на mql язык библиотеке WinAPI, есть функции по работе с потоками через WinAPI.
Если использовать эти функции многопоточности в коде mql, то переданные mql функции так же будут исполнятся многопоточно?
И то что эксперт/скрипт по умолчанию исполняется однопоточно, это не будет препятствовать в использовании многопоточности WinAPI ?

Если возможно использовать многопоточность WinAPI в mql программах, подскажите пожалуйста гайд или статьи как работать с этими потоками WinAPI в mql.
Базовый принцип то мне понятен из asyncio, но не хватает наглядных примеров для mql.
Про справку Microsoft я в курсе, но пока не изучал её, так как пока нет чёткого представления логики использования потока WinAPI в mql, и что конкретно искать в справке.
Направьте в нужное русло, если есть примеры или статьи для mql то будет вообще шикарно.
 
В мт5 есть openCL для мультипотока. Поищите статьи на эту тему тут.
MetaQuotes
Модератор
216362
MetaQuotes  

Из DLL нельзя вызывать MQL функции.

Но можно запускать множественные потоки через вызовы DLL, чтобы они независимо от MQL5 работали в своем окружении.

Например, из MQL подготовили данные, разместили где-то или передали в DLL библиотеку, которая уже в свою очередь во множестве потоков отработает задачу и вернет результат через дополнительную функцию.

Vict
732
Vict  
Roman:

Да, задумывался, стандартная библиотека WinAPI, портирована из Windows API, которая взаимодействует через стандартные dll.
Соответственно инициализировать нужно стандартные dll, и для этого в WinAPI так же есть портированные функции.

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

Что вы подразумеваете под "остаться без ног"?

Там много граблей. Но если с чтивом вроде такого у вас нет проблем https://en.cppreference.com/w/cpp/atomic/memory_order, то вы готовы.
Roman
1128
Roman  
MetaQuotes Software Corp.:

Но можно запускать множественные потоки через вызовы DLL, чтобы они независимо от MQL5 работали в своем окружении.

Об этом и речь, использовать стандартную портированную библиотеку WinAPI, она как раз и подразумевает работу через стандартные Windows dll.

Vict:

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

Там много граблей. Но если с чтивом вроде такого у вас нет проблем https://en.cppreference.com/w/cpp/atomic/memory_order, то вы готовы.

На сколько мне известно, при инициализации dll так же можно проинициализировать экспортируемые функции, которые будут вызываться из dll в mql программу.
По этому это не основная проблема, проблема как это сделать? Как я писал выше, возможно примеры по С++ будут рабочими и в mql, но думал что тут смогут помочь с примерами кода на mql.
Так сказать чтоб не ломать голову о переносимости, может кто уже работал с WinAPI и сможет подсказать.

p.s.
ааа, понял о чём вы, но речь идёт о портированном WinAPI, а не о функциях mql,
возможно mql функции можно будет инициализировать через объекты, или запихивать в свою dll и инициализировать как описал выше.

Vict
732
Vict  

Что-то мы друг друга не понимает.

Но не заморачивайтесь - не создадите вы поток через КриэйтТрэд() внутри мкл, вам нужно передать указатель на функцию (с которой поток стартанёт), но как было замечено выше - кукиш.

Koldun Zloy
731
Koldun Zloy  

Перевожу, то что Вам уже ответил представитель компании разработчиков МТ:

Создавать потоки из MQL нельзя. Даже при помощи WinAPI.

Вы можете это сделать, только написав свою DLL.


TheXpert
18276
TheXpert  
Roman:
Назрела необходимость писать код mql в асинхронном или многопоточном режиме.

не то что нужно конечно, но почерпнуть можно

Многопоточный асинхронный WebRequest на MQL5 своими руками
Многопоточный асинхронный WebRequest на MQL5 своими руками
  • www.mql5.com
Реализация торговых алгоритмов часто требует анализа информации из различных внешних источников, в частности из Internet. MQL5 предоставляет функцию WebRequest для отправки HTTP-запросов во "внешний мир", но она, к сожалению, обладает одним заметным недостатком. Эта функция является синхронной, а потому блокирует работу эксперта на все время...
Roman
1128
Roman  
Vict:

Что-то мы друг друга не понимает.

Но не заморачивайтесь - не создадите вы поток через КриэйтТрэд() внутри мкл, вам нужно передать указатель на функцию (с которой поток стартанёт), но как было замечено выше - кукиш.

А как же тогда этот ответ?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Асинхронное и многопоточное программирование в MQL

MetaQuotes Software Corp., 2019.07.24 16:31

Но можно запускать множественные потоки через вызовы DLL, чтобы они независимо от MQL5 работали в своем окружении. 

Vict, возможно как вы описали есть проблема с работой потоков внутри mql, но как я понимаю вызывать функции из WinAPI с помощью  КриэйтТрэд()  не должно быть проблемой.
Мне то нужно многопоточное взаимодействие с функциями WinAPI, а не с функциями mql.