Discussione sull’articolo "Come accedere al database MySQL da MQL5 (MQL4)" - pagina 7
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Ok, vedo che hai scritto un expert advisor per questo scopo, ed è scritto senza le raccomandazioni che ho postato nell'articolo.
Quindi, procediamo passo dopo passo: 1.
1. La chiamata di " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " dovrebbe essere fatta all'interno di OnInit() invece che in OnTick(). 2. Si sta utilizzando cMySqlConnect per il database.
2. Si utilizza cMySqlConnect - è una funzione importata dalla DLL, si deve utilizzare la funzione MySqlConnect invece di cMySqlConnect !
3. Si deve chiamare la funzione MySqlDisconnect all'interno della funzione stundard OnDeinit().
4. Dovete controllare l'identificatore di connessione al database all'interno della funzione standard OnTick() per essere sicuri che la connessione sia avvenuta con successo.
Alla fine si otterrà l'aspetto seguente.
Ok, vedo che hai scritto un expert advisor per questo scopo, ed è scritto senza le raccomandazioni che ho postato nell'articolo.
Quindi, procediamo passo dopo passo: 1.
1. La chiamata di " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " dovrebbe essere fatta all'interno di OnInit() invece che in OnTick(). 2. Si sta utilizzando cMySqlConnect per il database.
2. Si utilizza cMySqlConnect - è una funzione importata dalla DLL, si deve utilizzare la funzione MySqlConnect invece di cMySqlConnect !
3. Si deve chiamare la funzione MySqlDisconnect all'interno della funzione stundard OnDeinit().
4. Dovete controllare l'identificatore di connessione al database all'interno della funzione standard OnTick() per essere sicuri che la connessione sia avvenuta con successo.
Alla fine si otterrà l'aspetto seguente.
Ok, vedo che hai scritto un expert advisor per questo scopo, ed è scritto senza le raccomandazioni che ho postato nell'articolo.
Quindi, procediamo passo dopo passo: 1.
1. La chiamata di " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " dovrebbe essere fatta all'interno di OnInit() invece che in OnTick(). 2. Si sta utilizzando cMySqlConnect per il database.
2. Si utilizza cMySqlConnect - è una funzione importata dalla DLL, si deve utilizzare la funzione MySqlConnect invece di cMySqlConnect !
3. Si deve chiamare la funzione MySqlDisconnect all'interno della funzione stundard OnDeinit().
4. Dovete controllare l'identificatore di connessione al database all'interno della funzione standard OnTick() per essere sicuri che la connessione sia avvenuta con successo.
Alla fine si otterrà l'aspetto seguente.
Ho cambiato passo per passo, ma il problema è ancora presente quando si utilizza l'esperto in un mt4 per quattro o più simboli. stampa " Violazione dell'accesso letto a 0x0000000B in '... .MQLMySQL.dll'
".
il codice è il seguente
<--
#include <MQLMySQL.mqh
int MySqlErrorNumber; // numero di errore recente di MySQL
string MySqlErrorDescription; // descrizione dell'errore
//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell'esperto & nbsp; |
//+------------------------------------------------------------------+
int OnInit()
OnInit(); int OnInit()
EventSetTimer(timeSeconds);
DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); if( DB == -1 )
if( DB == -1 )
{
Print("Il database non è connesso..."); if( DB == -1 ) { print("Il database non è connesso... "); }
}
return(INIT_SUCCEED); }
}
//+------------------------------------------------------------------+
//| Funzione di deinizializzazione esperta |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
MySqlDisconnect(DB);
EventKillTimer();
ObjectsDeleteAll();
}
void OnTimer()
{
//Alert(TimeCurrent());
OnTick();
}
//+------------------------------------------------------------------+
//| Funzione di tick esperta & nbsp; |
//+------------------------------------------------------------------+
void OnTick()
{
if( DB == -1 )
{
Alert("Il database non è connesso ... "); return; { Alert("Il database non è connesso...")
return; }
}
if( IsExpertEnabled() && IsConnected() && AccountNumber() > 0 && DB ! = -1 )
{
int account = AccountNumber();
string symbol = Symbol(); if( cmd !
se( cmd ! = "" && cmd ! = NULL )
{
symbol = cmd; }
}
symbolOrder = symbol + "_table";
double spread = (Ask - Bid); } symbolOrder = symbol + "_table"; }
ammissione = spread*MathPow(10, Digits).
//int DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);
Query = "SELECT * FROM " + symbol + " where AccountNumber = " + (string)AccountNumber();
//Stampa(Query);
int Cursore1 = MySqlCursorOpen(DB, Query);
se (Cursore1 >= 0)
{
int Rows1 = MySqlCursorRows(Cursor1); int Cursor1 = MySqlCursorOpen(DB, Query); if (Cursor1 >= 0)
int dataRows1 = Rows1;
//Alert(dataRows);
if( dataRows1 > 0 )
{
Query = "update " + symbol + " set Bid = " + (string)Bid + ", Ask = " + ( stringa)Ask
+ ", Spread = " + DoubleToStr(spread, cifre)
+ ", Time = '" + TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS ) + " 'dove AccountNumber = "
+ (stringa)conto; // + "' e Simbolo = '" + simbolo + "'".
MySqlExecute(DB, Query);
MySqlCursorClose(Cursore1);
}
else if( dataRows1 == 0 )
{
Query = "CREATE TABLE IF NOT EXISTS " + symbol + " (id int NOT NULL AUTO_ INCREMENT PRIMARY KEY, AccountNumber int, "
+ "Symbol char(20), Bid double, Ask double, Spread double,"
+ "Memo char(50), "
+ "Time datetime) ENGINE=MEMORY DEFAULT CHARSET=utf8 ";
MySqlExecute(DB, Query);
Query = "INSERT INTO " + symbol + "(AccountNumber, Symbol, Bid, Ask, Spread. Memo, Time) VALUES ("
+ (stringa)account + ", '" + simbolo + "', "+ (stringa)Bid+", "+ (stringa)Ask + ", "
+ DoubleToStr(spread, cifre)
+ ", '" + (stringa)AccountCompany()
+ ", \'"+TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\')"";
if(MySqlExecute(DB, Query) ! = true )
{
//Query = "DROP TABLE IF EXISTS `data_table`";
//MySqlExecute(DB, Query);
Query = "CREATE TABLE IF NOT EXISTS " + symbol + "(id int NOT NULL AUTO_INCREMENT PRIMARY KEY, AccountNumber int, "
+ "Symbol char(20), Bid double, Ask double, Spread doppio,"
+ "Memo char(50), "
+ "Time datetime) ENGINE=MEMORY DEFAULT CHARSET= utf8 ";
MySqlExecute(DB, Query);
}
}
MySqlCursorClose(Cursor1); // NON DIMENTICARE MAI DI CHIUDERE IL CURSORE !!!!
}
}
}
-->
Ok, vedo che hai scritto un expert advisor per questo scopo, ed è scritto senza le raccomandazioni che ho postato nell'articolo.
Quindi, procediamo passo dopo passo: 1.
1. La chiamata di " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " dovrebbe essere fatta all'interno di OnInit() invece che in OnTick(). 2. Si sta utilizzando cMySqlConnect per il database.
2. Si utilizza cMySqlConnect - è una funzione importata dalla DLL, si deve utilizzare la funzione MySqlConnect invece di cMySqlConnect !
3. Si deve chiamare la funzione MySqlDisconnect all'interno della funzione stundard OnDeinit().
4. Dovete controllare l'identificatore di connessione al database all'interno della funzione standard OnTick() per essere sicuri che la connessione sia avvenuta con successo.
Alla fine si otterrà l'aspetto seguente.
Il problema è che non può essere utilizzato in un mt4 per più di due simboli; se lo si utilizza per un solo simbolo, è normale; se lo si utilizza per quattro o più simboli, funziona bene, ma dopo pochi minuti stampa il problema "OnTick()". Dopo pochi minuti, viene stampato il problema "Access violation read to 0x0000000B in '...MQLMySQL.db'". .MQLMySQL.dll'".
Gli esempi sono tutti script, è stato eseguito solo una volta, si può provare un esperto chiamare la dll in quattro o più simboli in uno o due mt4, si può trovare il problema.
Sarebbe il dll ha bisogno di un rilascio memeoy o raccolta garbe?
scarichi le perdite dopo la d istruzione dei dati statici, e questo causa ο segnalazioni di perdite spurie per gli oggetti che hanno allocato memoria prima che MFC fosse inizializzato e che quindi sono distrutti dopo l'uscita di MFC nbsp;
segnalazioni di perdite spurie per gli oggetti che hanno allocato memoria prima che MFC
fosse inizializzato e che quindi vengono distrutti dopo l' uscita di MFC. Questo è
comunemente osservato quando si utilizza la DLL MFC in un programma che utilizza anche
la DLL di runtime C++.
Salve ancora una volta.
In base al codice che ha fornito, immagino che lei sia nuovo di MQL.
Mi dispiace, non ho tempo per insegnarti, ma ho tempo per testare il software che ho sviluppato.
Mi dispiace, non ho tempo per insegnarti, ma ho tempo per testare il software che ho sviluppato. Quindi, ecco i log allegati.
Ho costruito un EA di prova per voi, basato sulla vostra logica: ogni tabella definita per ogni coppia di valute e può mantenere i dati di mercato online per diversi conti.
È possibile esaminare i log, non è stato generato alcun errore "Access violation...". È possibile esaminare i log, non è stato rilevato alcun errore "Violazione dell'accesso...".
Il problema non è nella libreria MQLMySQL.
Test di EA.
Questa è la giusta logica di utilizzo della libreria.
Grazie all'ottimizzazione si può anche non usare l'istruzione SELECT, ma solo eseguire l'istruzione UPDATE, quindi controllare se (MySqlRowsAffected()==0) significa che nessuna riga è stata aggiornata. Avete circa il 100% degli aggiornamenti, quindi applicate l'istruzione INSERT.
Avete circa il 100% degli aggiornamenti, quindi questo workaround può aumentare le prestazioni e ridurre il traffico di rete.
Alla fine, i codici sorgenti completi del progetto (incluso lo sviluppo della DLL) sono stati allegati all'articolo, e potete modificarli a vostro piacimento.
Se il problema risiede comunque in MqlMySQL.DLL, è possibile eseguire il debug e risolverlo da soli.
Auguri, Eugene
Eugene
Ottimo lavoro, grazie mille Eugeniy.
I tuoi codici mi aiutano molto, posso risparmiare molto tempo. Ho provato a fare query INSERT, SELECT, UPDATE e DELETE con successo. Se non sbaglio, il "Cursore" è necessario solo per le query SELECT?
= pedma
Ottimo lavoro, grazie mille Eugeniy.
I tuoi codici mi aiutano molto, posso risparmiare molto tempo. Ho provato a fare query INSERT, SELECT, UPDATE e DELETE con successo. Se non sbaglio, il "Cursore" è necessario solo per le query SELECT?
= pedma
Esattamente!
Il cursore viene utilizzato solo per la selezione dei dati perché dobbiamo ricevere i dati dal db in una variabile MQL, non solo per inviare il comando sql al database.
Sono contento che la mia soluzione ti sia stata d'aiuto.
Buona fortuna,
Eugene
Ciao Eugene,
Mi chiedevo se fai ancora progetti di sviluppo a pagamento, dato che sto cercando di creare un copiatore di scambi a distanza integrato in un EA che venderò.
Ho dato un'occhiata a Upwork e non mi sembra che tu abbia completato alcun progetto da freelance di recente.
Ho provato io stesso a utilizzare la libreria che hai creato, ma non è andata molto bene. Tuttavia, sono sicuro che sarebbe facile per qualcuno con le tue capacità di programmazione!
Grazie in anticipo,
Giacomo
Ciao Eugene,
Mi chiedevo se fai ancora progetti di sviluppo a pagamento, dato che sto cercando di creare un copiatore di scambi a distanza integrato in un EA che venderò.
Ho dato un'occhiata a Upwork e non mi sembra che tu abbia completato alcun progetto da freelance di recente.
Ho provato io stesso a utilizzare la libreria che hai creato, ma non è andata molto bene. Tuttavia, sono sicuro che sarebbe facile per qualcuno con le tue capacità di programmazione!
Grazie in anticipo,
Giacomo
Ciao James,
Attualmente sto lavorando su Upwork solo su un grande progetto. Quindi, non ho molto tempo libero al giorno d'oggi. Qual è il problema che hai con le librerie? Come posso aiutarti?