我有一个简单的test.py脚本,我想从MQL4 EA运行。我如何实现这一点?我尝试过使用**ShellExecute()**,但在我的情况下不起作用,因为我在Linux机器上运行MetaTrader4终端,因此无法调用基于Windows的ShellExecute()(即使使用wine)。
test.py
ShellExecute()
wine
cvxl0en21#
如果配置正确,wine项目应该提供完整的DLL抽象,因此合法的ShellExecute()应该提供一种启动葡萄酒封装的MetaTrader 4终端的方法,以启动此类预期进程。
考虑到这个选项自ZeroMQ v2.11以来是可行的,python总是准备好与MQL 4通信,并根据-{MQL4|*}-demand启动/停止任何服务供应。这将是我的首选方式,因为工作流不是孤立的,只是“发射和忘记”导弹控制。使用这种架构多年的AI/ML预测器预测引擎,远程键盘,场外集中式智能日志记录,过程健康/性能遥测服务集成(不仅与MQL 4代码执行单元),并且多年来一直很高兴选择了这种先进的分布式架构方式。
{MQL4|*}
贝内:值得注意的是,在MQL 4 Build 850 / 900 MetaTrader 4终端代码执行引擎修订版附近的某个地方,为DLL Package 器/原始ZeroMQ v2.11 Package 器创建了几十个令人头痛的问题,但一些适度的努力使string的 New-MQL4.56789更改,不再是string(令人惊讶的是重新打扮的**struct**),但在大多数高性能处理中,交互都是位压缩的,因此不应该出现心碎。
string
MQL4.56789
struct
def main(): # setup ZeroMQ infrastructure and map all resources import zmq ... pass; mainloopSTAY = True # mainloop(): ----------------------------- while mainloopSTAY: try: # ----------------------- event-handling: pass; except: # ------------------------- EXC-handling: { continue } pass; finally: # dismantle ZeroMQ infrastructure and release all resources pass; print( "INF: main().finally: EXIT" ) # { break | if mainloopSTAY } #---------------------------------------------- pass; print( "INF: main().pre-return SECTION" ) if __name__ == '__main__': main() # EXECUTED only if this module-file was called to run from a command-line ( Ref. SECTION: import for def: )
#include <mql4zmq_for_Terminal_4.00_Build.840.mqh> // STILL BUG/ERROR on zmq_poll() while missing zmq_poll_struct_t string aTemp = ">>> "; // globally visible ... int aZmqCONTEXT, // globally visible ... aZmqSOCKET; // globally visible ... so as to be able to auto-deinit in { EA -s | #Indicators } .deinit() on panic termination(s) //+------------------------------------------------------------------+ //| msMOD_deinit( int aZmqSOCKET = EMPTY ) | //+------------------------------------------------------------------+ void msMOD_deinit( const int aZmqSOCKET = EMPTY ) { if ( aZmqSOCKET != EMPTY ) { zmq_setsockopt( aZmqSOCKET, ZMQ_LINGER, 0 ); zmq_close( aZmqSOCKET ); } zmq_term( aZmqCONTEXT ); return; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnDeinit( const int anAutoDeinitREASON ){ // auto-generated ONLY for { EA-s , #Indicator-s } msMOD_deinit( aZmqSOCKET ); } //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { aZmqCONTEXT = zmq_init(1); // .init into globally visible int if ( aZmqCONTEXT < 0 ){ msMOD_deinit(); // GRACEFUL CLEANUP return; // DEBUG: RET() } int aZmqPAIR = zmq_socket( aZmqCONTEXT, ZMQ_PAIR ); // .sock PAIR if ( aZmqPAIR < 0 ){ msMOD_deinit( aZmqPAIR ); // GRACEFUL CLEANUP return; // DEBUG: RET() } int aZmqBindPAIR = zmq_bind( aZmqPAIR, "tcp://A.B.C.D:PORT" // i5-eth0-IP:##### ); if ( aZmqBindPAIR < 0 ){ msMOD_deinit( aZmqPAIR ); // GRACEFUL CLEANUP return; // DEBUG: RET() } ... int RC = mql4zmq_msg_init_data( aSendMsgOBJ, aSendMsgBuffUCHAR, aSendMsgBUFF_SIZE * 4 ); zmq_send( aZmqPAIR, aSendMsgOBJ ); ... }
1条答案
按热度按时间cvxl0en21#
选项0:使用
wine
-promise来实现完整的DLL抽象如果配置正确,
wine
项目应该提供完整的DLL抽象,因此合法的ShellExecute()
应该提供一种启动葡萄酒封装的MetaTrader 4终端的方法,以启动此类预期进程。选项1:使用分布式处理{ ZeroMQ|nanomsg
考虑到这个选项自ZeroMQ v2.11以来是可行的,python总是准备好与MQL 4通信,并根据-
{MQL4|*}
-demand启动/停止任何服务供应。这将是我的首选方式,因为工作流不是孤立的,只是“发射和忘记”导弹控制。使用这种架构多年的AI/ML预测器预测引擎,远程键盘,场外集中式智能日志记录,过程健康/性能遥测服务集成(不仅与MQL 4代码执行单元),并且多年来一直很高兴选择了这种先进的分布式架构方式。
贝内:值得注意的是,在MQL 4 Build 850 / 900 MetaTrader 4终端代码执行引擎修订版附近的某个地方,为DLL Package 器/原始ZeroMQ v2.11 Package 器创建了几十个令人头痛的问题,但一些适度的努力使
string
的 New-MQL4.56789
更改,不再是string
(令人惊讶的是重新打扮的**struct
**),但在大多数高性能处理中,交互都是位压缩的,因此不应该出现心碎。Python端:
MQL 4侧: