如何从MQL4 EA进程(MetaTrader4终端)运行Python脚本?

bbuxkriu  于 2023-03-28  发布在  Python
关注(0)|答案(1)|浏览(241)

我有一个简单的test.py脚本,我想从MQL4 EA运行。
我如何实现这一点?
我尝试过使用**ShellExecute()**,但在我的情况下不起作用,因为我在Linux机器上运行MetaTrader4终端,因此无法调用基于Windows的ShellExecute()(即使使用wine)。

cvxl0en2

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 器创建了几十个令人头痛的问题,但一些适度的努力使stringNew-MQL4.56789更改,不再是string(令人惊讶的是重新打扮的**struct**),但在大多数高性能处理中,交互都是位压缩的,因此不应该出现心碎。

Python端:

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: )

MQL 4侧:

#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 );
       ...
}

相关问题