Diskussion zum Artikel "Wie man auf die MySQL-Datenbank von MQL5 (MQL4) aus zugreift" - Seite 7
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Ok, ich sehe, Sie haben einen Expertenberater für diese Zwecke geschrieben, und es ist ohne Empfehlungen geschrieben, die ich in Artikel gepostet habe.
Also, gehen wir Schritt für Schritt vor: 1.
1. der Aufruf von " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " sollte innerhalb von OnInit() gemacht werden Standardfunktion anstelle von OnTick() erfolgen. 2.
2. Sie verwenden cMySqlConnect - es ist eine importierte Funktion aus der DLL, Sie müssen die Funktion MySqlConnect anstelle von cMySqlConnect-Funktion verwenden !
3) Sie müssen die Funktion MySqlDisconnect innerhalb der Standardfunktion OnDeinit() aufrufen.
4) Sie müssen die Kennung der Datenbankverbindung in der OnTick()-Standardfunktion überprüfen, um sicher zu sein, dass die Verbindung erfolgreich war.
Schließlich sieht es so aus.
Ok, ich sehe, dass Sie einen Expert Advisor für diesen Zweck geschrieben haben, und er ist ohne die Empfehlungen geschrieben, die ich in meinem Artikel geschrieben habe.
Also, gehen wir Schritt für Schritt vor: 1.
1. der Aufruf von " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " sollte innerhalb von OnInit() gemacht werden Standardfunktion anstelle von OnTick() erfolgen. 2.
2. Sie verwenden cMySqlConnect - es ist eine importierte Funktion aus der DLL, Sie müssen die Funktion MySqlConnect anstelle von cMySqlConnect-Funktion verwenden !
3) Sie müssen die Funktion MySqlDisconnect innerhalb der Standardfunktion OnDeinit() aufrufen.
4) Sie müssen die Kennung der Datenbankverbindung in der OnTick()-Standardfunktion überprüfen, um sicher zu sein, dass die Verbindung erfolgreich war.
Schließlich wird es so aussehen.
Ok, ich sehe, dass Sie einen Expert Advisor für diesen Zweck geschrieben haben, und er ist ohne die Empfehlungen geschrieben, die ich in meinem Artikel geschrieben habe.
Also, gehen wir Schritt für Schritt vor: 1.
1. der Aufruf von " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " sollte innerhalb von OnInit() gemacht werden Standardfunktion anstelle von OnTick() erfolgen. 2.
2. Sie verwenden cMySqlConnect - es ist eine importierte Funktion aus der DLL, Sie müssen die Funktion MySqlConnect anstelle von cMySqlConnect-Funktion verwenden !
3) Sie müssen die Funktion MySqlDisconnect innerhalb der Standardfunktion OnDeinit() aufrufen.
4) Sie müssen die Kennung der Datenbankverbindung in der OnTick()-Standardfunktion überprüfen, um sicher zu sein, dass die Verbindung erfolgreich war.
Schließlich wird es so aussehen.
Ich änderte Schritt für Schritt, aber das Problem ist immer noch vorhanden, wenn der Experte in einem mt4 für vier oder mehr Symbole verwenden. es drucken " Access violation lesen 0x0000000B in '... .MQLMySQL.dll'
"
Der Code ist wie folgt
<--
#include <MQLMySQL.mqh
int MySqlErrorNumber; // aktuelle MySQL-Fehlernummer
string MySqlErrorDescription; // Fehlerbeschreibung
//+------------------------------------------------------------------+
//| Experteninitialisierungsfunktion & nbsp; |
//+------------------------------------------------------------------+
int OnInit()
OnInit(); int OnInit()
EventSetTimer(timeSeconds);
DB = MySqlConnect(Host, Benutzer, Passwort, Datenbank, Port, Socket, ClientFlag); if( DB == -1 )
if( DB == -1 )
{
Print("Datenbank ist nicht verbunden ..."); if( DB == -1 ) { print("Datenbank ist nicht verbunden ... "); }
}
return(INIT_SUCCEEDED); }
}
//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
MySqlDisconnect(DB);
EventKillTimer();
ObjectsDeleteAll();
}
void OnTimer()
{
//Alert(TimeCurrent());
OnTick();
}
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion & nbsp; |
//+------------------------------------------------------------------+
void OnTick()
{
if( DB == -1 )
{
Alert("Datenbank ist nicht verbunden ... "); return; { Alert("Datenbank ist nicht verbunden ...")
return; }
}
if( IsExpertEnabled() && IsConnected() && AccountNumber() > 0 && DB ! = -1 )
{
int Konto = KontoNummer();
string symbol = Symbol(); if( cmd !
if( cmd ! = "" && cmd ! = NULL )
{
Symbol = cmd; }
}
symbolOrder = symbol + "_table";
double spread = (Ask - Bid); } symbolOrder = symbol + "_table"; }
admission = spread*MathPow(10, Digits).
//int DB = cMySqlConnect(Host, Benutzer, Passwort, Datenbank, Port, Socket, ClientFlag);
Query = "SELECT * FROM " + symbol + " where AccountNumber = " + (string)AccountNumber();
//Drucken(Abfrage);
int Cursor1 = MySqlCursorOpen(DB, Query);
if (Cursor1 >= 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 = " + ( String)Ask
+ ", Spread = " + DoubleToStr(Spread, Digits)
+ ", Zeit = '" + TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS ) + "' where AccountNumber = "
+ (string)Konto; // + "' und Symbol = '" + symbol + "'".
MySqlExecute(DB, Query);
MySqlCursorClose(Cursor1);
}
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), "
+ "Zeit datetime) ENGINE=MEMORY DEFAULT CHARSET=utf8 ";
MySqlExecute(DB, Query);
Query = "INSERT INTO " + symbol + "(AccountNumber, Symbol, Bid, Ask, Spread. Memo, Zeit) VALUES ("
+ (string)account + ", '" + symbol + "', "+(string)Bid+", "+ (string)Ask + ", "
+ DoubleToStr(spread, Ziffern)
+ ", '" + (string)Kontofirma()
+ "', \'"+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 double,"
+ "Memo char(50), "
+ "Zeit datetime) ENGINE=MEMORY DEFAULT CHARSET= utf8 ";
MySqlExecute(DB, Query);
}
}
MySqlCursorClose(Cursor1); // NIEMALS VERGESSEN, den CURSOR zu schließen !!!!
}
}
}
-->
Ok, ich sehe, dass Sie einen Expert Advisor für diesen Zweck geschrieben haben, und er ist ohne die Empfehlungen geschrieben, die ich in meinem Artikel geschrieben habe.
Also, gehen wir Schritt für Schritt vor: 1.
1. der Aufruf von " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " sollte innerhalb von OnInit() gemacht werden Standardfunktion anstelle von OnTick() erfolgen. 2.
2. Sie verwenden cMySqlConnect - es ist eine importierte Funktion aus der DLL, Sie müssen die Funktion MySqlConnect anstelle von cMySqlConnect-Funktion verwenden !
3) Sie müssen die Funktion MySqlDisconnect innerhalb der Standardfunktion OnDeinit() aufrufen.
4) Sie müssen die Kennung der Datenbankverbindung in der OnTick()-Standardfunktion überprüfen, um sicher zu sein, dass die Verbindung erfolgreich war.
Schließlich wird es so aussehen.
Das Problem ist, dass es nicht in einem mt4 für mehr als zwei Symbole verwendet werden kann, wenn es nur in einem Symbol verwendet wird, ist es normal. Wenn es in vier oder mehr Symbolen verwendet wird, läuft es gut, aber nach ein paar Minuten, druckt es das Problem "OnTick()". Minuten wird das Problem "Access violation read to 0x0000000B in '...MQLMySQL.db'" gedruckt. .MQLMySQL.dll'"
Die exambles ist alle Skripte, es ist nur ein Mal ausgeführt, Sie können versuchen, ein Experten rufen Sie die dll in vier oder mehr Symbole in ein oder zwei mt4, Sie können das Problem finden.
Wäre die dll braucht ein memeoy Release oder garbe Sammlung?
CRT Lecks nach der Zerstörung st atischer Daten entsorgt, und dies führt zu ο falschen Leckberichten für Objekte, die Speicher zugewiesen haben, bevor MFC initialisiert wurde, und die daher nach MFC zerstört werden nbsp;
falsche Leckmeldungen für Objekte, die Speicher zugewiesen haben, bevor die MFC
initialisiert wurde, und die daher nach dem Beenden der MFC zerstört werden. Dies wird
häufig beobachtet, wenn die MFC-DLL in einem Programm verwendet wird, das auch
die C++-Laufzeit-DLLverwendet .
Hallo noch einmal.
Anhand des Codes, den Sie uns zur Verfügung gestellt haben, vermute ich, dass Sie neu in MQL sind.
Es tut mir leid, ich habe keine Zeit, Sie zu unterrichten, aber ich habe Zeit, die Software zu testen, die ich entwickelt habe.
Es tut mir leid, dass ich keine Zeit habe, Ihnen etwas beizubringen, aber ich habe Zeit, die Software zu testen, die ich entwickelt habe.
Ich habe einen Test-EA für Sie gebaut, der auf Ihrer Logik basiert: jede Tabelle ist für jedes Währungspaar definiert und kann die Online-Marktdaten für verschiedene Konten halten.
Sie können die Logs einsehen, kein einziger Fehler "Access violation..." wurde ausgelöst. Sie können die Protokolle einsehen, kein einziger Fehler "Access violation..." wurde ausgelöst.
Das Problem liegt nicht in der MQLMySQL-Bibliothek.
EA testen.
Das ist die richtige Logik bei der Verwendung der Bibliothek.
Aufgrund der Optimierung können Sie sogar keine SELECT-Anweisung verwenden, sondern nur eine UPDATE-Anweisung ausführen und dann prüfen, ob (MySqlRowsAffected()==0) bedeutet, dass keine Zeile aktualisiert wurde. Sie haben ~100% der Aktualisierungen, also wenden Sie die INSERT-Anweisung an.
Sie haben ~100% der Aktualisierungen, also kann dieser Workaround die Leistung erhöhen und den Netzwerkverkehr reduzieren.
Und am Ende, vollständige Quellcodes des Projekts (einschließlich DLL-Entwicklung) wurde an den Artikel angehängt, können Sie es auf Ihre eigene Weise zu ändern.
Wenn Sie das Problem ohnehin in der MqlMySQL.DLL finden, können Sie es selbst debuggen und beheben.
Beste Wünsche, Eugene
Eugene
Großartige Arbeit, vielen Dank , Eugeniy.
Ihre Codes helfen mir so sehr, ich kann so viel Zeit sparen. Ich habe versucht, INSERT, SELECT, UPDATE und DELETE Abfrage erfolgreich zu tun. Wenn ich nicht falsch liege, wird der "Cursor" nur für SELECT-Abfragen benötigt ??
= pedma
Großartige Arbeit, vielen Dank , Eugeniy.
Ihre Codes helfen mir so sehr, ich kann so viel Zeit sparen. Ich habe versucht, INSERT, SELECT, UPDATE und DELETE Abfrage erfolgreich zu tun. Wenn ich nicht falsch liege, wird der "Cursor" nur für SELECT-Abfragen benötigt ??
= pedma
Ganz genau, Mann!
Die Cursor werden nur für die Datenauswahl verwendet, da wir die Daten von der Datenbank in die MQL-Variable erhalten müssen, nicht nur um den SQL-Befehl an die Datenbank zu senden.
Ich bin froh, dass meine Lösung Ihnen hilft.
Viel Glück!
Eugene
Hallo Eugene,
Ich habe mich gefragt, ob du immer noch bezahlte Entwicklungsprojekte durchführst, da ich einen Remote Trade Copier erstellen möchte, der in einen EA integriert ist, den ich verkaufen werde?
Ich habe auf Upwork nachgesehen und du scheinst in letzter Zeit keine Freelancer-Projekte abgeschlossen zu haben.
Ich habe es selbst mit der von Ihnen erstellten Bibliothek versucht, aber es hat nicht so gut geklappt. Aber ich bin mir sicher, dass es für jemanden mit Ihren Programmierfähigkeiten ein Leichtes wäre!
Vielen Dank im Voraus,
James
Hallo Eugene,
Ich habe mich gefragt, ob du immer noch bezahlte Entwicklungsprojekte durchführst, da ich einen Remote Trade Copier erstellen möchte, der in einen EA integriert ist, den ich verkaufen werde?
Ich habe auf Upwork nachgesehen und du scheinst in letzter Zeit keine Freelancer-Projekte abgeschlossen zu haben.
Ich habe es selbst mit der von Ihnen erstellten Bibliothek versucht, aber es hat nicht so gut geklappt. Aber ich bin mir sicher, dass es für jemanden mit Ihren Programmierfähigkeiten ein Leichtes wäre!
Vielen Dank im Voraus,
James
Hallo James,
ich arbeite bei Upwork derzeit nur an einem großen Projekt. Daher habe ich derzeit nicht viel freie Zeit. Was ist das Problem, das du mit Libs hast? Wie kann ich dir helfen?