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?
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?
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...
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.
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".
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
- voti: 12
- 2014.02.10
- Sergey
- www.mql5.com
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
- voti: 12
- 2014.02.10
- Sergey
- www.mql5.com
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
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:
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