//+------------------------------------------------------------------+
// | Funzione di avvio del programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
MqlTick ticks[];
//--- ricorda l'ora di inizio prima di ricevere i ticks
uint start=GetTickCount();
//--- richiede la cronistoria dei tick al giorno
ulong to=TimeCurrent()*1000;
ulong from=to-PeriodSeconds(PERIOD_D1)*1000;
if(CopyTicksRange(_Symbol, ticks, COPY_TICKS_ALL, from, to)==-1)
{
PrintFormat("%s: CopyTicksRange(%s - %s) fallito, errore=%d",
_Symbol, TimeToString(datetime(from/1000)), TimeToString(datetime(to/1000)), _LastError);
return;
}
else
{
//--- quanti ticks sono stati ricevuti e quanto tempo ci è voluto per riceverli
PrintFormat("%s: CopyTicksRange ha ricevuto %d ticks in %d ms (da %s a %s)",
_Symbol, ArraySize(ticks), GetTickCount()-start,
TimeToString(datetime(from/1000)), TimeToString(datetime(to/1000)));
}
//--- imposta il nome del file per la memorizzazione del database
string filename=_Symbol+" "+TimeToString(datetime(from/1000))+" - "+TimeToString(datetime(to/1000))+".sqlite";
StringReplace(filename, ":", "."); // Il carattere ":" non è consentito nei nomi dei file
//--- apre/crea il database nella cartella terminale comune
int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE | DATABASE_OPEN_COMMON);
if(db==INVALID_HANDLE)
{
Print("Database: ", filename, " apri file con codice ", GetLastError());
return;
}
else
Print("Database: ", filename, " aperto con successo");
//--- crea la tabella TICKS
if(!DatabaseExecute(db, "CREATE TABLE TICKS("
"SYMBOL CHAR(10),"
"TIME INT NOT NULL,"
"BID REAL,"
"ASK REAL,"
"LAST REAL,"
"VOLUME INT,"
"TIME_MSC INT,"
"VOLUME_REAL REAL);"))
{
Print("DB: ", filename, " creazione tabella TICKS fallita con codice ", GetLastError());
DatabaseClose(db);
return;
}
//--- visualizza l'elenco di tutti i campi nella tabella TICKS
if(DatabasePrint(db, "PRAGMA TABLE_INFO(TICKS)", 0)<0)
{
PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(TICKS)\") fallito, codice errore=%d at line %d", GetLastError(), __LINE__);
DatabaseClose(db);
return;
}
//--- crea una richiesta parametrizzata per aggiungere ticks alla tabella TICKS
string sql="INSERT INTO TICKS (SYMBOL,TIME,BID,ASK,LAST,VOLUME,TIME_MSC,VOLUME_REAL)"
" VALUES (?1,?2,?3,?4,?5,?6,?7,?8)"; // parametri di richiesta
int request=DatabasePrepare(db, sql);
if(request==INVALID_HANDLE)
{
PrintFormat("DatabasePrepare() fallito con codice=%d", GetLastError());
Print("SQL request: ", sql);
DatabaseClose(db);
return;
}
//--- imposta il valore del primo parametro di richiesta
DatabaseBind(request, 0, _Symbol);
//--- ricorda l'ora di inizio prima di aggiungere ticks alla tabella TICKS
start=GetTickCount();
DatabaseTransactionBegin(db);
int total=ArraySize(ticks);
bool request_error=false;
for(int i=0; i<total; i++)
{
//--- imposta i valori dei parametri rimanenti prima di aggiungere la voce
ResetLastError();
if(!DatabaseBind(request, 1, ticks[i].time))
{
PrintFormat("DatabaseBind() fallito con codice=%d", GetLastError());
PrintFormat("Tick #%d riga=%d", i+1, __LINE__);
request_error=true;
break;
}
//--- se la precedente chiamata DatabaseBind() ha avuto esito positivo, imposta il parametro successivo
if(!request_error && !DatabaseBind(request, 2, ticks[i].bid))
{
PrintFormat("DatabaseBind() fallito con codice=%d", GetLastError());
PrintFormat("Tick #%d riga=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 3, ticks[i].ask))
{
PrintFormat("DatabaseBind() fallito con codice=%d", GetLastError());
PrintFormat("Tick #%d riga=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 4, ticks[i].last))
{
PrintFormat("DatabaseBind() fallito con codice=%d", GetLastError());
PrintFormat("Tick #%d riga=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 5, ticks[i].volume))
{
PrintFormat("DatabaseBind() fallito con codice=%d", GetLastError());
PrintFormat("Tick #%d riga=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 6, ticks[i].time_msc))
{
PrintFormat("DatabaseBind() fallito con codice=%d", GetLastError());
PrintFormat("Tick #%d riga=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 7, ticks[i].volume_real))
{
PrintFormat("DatabaseBind() fallito con codice=%d", GetLastError());
PrintFormat("Tick #%d riga=%d", i+1, __LINE__);
request_error=true;
break;
}
//--- esegue una richiesta di inserimento della voce e verifica la presenza di un errore
if(!request_error && !DatabaseRead(request) && (GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
{
PrintFormat("DatabaseRead() fallito con codice=%d", GetLastError());
DatabaseFinalize(request);
request_error=true;
break;
}
//--- resetta la richiesta prima del prossimo aggiornamento dei parametri
if(!request_error && !DatabaseReset(request))
{
PrintFormat("DatabaseReset() fallito con codice=%d", GetLastError());
DatabaseFinalize(request);
request_error=true;
break;
}
} //--- fatto passando attraverso tutti i ticks
//--- stato delle transazioni
if(request_error)
{
PrintFormat("Tabella TICKS: fallita per aggiungere %d ticks ", ArraySize(ticks));
DatabaseTransactionRollback(db);
DatabaseClose(db);
return;
}
else
{
DatabaseTransactionCommit(db);
PrintFormat("Tabella TICKS: aggiunti %d ticks in %d ms",
ArraySize(ticks), GetTickCount()-start);
}
//--- chiude il file del database e informa di ciò
DatabaseClose(db);
PrintFormat("Database: %s creato e chiuso", filename);
}
/*
Risultato:
EURUSD: CopyTicksRange received 268061 ticks in 47 ms (from 2020.03.18 12:40 to 2020.03.19 12:40)
Database: EURUSD 2020.03.18 12.40 - 2020.03.19 12.40.sqlite aperto con successo
#| cid name type notnull dflt_value pk
-+-----------------------------------------------
1| 0 SYMBOL CHAR(10) 0 0
2| 1 TIME INT 1 0
3| 2 BID REAL 0 0
4| 3 ASK REAL 0 0
5| 4 LAST REAL 0 0
6| 5 VOLUME INT 0 0
7| 6 TIME_MSC INT 0 0
8| 7 VOLUME_REAL REAL 0 0
Table TICKS: added 268061 ticks in 797 ms
Database: EURUSD 2020.03.18 12.40 - 2020.03.19 12.40.sqlite created and closed
OnCalculateCorrelation=0.87 2020.03.19 13:00: EURUSD vs GBPUSD PERIOD_M30
*/
|