Как запустить скрипт Python из EA-процесса MQL4 (терминал MetaTrader4)?
У меня простой test.py
скрипт, который я хотел бы запустить из советника MQL4.
Как я могу это реализовать?
Я пытался использовать ShellExecute()
но это не будет работать в моем случае, так как я использую терминал MetaTrader4 на компьютере с Linux и, следовательно, не могу вызывать Windows на основе ShellExecute()
(даже с wine
).
1 ответ
Вариант 0: использование wine
-обещать иметь полную DLL-абстракцию
wine
Проект, если он настроен правильно, должен обеспечить полную DLL-абстракцию, так что законный ShellExecute()
должен обеспечить способ запуска терминала MetaTrader4 в винной оболочке и запуск такого предполагаемого процесса.
Вариант 1: использовать распределенную обработку { ZeroMQ | Наномсг}
Учитывая, что эта возможность возможна начиная с ZeroMQ v2.11, питон всегда был готов к взаимодействию с MQL4 и запускать / останавливать предоставление любых услуг по {MQL4|*}
-потребность. Это был бы мой предпочтительный способ, так как рабочий процесс не изолирован для простого управления ракетой "запусти и забудь".
Много лет использовать эту архитектуру для Predictive Engine AI/ML, удаленных клавиатур, централизованных интеллектуальных журналов, интеграции служб, работоспособности, производительности и телеметрии (не только с исполнительными блоками с кодом MQL4), и оставаться довольным годы для выбора этого передового пути распределенной архитектуры.
Nota Bene: Справедливо отметить, что где-то около пересмотра движка выполнения кода терминала MQL4 Build 850 / 900 MetaTrader4 возникло несколько десятков проблем с тряпкой для DLL-оболочки / оригинальной оболочки ZeroMQ v2.11, но некоторые умеренные усилия сделал новый MQL4.56789
смена string
, который перестал быть 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: )
MQL4 сторона:
#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 );
...
}