Discussione sull’articolo "Interazione MetaTrader 5 e MATLAB"

 

Il nuovo articolo Interazione MetaTrader 5 e MATLAB è stato pubblicato:

In questo articolo si parlerà dei dettagli dell'interazione tra MetaTrader 5 e il pacchetto matematico MatLab. Mostra il meccanismo di conversione dei dati, il processo di sviluppo di una libreria universale per interagire con il desktop MatLab. Copre anche l'uso di DLL generate dall'ambiente MatLab. Questo articolo è destinato a lettori esperti che conoscono C++ e MQL5.

Questo metodo di interazione non può essere definito elegante e veloce, ma è il più affidabile e copre l'intero pacchetto MATLAB. Naturalmente, dovremmo menzionare la velocità di sviluppo del modello finale. L'essenza dello sviluppo è scrivere un wrapper di libreria universale per l'interazione con MetaTrader 4/5 e MATLAB Engine. Dopo questo script/indicatore/esperto MetaTrader 4/5 può gestire il desktop virtuale MATLAB. E l'intero algoritmo matematico può essere memorizzato nel programma MQL come stringhe, quindi puoi usarlo per proteggere la tua proprietà intellettuale (per maggiori dettagli vedi l'articolo "Proteggetevi, sviluppatori!"). Può anche essere memorizzato in file separati di funzioni m o funzioni P nella cartella <MetaTrader 5>\MQL5\Libraries.  

Possibili ambiti di applicazione di tale interazione:

  • Per testare o dimostrare "modelli/idee matematici" senza dover scrivere programmi complessi (la protezione della proprietà intellettuale può essere organizzata come nel programma MQL e tramite il pacchetto MATLAB - utilizzando le funzioni P).  
  • Per scrivere modelli matematici complessi utilizzando tutte le funzionalità di MATLAB.
  • A tutti coloro che non distribuiranno i propri script/indicatori/esperti.

Procediamo. Spero che tu abbia letto i 1.1 tipi di dati in MATLAB e MQL5, 1.2 Confronto tra Tipi di Dati MQL5 e MATLAB, 2.1 MATLAB Engine API e Funzioni MCR2.3 C++ Libreria Standard Input/Output , poiché non li metteremo in pausa e li analizzeremo più . Leggere attentamente il seguente schema a blocchi, che illustra l'algoritmo della futura libreria:  

 Figura 1. Schema a Blocchi dell'Algoritmo della Libreria

Autore: Andrey Emelyanov

 

Ho seguito attentamente le vostre indicazioni ma non riesco a farlo funzionare con Matlab 2007b. Ricevo continuamente questi errori quando cerco di utilizzare gli esempi precostituiti con il terminale MT5.

2010.08.29 10:33:30 TestMLEngine (EURUSD,H1) Impossibile aprire 'C:\Users\QuantFX\AppData\Roaming\MetaQuotes\Terminal\216E2BD2BB8CE60176A41ADF6AC1C76D\MQL5\Libraries\LibMlEngine.dll' (126)

2010.08.29 10:33:47 TestDllMatlab (EURUSD,H1) Impossibile aprire 'C:\Users\QuantFX\AppData\Roaming\MetaQuotes\Terminal\216E2BD2BB8CE60176A41ADF6AC1C76D\MQL5\Libraries\nnSMA.dll' (126)

Non so cosa pensare, perché sono in grado di ottenere il progetto menzionato nell'articolo"Come scambiare i dati: A DLL for MQL5 in 10 Minutes " che si trova qui https://www.mql5.com/en/articles/18 funziona senza problemi.

2010.08.29 10:44:16 MQL5DLL_Test (EURUSD,H1) Violazione dell'accesso in scrittura a 0x00000000 in 'C:\Users\QuantFX\AppData\Roaming\MetaQuotes\Terminal\216E2BD2BB8CE60176A41ADF6AC1C76D\MQL5\Libraries\MQL5DLLSamples.dll'

2010.08.29 10:44:16 MQL5DLL_Test (EURUSD,H1) Sostituire: Un gatto marrone veloce salta sopra il cane pigro

2010.08.29 10:44:16 MQL5DLL_Test (EURUSD,H1) Array: 0 1 2 3 4 5 6 7 8 9
2010.08.29 10:44:16 MQL5DLL_Test (EURUSD,H1) Tempo 297 msec, int: -752584127 double: 17247836076609

Quindi il terminale ovviamente non ha problemi con le violazioni di accesso alla cartella \Libraries, e sono certo che le "Opzioni" dell'Expert Advisor consentano l'importazione di dll e l'autotrading... Qualsiasi aiuto sarebbe molto apprezzato perché sono rimasto perplesso da quando ho letto questo articolo. Grazie in anticipo

How to Exchange Data: A DLL for MQL5 in 10 Minutes
  • 2010.01.27
  • MetaQuotes Software Corp.
  • www.mql5.com
Now not so many developers remember how to write a simple DLL, and what are special features of different system binding. Using several examples, I will try to show the entire process of the simple DLL's creation in 10 minutes, as well as to discuss some technical details of our binding implementation. I will show the step-by-step process of DLL creation in Visual Studio with examples of exchanging different types of variables (numbers, arrays, strings, etc.). Besides I will explain how to protect your client terminal from crashes in custom DLLs.
 

Finalmente è riuscito a funzionare... Devo dire che l'articolo è eccellente. Non ho molta esperienza con Visual Studio e sono un principiante nella programmazione di metatrader. Quindi, questa sembrava una sfida con tutti gli errori che ricevevo. Anche se alla lunga è molto facile per tutte le versioni di matlab e visual studio.A tutti coloro che si cimentano per la prima volta nel collegamento tra Metatrader e Matlab, suggerisco di procedere come segue per acquisire una maggiore consapevolezza, se non si è mai lavorato con il motore di matlab o con le librerie esterne di metatrader. 1. Creare il progetto fornito con matlab che si trova in matlabroot\externs\examples\eng_mat\engwindemo.c seguendo questo articolo. http://www.mathworks.com/support/solutions/en/data/1-78077S/index.html?product=ML&solution=1-78077S Compilatelo e, in caso di problemi, come la mancanza di file dll, usate dependency walker, che si trova qui http://www.dependencywalker.per determinare quali file mancanti devono essere inseriti nella cartella C:\Windows\System 32 per far funzionare la versione di matlab engine che si sta utilizzando. È bene notare che potrebbe essere necessario inserire molti file nella cartella System 32 o conoscere i punti giusti in cui collegarli nel progetto. Anche se la maggior parte delle dll si trova nella cartella matlabroot\bin\win(32 o 64). Dopo aver inserito i primi file dll necessari, tornare indietro e provare a costruire di nuovo il progetto. Si potrebbe scoprire che non è necessario fare tutto quello che suggerisce dependency walker. Se riuscite a compilare ed eseguire il progetto, allora avete quasi finito... 2. Costruite il progetto suggerito nell'articolo Come scambiare i dati: A DLL for MQL5 in 10 Minutes https://www.mql5.com/en/articles/18 . Se il progetto funziona, ricordate che quando create il progetto di cui sopra state combinando le due cose. Ricordate tutti i passaggi seguiti e quando siete pronti a compilare il progetto assicuratevi che "stdafx.h" sia il primo header #include in DLLUnit.cpp e che abbiate disattivato gli header precompilati, subito prima della compilazione. L'utilizzo dei file di cui sopra così com'è può dare alcuni avvertimenti facilmente risolvibili, ma il progetto dovrebbe funzionare senza problemi. I miei due centesimi aggiunti qui possono sembrare la guida per gli imbranati a questo progetto, ma fare queste cose potrebbe farvi risparmiare un paio d'ore del vostro tempo libero se doveste costruire questo progetto con un'altra versione di matlab o usare visual studio.

Salute

 

Se non sbaglio, il tipo di matrici Matlab nella Tabella 1 non è corretto. Manca la lettera u. Cioè, ad esempio, il tipo uint16 è responsabile dell'intervallo da 0 a 65535, non il tipo int16. E così via...

Classe

Intervallo di valori

Funzione di conversione

Numero intero a 8 bit con segno

da -27 a27-1

int8

Numero intero a 16 bit con segno

da -215 a215-1

int16

Numero intero firmato a 32 bit

da -231 a231-1

int32

Numero intero firmato a 64 bit

da -263 a263-1

int64

Numero intero a 8 bit senza segno

da 0 a28-1

uint8

Numero intero a 16 bit senza segno

da 0 a216-1

uint16

Numero intero a 32 bit senza segno

da 0 a232-1

uint32

Numero intero a 64 bit senza segno

da 0 a264-1

uint64

 

Buon pomeriggio, grazie per l'ottimo articolo, molto utile!

Tuttavia, è sorto un problema. Forse qualcuno l'ha riscontrato.

Quando chiudo un Expert Advisor, MT5 si blocca completamente. Utilizzo MS Visual Studio2010 + Matlab r2011a.

Quale pensate possa essere il motivo? Grazie in anticipo!

 

Buon pomeriggio. Ho fatto tutto come nell'articolo, ma quando ho eseguito lo script TestMlEngine è comparso un errore:

2011.12.17 15:55:23 TestMLEngine(EURUSD,H1) Impossibile aprire 'C:\Users\H_F_M\AppData\Roaming\MetaQuotes\Terminal\DEA4AAFB99C996D79821EC8BDBADDC3C\MQL5\Libraries\LibMlEngine.dll' (126)

e poi immediatamente:

2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxGetSizeOfName' in 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxGetLogical' in 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxGetInt' in 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxGetDouble' in 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxInputLogical' in 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxInputInt' in 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxInputDouble' in 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxInputChar' in 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxOpen' in 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxClose' in 'LibMlEngine.dll'

Da qualche parte sul forum ho trovato che questo è dovuto a dll mancanti, con l'aiuto di depends.exe ho trovato quello che mancava, l'ho buttato nella stessa cartella, è servito, ma non del tutto. Ora si vede:

2011.12.17 15:57:59 TestMLEngine (EURUSD,H1) Impossibile aprire 'C:\Users\H_F_M\AppData\Roaming\MetaQuotes\Terminal\DEA4AAFB99C996D79821EC8BDBADDC3C\MQL5\Libraries\LibMlEngine.dll' (127).

e l'elenco continua con "Impossibile trovare...". Potete dirmi qual è il problema? Sto lottando già da una settimana...

Sì, ho Win7 + Matlab R2011a + VS201.


.

[Eliminato]  
H_F_M:

Buon pomeriggio. Ho fatto tutto come nell'articolo, ma quando ho eseguito lo script TestMlEngine è comparso un errore:

2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile aprire 'C:\Users\H_F_M\AppData\Roaming\MetaQuotes\Terminal\DEA4AAFB99C996D79821EC8BDBADDC3C\MQL5\Libraries\LibMlEngine.dll' (126)

e poi immediatamente:

2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxGetSizeOfName' in 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxGetLogical' in 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxGetInt' in 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxGetDouble' in 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxInputLogical' in 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxInputInt' in 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxInputDouble' in 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxInputChar' in 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxOpen' in 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Impossibile trovare 'mlxClose' in 'LibMlEngine.dll'

Da qualche parte sul forum ho trovato che questo è dovuto a dll mancanti, con l'aiuto di depends.exe ho trovato quello che mancava, l'ho buttato nella stessa cartella, ha aiutato, ma non del tutto.Ora si vede:

2011.12.17 15:57:59 TestMLEngine (EURUSD,H1) Impossibile aprire 'C:\Users\H_F_M\AppData\Roaming\MetaQuotes\Terminal\DEA4AAFB99C996D79821EC8BDBADDC3C\MQL5\Libraries\LibMlEngine.dll' (127).

e l'elenco continua con "Impossibile trovare...". Potete dirmi qual è il problema? Sto lottando già da una settimana...

Sì, ho Win7 + Matlab R2011a + VS201.

Quando ho installato Matlab, il percorso di sistema era solo "C:\Program Files\MATLAB\R2011b\bin". Ho aggiunto "C:\Program Files\MATLAB\R2011b\bin\win32". Le Dll della directory Matlab sono diventate visibili e Matlab Engine si è avviato. Prima ho scritto che non riuscivo a vedere le dll.

 

Buongiorno) Ho un altro problema: per qualche motivo il catalogo "Borland" non viene trovato nella cartella <MATLAB>extern\lib\win32\, sebbene Borland C++ Builder 6 sia installato. Di conseguenza, nemmeno i file libeng.lib e libmx.lib possono essere collegati al progetto. Far dà il seguente risultato con il comando "implib libeng libeng.lib libeng.dll":

)

E la cartella Borland non c'era e non c'è ancora... Qualcuno può dirmi come affrontare questo problema? O almeno mi lancia questi due file?:-)

 

In generale, vi prego di aiutarmi, perché non capisco qualcosa....

Per la purezza dell'esperimento ho installato VMware, dove ho installato 2 sistemi - XP e 7.

Poi ho installato Matlab R2011b, installato MCR, installato l'ultima build di MT5. Dall'archivio allegato all'articolo, tutti i file sono stati sparsi in cartelle, come scritto nelle istruzioni dell'archivio. Ho compilato i file mq5 in ex5 (cioè ho cancellato i file ex5 esistenti nell'archivio e ho messo al loro posto quelli appena compilati). Avvio MT5, avvio Matlab (ho provato a non avviarlo - il risultato è lo stesso), nel terminale clicco su TestMlEngine e mi dà:

TestMLEngine (EURUSD,H1) 13:44:58 Impossibile aprire 'C:\Users\User\AppData\Roaming\MetaQuotes\Terminal\DEA4AAFB99C996D79821EC8BDBADDC3C\MQL5\Libraries\LibMlEngine.dll' (126)
TestMLEngine (EURUSD,H1) 13:44:58 Impossibile trovare 'mlxClose' in 'LibMlEngine.dll'
TestMLEngine (EURUSD,H1) 13:44:58 Impossibile trovare 'mlxOpen' in 'LibMlEngine.dll'
TestMLEngine (EURUSD,H1) 13:44:58 Impossibile trovare 'mlxInputChar' in 'LibMlEngine.dll'
TestMLEngine (EURUSD,H1) 13:44:58 Impossibile trovare 'mlxInputDouble' in 'LibMlEngine.dll'
TestMLEngine (EURUSD,H1) 13:44:58 Impossibile trovare 'mlxInputInt' in 'LibMlEngine.dll'
TestMLEngine (EURUSD,H1) 13:44:58 Impossibile trovare 'mlxInputLogical' in 'LibMlEngine.dll'
TestMLEngine (EURUSD,H1) 13:44:58 Impossibile trovare 'mlxGetDouble' in 'LibMlEngine.dll'
TestMLEngine (EURUSD,H1) 13:44:58 Impossibile trovare 'mlxGetInt' in 'LibMlEngine.dll'
TestMLEngine (EURUSD,H1) 13:44:58 Impossibile trovare 'mlxGetLogical' in 'LibMlEngine.dll'
TestMLEngine (EURUSD,H1) 13:44:58 Impossibile trovare 'mlxGetSizeOfName' in 'LibMlEngine.dll'.

Non so cosa fare. Ho provato tutto quello che potevo. Ho provato la DLL dell'articolo "Come scrivere una libreria DLL per MQL5 e scambiare dati in 10 minuti?" ().(https://www.mql5.com/ru/articles/18)- funziona senza problemi.

Qualcuno sa dirmi in quale altro modo è possibile raggiungerla? Cosa sto facendo di sbagliato?

Grazie in anticipo.

Как за 10 минут написать DLL библиотеку для MQL5 и обмениваться данными?
Как за 10 минут написать DLL библиотеку для MQL5 и обмениваться данными?
  • 2010.01.27
  • MetaQuotes Software Corp.
  • www.mql5.com
Так уж сложилось, что сейчас мало кто из разработчиков помнит, как написать простую DLL библиотеку и в чем особенности связывания разнородных систем. Я постараюсь за 10 минут на примерах продемонстрировать весь процесс создания простых DLL библиотек и раскрою некоторые технические детали нашей реализации связывания. Покажу пошаговый процесс создания DLL библиотеки в Visual Studio с примерами передачи разных типов переменных (числа, массивы, строки и т.д.) и защиту клиентского терминала от падений в пользовательских DLL.
 
neuro_robot:

Quando ho installato Matlab, il percorso di sistema era solo "C:C:\Program Files\MATLAB\R2011b\bin". Ho aggiunto "C:\Program Files\MATLAB\R2011b\bin\win32". Le Dll della directory Matlab sono diventate visibili e Matlab Engine si è avviato. Prima ho scritto che non riuscivo a vedere le dll.

Se ti riferisci alla variabile d'ambiente Path, ho aggiunto "C:\Program Files\MATLAB\R2011b\bin\win32", ma la situazione non è cambiata :-(
[Eliminato]  
H_F_M:
Se ti riferisci alla variabile d'ambiente Path, ho aggiunto "C:\Program Files\MATLAB\R2011b\bin\win32", ma la situazione non è cambiata :-(
Inoltre mancavano alcune librerie dll. Controllare in "depends.exe" cosa manca per il lancio.