MQL의 비동기 및 다중 스레드 프로그래밍

 
비동기 또는 다중 스레드 모드에서 mql 코드를 작성할 필요가 있습니다.
저는 Python의 비동기 및 다중 스레드 코딩, 모듈로 asyncio에 익숙합니다.

아시다시피 mql의 모든 전문가와 스크립트는 각각 하나의 스레드에서 실행됩니다.
이와 관련하여 이에 대해 약간의 오해가 있습니다.
mql 언어로 이식된 WinAPI 라이브러리에는 WinAPI를 통해 스트림 작업을 위한 함수가 있습니다.
mql 코드에서 이러한 멀티스레딩 기능을 사용하면 mql에 전달된 기능도 멀티스레드로 실행됩니까?
그리고 EA/스크립트가 기본적으로 단일 스레드로 실행된다는 사실이 WinAPI 다중 스레드 사용에 방해가 되지 않을까요?

mql 프로그램에서 WinAPI 멀티스레딩을 사용할 수 있다면 mql에서 이러한 WinAPI 스레드로 작업하는 방법에 대한 가이드나 기사를 알려주십시오.
기본 원칙은 asyncio에서 나에게 명확하지만 mql에 대한 시각적 예제가 충분하지 않습니다.
나는 Microsoft 도움말을 알고 있지만 mql에서 WinAPI 스트림을 사용하는 논리와 도움말에서 정확히 무엇을 찾아야 하는지에 대한 명확한 아이디어가 없기 때문에 아직 연구하지 않았습니다.
올바른 방향으로 직접 mql에 대한 예제나 기사가 있으면 일반적으로 화려할 것입니다.
 

글쎄, 무엇을 추측할지 시도하십시오. 함수에 대한 포인터가 본격적인 경우 무언가가 나올 것입니다. 새 스레드에 대한 표준 µl 라이브러리를 초기화하는 방법에 대해 한 가지 더 생각해 보셨습니까?

예는 "winapi 멀티스레딩"과 같이 Google에서 쉽게 찾을 수 있습니다. 일반적으로 이해해야 합니다(아마도 나 없이 알 수 있음). 다중 스레드 프로그래밍은 다른 수준이며 다리 없이 남을 수 있습니다. 나는 파이썬이 (비록 파이썬 0에 있지만) 이 수업의 모든 면을 드러낼 수 있을지 의심스럽다. 괜찮은 멀티스레드 non-god 코드가 무작위로 나올 가능성은 거의 없습니다.

 
Vict :

새 스레드에 대한 표준 µl 라이브러리를 초기화하는 방법에 대해 한 가지 더 생각해 보셨습니까?

예, WinAPI 표준 라이브러리 가 표준 dll을 통해 상호 작용하는 Windows API에서 이식되었다고 생각했습니다.
따라서 표준 dll을 초기화해야 하며, 이를 위해 WinAPI에도 기능이 이식되어 있습니다.
그러나 dll을 초기화하고 초기화 해제하는 방법과 같은 방식으로 처리해야 합니다. 내가 이해하는 것처럼 dll 초기화에 대한 C++ 예제는 mql에서도 작동해야 합니다.
초기화 기능은 Windows API와 동일하기 때문에 가장 중요한 것은 올바른 비구식 예제를 찾는 것인데 이것이 문제입니다. Google 검색이 항상 원하는 결과를 반환하는 것은 아닙니다.
포럼에는 많은 전문 프로그래머가 있으며 그들은 코드를 올바르게 수행하는 방법을 보여줄 수 있습니다. 초기화, 메모리 할당, 초기화 해제 등
그리고 이미 스트림으로 작업하고 있습니다. "기사"섹션에이 주제에 대한 기사가 아직 없다는 것은 매우 이상합니다.

빅트 :

일반적으로 이해해야 합니다(아마도 나 없이 알 수 있음). 다중 스레드 프로그래밍은 다른 수준이며 다리 없이 남을 수 있습니다.
나는 Python(나는 python 0에 있지만)이 이 수업의 모든 측면을 드러낼 수 있는지 의심합니다. 괜찮은 멀티스레드 non-god 코드가 무작위로 나올 가능성은 거의 없습니다.

"느슨한 발"은 무엇을 의미합니까?
스트림이나 비동기로 작업하는 것이 맞다면 장애가 없어야 합니다.
이것은 mql 또는 비동기에서 Windows API 흐름을 올바르게 사용하는 방법을 배우는 작업입니다.
Python에서는 주로 비동기식으로 작업했으며 모든 것이 잘 작동하고 GIL로 인해 Python의 스레드에 문제가 있습니다. 따라서 Python에서는 스트림을 사용하지 않는 것이 좋습니다.

 
Roman :
비동기 또는 다중 스레드 모드에서 mql 코드를 작성할 필요가 있습니다.
저는 Python의 비동기 및 다중 스레드 코딩, 모듈로 asyncio에 익숙합니다.

아시다시피 mql의 모든 전문가와 스크립트는 각각 하나의 스레드에서 실행됩니다.
이와 관련하여 이에 대해 약간의 오해가 있습니다.
mql 언어로 이식된 WinAPI 라이브러리에는 WinAPI를 통해 스트림 작업을 위한 함수가 있습니다.
mql 코드에서 이러한 멀티스레딩 기능을 사용하면 mql에 전달된 기능도 멀티스레드로 실행됩니까?
그리고 EA/스크립트가 기본적으로 단일 스레드로 실행된다는 사실이 WinAPI 다중 스레드 사용에 방해가 되지 않을까요?

mql 프로그램에서 WinAPI 멀티스레딩을 사용할 수 있다면 mql에서 이러한 WinAPI 스레드로 작업하는 방법에 대한 가이드나 기사를 알려주십시오.
기본 원칙은 asyncio에서 나에게 명확하지만 mql에 대한 시각적 예제가 충분하지 않습니다.
나는 Microsoft 도움말을 알고 있지만 아직 mql에서 WinAPI 스트림을 사용하는 논리와 도움말에서 정확히 무엇을 찾아야 하는지에 대한 명확한 아이디어가 없기 때문에 아직 연구하지 않았습니다.
올바른 방향으로 직접 mql에 대한 예제나 기사가 있으면 일반적으로 화려할 것입니다.
MT5에는 멀티스레딩을 위한 openCL이 있습니다. 여기에서 이 주제에 대한 기사를 찾으십시오.
 

MQL 함수는 DLL에서 호출할 수 없습니다.

그러나 DLL 호출을 통해 여러 스레드를 시작하여 해당 환경에서 MQL5와 독립적으로 작동하도록 할 수 있습니다.

예를 들어, 데이터는 MQL에서 준비되어 어딘가에 배치되거나 DLL 라이브러리로 전송되며, DLL 라이브러리는 차례로 여러 스레드에서 작업을 완료하고 추가 기능을 통해 결과를 반환합니다.

 
Roman :

예, WinAPI 표준 라이브러리 가 표준 dll을 통해 상호 작용하는 Windows API에서 이식되었다고 생각했습니다.
따라서 표준 dll을 초기화해야 하며, 이를 위해 WinAPI에도 기능이 이식되어 있습니다.

아니요, 저는 특별히 표준 라이브러리 µl에 대해 이야기하고 있었습니다(예를 들어 거래 기능과 나머지 모든 기능이 있습니다). 거기에는 확실히 전역 데이터가 있고 각 스레드에는 자체 사본이 있어야 하며 CreateTrade()를 통한 새 스레드는 제대로 초기화되지 않은 상태로 유지됩니다.

"느슨한 발"은 무엇을 의미합니까?

거기에 많은 전리품이 있습니다. 그러나 https://en.cppreference.com/w/cpp/atomic/memory_order 와 같은 자료를 읽는 데 문제가 없다면 준비가 된 것입니다.
 
MetaQuotes Software Corp. :

그러나 DLL 호출을 통해 여러 스레드를 시작하여 해당 환경에서 MQL5와 독립적으로 작동하도록 할 수 있습니다.

이것은 우리가 말하는 표준 포팅된 WinAPI 라이브러리를 사용하는 것입니다. 이는 표준 Windows dll을 통해 작업한다는 것을 의미합니다.

빅트 :

아니요, 저는 특별히 표준 라이브러리 µl에 대해 이야기하고 있었습니다(예를 들어 거래 기능과 나머지 모든 기능이 있습니다). 거기에는 확실히 전역 데이터가 있고 각 스레드에는 자체 사본이 있어야 하며 CreateTrade()를 통한 새 스레드는 제대로 초기화되지 않은 상태로 유지됩니다.

거기에 많은 전리품이 있습니다. 그러나 https://en.cppreference.com/w/cpp/atomic/memory_order 와 같은 자료를 읽는 데 문제가 없다면 준비가 된 것입니다.

내가 아는 한 dll을 초기화할 때 mql 프로그램의 dll에서 호출될 내보낸 함수도 초기화할 수 있습니다.
따라서 이것이 주요 문제가 아니라 문제를 수행하는 방법입니다. 위에서 썼듯이 아마도 C++ 예제는 mql에서 작동하지만 mql의 코드 예제에서는 도움이 될 수 있다고 생각했습니다.
말하자면, 이식성에 대해 의아해하지 않기 위해 누군가가 이미 WinAPI로 작업했고 말할 수 있을 것입니다.

추신
아, 무슨 말인지 이해하지만 mql 함수가 아니라 이식된 WinAPI에 대해 이야기하고 있습니다.
아마도 mql 함수는 객체를 통해 초기화되거나 dll에 채워지고 위에서 설명한 대로 초기화될 수 있습니다.

 

우리가 서로를 이해하지 못하는 것.

그러나 귀찮게 하지 마십시오. µl 내부에서 CreateThread()를 통해 스레드를 생성하지 않습니다. 함수에 대한 포인터를 전달해야 합니다(스레드가 시작될 때 사용). 그러나 위에서 언급한 것처럼 쿠키입니다.

 

MT 개발 회사의 담당자가 이미 답변한 내용을 번역하고 있습니다.

MQL에서 흐름을 만들 수 없습니다. WinAPI를 사용하더라도.

자신의 DLL을 작성해야만 이 작업을 수행할 수 있습니다.


 
Roman :
비동기 또는 다중 스레드 모드에서 mql 코드를 작성할 필요가 있습니다.

물론 필요한 것은 아니지만 그릴 수 있습니다.

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

우리가 서로를 이해하지 못하는 것.

그러나 귀찮게 하지 마십시오. µl 내부에서 CreateThread()를 통해 스레드를 생성하지 않습니다. 함수에 대한 포인터를 전달해야 합니다(스레드가 시작될 때 사용). 그러나 위에서 언급한 것처럼 쿠키입니다.

그러면 이 대답은 어떻습니까?

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

MQL의 비동기 및 다중 스레드 프로그래밍

MetaQuotes Software Corp. , 2019.07.24 16:31

그러나 DLL 호출을 통해 여러 스레드를 시작하여 해당 환경에서 MQL5와 독립적으로 작동하도록 할 수 있습니다.  

Vict, 아마도 당신이 설명했듯이 mql 내부의 스레드 작업에 문제가 있지만 내가 이해하기로는 CreateTrade()를 사용하여 WinAPI에서 함수를 호출하는 것은 문제가 되지 않습니다.
그런 다음 mql 기능이 아닌 WinAPI 기능과의 다중 스레드 상호 작용이 필요합니다.