Вариант 0: использование wine
-обещания для полной DLL-абстракции
Проект wine
, если он сконфигурирован должным образом, должен обеспечить полную абстракцию DLL, так что легитимный ShellExecute()
должен обеспечить способ запуска терминала MetaTrader4 в винной оболочке при запуске такого предполагаемого процесса.
Вариант 1: использовать распределенную обработку { ZeroMQ | наномсг }
Учитывая, что этот вариант стал возможным, начиная с ZeroMQ v2.11, python всегда был готов взаимодействовать с MQL4 и запускать/останавливать предоставление любых услуг по-{MQL4|*}
-требованию. Это был бы мой предпочтительный способ, поскольку рабочий процесс не ограничивается только управлением ракетами по принципу «выстрелил-забыл».
Используя эту архитектуру много лет для AI/ML-predictive Engine, удаленных клавиатур, удаленной централизованной интеллектуальной регистрации, интеграции сервисов телеметрии работоспособности/производительности процессов (не только с модулями выполнения кода MQL4) и оставаясь довольным всем лет за то, что выбрали этот передовой путь распределенной архитектуры.
Nota Bene: Справедливо отметить, что где-то около версии MQL4 Build 850 / 900 MetaTrader4 Terminal ревизия механизма выполнения кода создала несколько десятков проблем с DLL-оболочкой / оригинальной ZeroMQ v2. .11 обертка, но умеренные усилия заставили New-MQL4.56789
заменить string
, который больше не был string
(будучи на удивление переодетым 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: )
Сторона 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 );
...
}
person
user3666197
schedule
08.09.2017