input int InpRates=100;
//+------------------------------------------------------------------+
//| Skript Programm Start Funktion |
//+------------------------------------------------------------------+
void OnStart()
{
MqlRates rates[];
//--- Merken der Startzeit vor dem Empfang der Balken
ulong start=GetMicrosecondCount();
//--- Abfrage der letzten 100 H1-Balken
if(CopyRates(Symbol(), PERIOD_H1, 1, InpRates, rates)<InpRates)
{
Print("CopyRates() ist fehlgeschlagen, Fehler: ", GetLastError());
return;
}
else
{
//--- wie viele Balken empfangen wurden und wie lange es dauerte, sie zu empfangen
PrintFormat("%s: CopyRates erhielt %d Balken in %d ms ",
_Symbol, ArraySize(rates), (GetMicrosecondCount()-start)/1000);
}
//--- Setzen des Dateinamen zum Speichern der Datenbank
string filename=_Symbol+"_"+EnumToString(PERIOD_H1)+"_"+TimeToString(TimeCurrent())+".sqlite";
StringReplace(filename, ":", "-"); // ":" nichterlaubtes Zeichen in Dateinamen
//--- Erstellen/Öffnen einer Datenbank im Verzeichnis Common des Terminals
int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE|DATABASE_OPEN_CREATE|DATABASE_OPEN_COMMON);
if(db==INVALID_HANDLE)
{
Print("Database: ", filename, " Öffnen fehlgeschlagen, Fehlernummer: ", GetLastError());
return;
}
else
Print("Database: ", filename, " erfolgreich geöffnet");
//--- Prüfung ob die Tabelle RATES existiert
if(DatabaseTableExists(db, "RATES"))
{
//--- Entfernen der Tabelle RATES
if(!DatabaseExecute(db, "TABELLE RATES LÖSCHEN, WENN VORHANDEN"))
{
Print("Löschen der Tabelle TEST ist fehlgeschlagen mit der Fehlernummer ", GetLastError());
DatabaseClose(db);
return;
}
}
//--- Erstellen der Tabelle RATES
if(!DatabaseExecute(db, "Erstellen der Tabelle RATES("
"SYMBOL CHAR(10),"
"TIME INT NOT NULL,"
"OPEN REAL,"
"HIGH REAL,"
"LOW REAL,"
"CLOSE REAL,"Nahe am realen
"TICK_VOLUME INT,"
"SPREAD INT,"
"REAL_VOLUME INT);"))
{
Print("DB: ", filename, " Erstellen der Tabelle RATES, Fehlernummer: ", GetLastError());
DatabaseClose(db);
return;
}
//--- Anzeige der Liste aller Felder in der Tabelle RATES
if(DatabasePrint(db, "PRAGMA TABLE_INFO(RATES)", 0)<0)
{
PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(RATES)\") fehlgeschlagen, Fehlernummer=%d in Zeile %d", GetLastError(), __LINE__);
DatabaseClose(db);
return;
}
//--- Erstellen einer parametrisierten Anfrage zum Hinzufügen von Balken zur Tabelle RATES
string sql="INSERT INTO RATES (SYMBOL,TIME,OPEN,HIGH,LOW,CLOSE,TICK_VOLUME,SPREAD,REAL_VOLUME)"
" VALUES (?1,?2,?3,?4,?5,?6,?7,?8,?9)"; // benötigte Parameter
int request=DatabasePrepare(db, sql);
if(request==INVALID_HANDLE)
{
PrintFormat("DatabasePrepare() fehlgeschlagen, Fehlernummer=%d", GetLastError());
Print("SQL Anfrage: ", sql);
DatabaseClose(db);
return;
}
//--- Setzen des Wertes des ersten Parameters der Anfrage
DatabaseBind(request, 0, _Symbol);
//--- Merken der Startzeit, bevor die Balken der Tabelle RATES hinzugefügt werden
start=GetMicrosecondCount();
DatabaseTransactionBegin(db);
int total=ArraySize(rates);
bool request_error=false;
for(int i=0; i<total; i++)
{
//--- Festlegen der übrigen Parameter vor dem Hinzufügen des Eintrags die Werte
ResetLastError();
if(!DatabaseBind(request, 1, rates[i].time))
{
PrintFormat("DatabaseBind() fehlgeschlagen, Fehlernummer=%d", GetLastError());
PrintFormat("Balken #%d Zeile=%d", i+1, __LINE__);
request_error=true;
break;
}
//--- wenn der vorherige DatabaseBind()-Aufruf erfolgreich war, wird der nächste Parameter gesetzt
if(!request_error && !DatabaseBind(request, 2, rates[i].open))
{
PrintFormat("DatabaseBind() fehlgeschlagen, Fehlernummer=%d", GetLastError());
PrintFormat("Balken #%d Zeile=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 3, rates[i].high))
{
PrintFormat("DatabaseBind() fehlgeschlagen, Fehlernummer=%d", GetLastError());
PrintFormat("Balken #%d Zeile=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 4, rates[i].low))
{
PrintFormat("DatabaseBind() fehlgeschlagen, Fehlernummer=%d", GetLastError());
PrintFormat("Balken #%d Zeile=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 5, rates[i].close))
{
PrintFormat("DatabaseBind() fehlgeschlagen, Fehlernummer=%d", GetLastError());
PrintFormat("Balken #%d Zeile=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 6, rates[i].tick_volume))
{
PrintFormat("DatabaseBind() fehlgeschlagen, Fehlernummer=%d", GetLastError());
PrintFormat("Balken #%d Zeile=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 7, rates[i].spread))
{
PrintFormat("DatabaseBind() fehlgeschlagen, Fehlernummer=%d", GetLastError());
PrintFormat("Balken #%d Zeile=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 8, rates[i].real_volume))
{
PrintFormat("DatabaseBind() fehlgeschlagen, Fehlernummer=%d", GetLastError());
PrintFormat("Balken #%d Zeile=%d", i+1, __LINE__);
request_error=true;
break;
}
//--- eine Anfrage zum Einfügen des Eintrags ausführen und auf Fehler prüfen
if(!request_error && !DatabaseRead(request) && (GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
{
PrintFormat("DatabaseRead() fehlgeschlagen, Fehlernummer=%d", GetLastError());
DatabaseFinalize(request);
request_error=true;
break;
}
//--- die Anfrage vor der nächsten Aktualisierung der Parameter zurücksetzen
if(!request_error && !DatabaseReset(request))
{
PrintFormat("DatabaseReset() fehlgeschlagen, Fehlernummer=%d", GetLastError());
DatabaseFinalize(request);
request_error=true;
break;
}
} //--- fertig, alle Balken durchlaufen
//--- Transaktionsstatus
if(request_error)
{
PrintFormat("Tabelle RATES: hinzufügen von %d Balken ist fehlgeschlagen", ArraySize(rates));
DatabaseTransactionRollback(db);
DatabaseClose(db);
return;
}
else
{
DatabaseTransactionCommit(db);
PrintFormat("Tabelle RATES: %d Balken in %d ms hinzugefügt",
ArraySize(rates), (GetMicrosecondCount()-start)/1000);
}
//--- Speichern der Tabelle RATES in einer CSV-Datei
string csv_filename=Symbol()+".csv";
long saved=DatabaseExport(db, "SELECT * FROM RATES", csv_filename, DATABASE_EXPORT_HEADER|DATABASE_EXPORT_INDEX|DATABASE_EXPORT_COMMON_FOLDER, ";");
if(saved>0)
Print("Tabelle RATES gespeichert in ", Symbol(), ".csv");
else
Print("DatabaseExport() fehlgeschlagen mit Fehlernummer ", GetLastError());
//--- Schließen der Datenbankdatei und Informieren darüber
DatabaseClose(db);
PrintFormat("Database: %s erstellt und geschlossen", filename);
}
|