MQL中的异步和多线程编程

 
有必要以异步或多线程模式编写mql代码。
我熟悉Python的asyncio模块中的异步和多线程代码编写。

如你所知,mql中的所有EA和脚本都是在单线程中执行。
因此,人们对它有一些困惑。
移植到mql的WinAPI库有通过WinAPI处理线程的功能。
如果我在mql代码中使用这些多线程函数,那么mql传递的函数也会是多线程的吗?
而Expert Advisor/Script默认是单线程的,在WinAPI中使用多线程不会有阻碍吗?

如果可以在mql程序中使用WinAPI多线程,请向我推荐一份关于如何在mql中处理这些WinAPI线程的指南或文章。
我理解asyncio的基本原理,但缺乏mql的说明性例子。
我知道微软的帮助,但我没有研究过,因为我对在mql中使用WinAPI流程的逻辑仍然没有清楚的认识,在帮助中到底有什么可以找到。
给我指出正确的方向,如果有任何关于mql的例子或文章,那就太好了。
 

试试吧,猜测是没有意义的。如果这些函数的指针是有效的,也许有些东西会起作用。你有没有想过另一个问题--如何为一个新的线程初始化标准的μl库?

例子很容易在谷歌上找到 - "winapi多线程"。你应该明白(也许不用我说你也知道),多线程编程是另一个层次,你可能会失去你的腿。我怀疑Python(尽管我在Python中是0)能揭示这个活动的所有方面。不太可能随机得到一个像样的多线程非代码。

 
Vict:

你有没有想过另一个问题--如何为一个新的线程初始化标准的μl库?

是的,标准的 WinAPI,从Windows API移植过来的,通过标准的dlls进行交互。
因此,标准的dll必须被初始化,为此在WinAPI中也有移植的函数。
C++中关于dll初始化的例子应该也能在mql中工作。
由于初始化函数与Windows API相同,主要是要找到正确的例子,而这些例子又没有过时,这就是问题所在。谷歌搜索并不总是正确的结果。
这个论坛上有很多专业的程序员,他们可以给你看一段代码,比如初始化、内存分配、去初始化等等。
然后你必须与线程一起工作。非常奇怪的是,到目前为止,"文章 "部分还没有关于这个主题的文章。

胜利

一般来说,你需要了解(也许没有我你也知道)--多线程编程是另一个层次,你可以没有腿。
我怀疑Python(尽管我在Python中是0)能揭示这个活动的所有方面。不太可能随机得到一个像样的多线程非代码。

你说的 "没有腿 "是什么意思?
如果你正确地使用流量或异步工作,就不应该有残疾。
这就是挑战,要学习如何在mql中正确使用Windows API线程,或者是async。
在Python中,我主要用异步工作,一切都很顺利,在Python中用线程,因为有GIL,所以出现了问题。由于这个原因,Python中的线程最好不要使用。

 
Roman:
有必要以异步或多线程模式编写mql代码。
我熟悉Python的asyncio模块中的异步和多线程代码编写。

如你所知,mql中的所有EA和脚本都是在单线程中执行。
因此,人们对它有一些困惑。
移植到mql的WinAPI库有通过WinAPI处理线程的功能。
如果我在mql代码中使用这些多线程函数,那么mql传递的函数也会是多线程的吗?
而Expert Advisor/Script默认是单线程的,在WinAPI中使用多线程不会有阻碍吗?

如果可以在mql程序中使用WinAPI多线程,请向我推荐一份关于如何在mql中处理这些WinAPI线程的指南或文章。
我理解asyncio的基本原理,但缺乏mql的说明性例子。
我知道微软的帮助,但我没有研究过,因为我对在mql中使用WinAPI流程的逻辑仍然没有清楚的认识,在帮助中到底有什么可以找到。
给我指出正确的方向,如果有任何关于mql的例子或文章,那就太好了。
mt5有一个用于多线程的openCL。在这里寻找有关这一主题的文章。
 

你不能从DLL中调用MQL函数。

但是可以通过DLL调用来运行多个线程,这样他们就可以在自己的环境中独立于MQL5工作。

例如,你从MQL中准备好数据,放在某处或传递给DLL,而DLL将与多个线程一起工作,并通过一个额外的函数返回结果。

 
Roman:

是的,我做到了,标准的 WinAPI,从Windows API移植过来的,通过标准的dlls进行交互。
相应地,标准的dlls必须被初始化,在WinAPI中也有移植的函数用于此目的。

不,我说的是具体的标准µl库(你知道的,比如说那里的交易函数,还有其他所有的)。那里必须有全局数据,每个线程必须有自己的副本,你通过CriatTrade()的新线程将保持未初始化的正常状态。

你说的 "没有腿的人 "是什么意思?

外面有很多耙子。但是,如果你对这样的阅读没有问题,https://en.cppreference.com/w/cpp/atomic/memory_order, 你就可以了。
 
MetaQuotes Software Corp.:

但是可以通过DLL调用来运行多个线程,使它们在其环境中独立于MQL5工作。

这就是我们正在谈论的,使用标准的移植WinAPI库,它只是意味着通过标准的Windows dlls工作。

胜利

不,我说的正是标准的MQL5库(例如,交易函数和所有其他的)。那里必须有全局数据,每个线程必须有自己的副本,你通过CREATTrade()的新线程将保持未初始化的正常状态。

那里面有很多耙子。但如果你对这样的阅读没有意见,https://en.cppreference.com/w/cpp/atomic/memory_order, 你就可以走了。

据我所知,当你初始化dll时,你也可以初始化导出的函数,这些函数将从dll调用到mql程序。
所以这不是主要问题,问题是如何做?正如我在上面写的,也许C++的例子在mql中也能用,但我想mql的代码例子在这里能起到帮助。
所以说,为了不在可移植性上绞尽脑汁,也许已经用过WinAPI的人能够给我一个提示。

p.s.
啊,我明白你的意思,但这是关于移植的WinAPI,而不是mql函数。
也许mql函数可以通过对象进行初始化,或者放在它们的dll中,并按照上面的描述进行初始化。

 

一些我们不理解对方的东西。

但不用麻烦了--你不会通过μl内部的CREATTrade()创建线程,你需要传递一个指向函数的指针(线程将从那里开始),但如上所述--kukush。

 

我将翻译MT开发公司的代表已经告诉你的内容。

你不能从MQL创建线程。即使使用WinAPI也不行。

你只能通过编写你自己的DLL来做到这一点。


 
Roman:
有必要在异步或多线程模式下编写mql代码。

这不是正确的做法,但学习是好的。

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

我们不了解对方的一些情况。

但不要陷入困境--你不会通过μl内部的CREATTrade()创建一个线程,你需要传递一个函数的指针(线程将从该函数开始),但如上所述--kukish。

那么这个答案呢?

关于交易、自动交易系统和策略测试的论坛

MQL中的异步和多线程编程

MetaQuotes软件公司。, 2019.07.24 16:31

但是可以通过DLL调用来运行多个线程,使它们在其环境中独立于MQL5工作。

胜利,也许正如你所描述的,在mql内部工作的线程有问题,但按照我的理解,使用CriatTrade()从WinAPI调用函数应该不是问题。
我需要用WinAPI函数进行多线程,而不是用mql函数。