Discussione sull’articolo "Come accedere al database MySQL da MQL5 (MQL4)"

 

Il nuovo articolo Come accedere al database MySQL da MQL5 (MQL4) è stato pubblicato:

L'articolo descrive lo sviluppo di un'interfaccia tra MQL e il database MySQL. Espone le soluzioni pratiche esistenti e offre un modo più conveniente per implementare una libreria da utilizzare per lavorare con i database. L'articolo contiene una descrizione dettagliata delle funzioni, della struttura dell'interfaccia, degli esempi e di alcune caratteristiche specifiche per lavorare con MySQL. Per quanto riguarda le soluzioni software, gli allegati agli articoli includono i file delle librerie dinamiche, la documentazione ed esempi di script per i linguaggi MQL4 e MQL5.

L'interazione con il terminale MetaTrader (tramite programmi MQL) può essere implementata con l'aiuto dei seguenti componenti:

schema di interazione MQL e MySQL

1. La libreria di interfaccia MQLMySQL.mqh. Viene aggiunta al progetto utilizzando la directory #include e può essere modificata a proprio piacimento.

Contiene le direttive per l'importazione delle funzioni della libreria dinamica MQLMySQL.dll, nonché le funzioni per poterle chiamare e gestire gli errori.

2. La libreria dinamica MQLMySQL.dll. È un wrapper per accedere alle funzionalità della libreria standard libmysql.dll.

Inoltre, la libreria MQLMySQL.dll elabora i risultati delle operazioni e l'accesso condiviso alle connessioni e ai cursori del database. Questo significa che si possono creare e utilizzare più connessioni contemporaneamente (da uno o più programmi MQL), tenere aperti alcuni cursori, con query a uno o più database. I mutex vengono utilizzati per separare l'accesso alle risorse condivise.

3. La libreria dinamica standard libmysql.dll è un driver di accesso nativo. Puoi copiarlo da qualsiasi distribuzione del database MySql in C:\Windows\Sytem32 o <Terminal>\MQL5\Libraries (per MetaTrader 4 in <Terminal>\MQL4\Libraries).

È infatti responsabile dell'invio delle query al database e del recupero dei risultati.

Soffermiamoci sui punti principali: apertura/chiusura della connessione, esecuzione di query DML/DDL e selezione dei dati.

Autore: Eugeniy Lugovoy

 
DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);

non si creerà un grosso carico quando si chiama per ogni tick?????

Non sarebbe più logico connettersi al database in init e poi usare l'identificatore per l'accesso?

 
DKeN:

non si creerà un grosso carico quando si chiama per ogni tick?????

Non sarebbe più logico connettersi al database in init e poi usare l'identificatore per l'accesso?

Saluti. Per gli Expert Advisor e gli Indicatori, la connessione alla base dati viene effettuata nella funzione di inizializzazione. Nell'articolo non ci sono raccomandazioni su come stabilire una connessione con il database ad ogni tick. Vengono forniti solo esempi di script e gli script, si capisce, non hanno inizializzazione.
 

Eugene, grazie per l'articolo. Materiale interessante sui DBMS.

Ho un problema simile.

Ho MetaTrader5, x64, 975 build.

Quando eseguo lo script "MySQL-001", ottengo un errore:

RL      1       12:41:22.443    MySQL-001       'C:\Program Files\MetaTrader5\MQL5\libraries\MQLMySQL.dll' is not 64-bit version
PG      1       12:41:22.474    MySQL-001 (AUDCAD.e,M1) Cannot load 'C:\Program Files\MetaTrader5\MQL5\libraries\MQLMySQL.dll'
DK      2       12:41:23.677    MySQL-001 (AUDCAD.e,M1) Cannot call 'cMySqlVersion', '..\libraries\MQLMySQL.dll' is not loaded
ID      2       12:41:23.677    MySQL-001 (AUDCAD.e,M1) unresolved import function call

Il motivo, a quanto ho capito, è che il sistema sta cercando di caricare una libreria a 64 bit...

 
denkir:

Eugene, grazie per l'articolo. Materiale interessante sui DBMS.

Ho un problema simile.

Ho MetaTrader5, x64, 975 build.

Quando eseguo lo script "MySQL-001", ottengo un errore:

Il motivo, a quanto ho capito, è che il sistema sta cercando di caricare una libreria a 64 bit...

Sì, il progetto è compilato per x32, poiché lavoro principalmente con terminali a 32 bit. Capisco il problema, lo compilerò e lo testerò sotto MT5 x64 nei prossimi giorni.

Grazie per il commento.

 

Versione della libreria per Metatrader 5 - x64

- Il progetto MQLMySQL.DLL è ricompilato per x64 (i sorgenti non sono stati corretti).

- LibMySQL.DLL standard è tratto dall'ultima distribuzione stabile di MySQL v5.6.21 x64.

In realtà, per coloro che hanno provato a eseguire il progetto sotto MT5 x64, è possibile sostituire solo il contenuto della directory MQL5\Libraries. Il codice sorgente dei programmi MQL non deve essere corretto o ricompilato.

Grazie ancora a Denis (denkir) per la sua osservazione, avevo dimenticato gli utenti x64.

File:
 

L'ho letto e ho pianto. Non ho nulla contro l'autore. Spero che tratti le critiche in modo adeguato. Comunque:

1. Perché scrivere un wrapper sotto forma di un'altra DLL, se tutto funziona bene senza? Il linguaggio MQL non è in quella fase di sviluppo per scrivere tali stampelle che spesso si trasformano in rastrelli.

2. Perché, come risultato di tutto questo lavoro, non è stata scritta una classe che ha tutto il necessario e che elimina le carenze dei predecessori, a cui l'autore fa riferimento?

3. Vorrei sottolineare in particolare questo aspetto:

string SQL;
SQL = "INSERT INTO EURUSD(Ask,Bid) VALUES (1.3601,1.3632);";
SQL = SQL + "INSERT INTO EURUSD(Ask,Bid) VALUES (1.3621,1.3643);";
SQL = SQL + "INSERT INTO EURUSD(Ask,Bid) VALUES (1.3605,1.3629);";

In realtà, tutto è molto più semplice:

string SQL="INSERT INTO EURUSD(Ask,Bid) VALUES (1.3601,1.3632),(1.3621,1.3643),(1.3605,1.3629);";

In generale, l'articolo è scritto nello stile "Guardate cosa posso fare!" invece di "Guardate e imparate come si dovrebbe fare".

 
avoitenko:

L'ho letto e ho pianto. Non ho nulla contro l'autore. Spero che tratti le critiche in modo adeguato. Comunque:

1. Perché scrivere un wrapper sotto forma di un'altra DLL, se tutto funziona bene senza? Il linguaggio MQL non è in quella fase di sviluppo per scrivere tali stampelle che spesso si trasformano in rastrelli.

2. Perché, come risultato di tutto questo lavoro, non è stata scritta una classe che ha tutto il necessario e che elimina le carenze dei predecessori, a cui l'autore fa riferimento?

3. Vorrei sottolineare in particolare questo aspetto:

In realtà, tutto è molto più semplice:

In generale, l'articolo è scritto nello stile "Guardate cosa so fare!" invece di "Guardate e imparate come si deve fare".

Risponderò con ordine.

Devo dire che il progetto è stato avviato molto tempo fa, quando il linguaggio MQL non era allo stadio attuale di sviluppo e MQL4 non aveva classi né strutture.

E la soluzione software doveva funzionare sia per MQL4 che per MQL5 con costi minimi per la transizione da MQL4 a MQL5 (se necessario). Il progetto è stato finalizzato fino a poco tempo fa.

Per questo motivo il progetto non è stato implementato come classe. Volete una classe? Nessun problema: scrivetela! Nessuno ve lo vieta.

Ora, per quanto riguarda 3 INSERT invece di uno. L'ho scritto in questo modo (ed è protetto da copyright) per le seguenti ragioni:

- non viola gli standard generalmente accettati di SQL'92, SQL'2000 (la vostra variante - peculiarità della sintassi esattamente MySQL bulk insert);

- sarà più facile da leggere e da capire per un programmatore alle prime armi in questo settore;

- dimostrazione dell'esecuzione di esattamente 3 istruzioni INSERT, non una.

Le istruzioni multiple possono includere qualsiasi operazione DML/DDL/DCL, il vostro esempio è limitato all'operazione INSERT su una tabella.

P.S. L'articolo è stato scritto in stile "Prendi e usa".

 

Grazie! Esaminerò la tua soluzione in modo approfondito, potrebbe essere più stabile che affidarsi solo a MQL.

Per vostra informazione, c'è un ponte solo per MQL4 che ho scritto un po' di tempo fa per MT4 build 600+: https://www.mql5.com/it/code/11114

MySQL for new MQL4 (tested in build 600)
MySQL for new MQL4 (tested in build 600)
  • voti: 12
  • 2014.02.10
  • Sergey
  • www.mql5.com
Connecting to MySQL server from new MQL4
 
lukins:

Grazie! Esaminerò la tua soluzione in modo approfondito, potrebbe essere più stabile che affidarsi solo a MQL.

Per vostra informazione, c'è un ponte solo MQL4 che ho scritto un po' di tempo fa per MT4 build 600+: https://www.mql5.com/it/code/11114

Grazie per il tempo dedicato alla lettura di questo articolo. Ho controllato anche il tuo(https://www.mql5.com/it/code/11114), ho trovato una soluzione simile molto tempo fa (prima della MT4 build 600) e mi è piaciuta l'idea di rendere MQL e MySQL compatibili. Ma una cosa che non voglio usare sono gli array per recuperare i dati dal database. Ecco perché ho costruito questa soluzione da utilizzare con MT4 e MT5.

Inoltre, ho dimenticato di aggiungere il progetto basato su x64 all'articolo, quindi potete scaricarlo proprio qui, nella discussione. Non è stato modificato nulla nei sorgenti, solo la DLL è stata ricompilata per x64.

Buona fortuna,

Eugene

MySQL for new MQL4 (tested in build 600)
MySQL for new MQL4 (tested in build 600)
  • voti: 12
  • 2014.02.10
  • Sergey
  • www.mql5.com
Connecting to MySQL server from new MQL4
 
Per le piattaforme x64, utilizzare le seguenti librerie (con discussione)