//+------------------------------------------------------------------+
//| Fonction de démarrage du script |
//+------------------------------------------------------------------+
void OnStart()
{
MqlTick ticks[];
//--- mémorise l'heure de début avant de recevoir les ticks
uint start=GetTickCount();
//--- demande l'historique des ticks par jour
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) a échoué, erreur=%d",
_Symbol, TimeToString(datetime(from/1000)), TimeToString(datetime(to/1000)), _LastError);
return;
}
else
{
//--- combien de ticks ont été reçus et combien de temps il a fallu pour les recevoir
PrintFormat("%s : CopyTicksRange a reçu %d ticks en %d ms (de %s à %s)",
_Symbol, ArraySize(ticks), GetTickCount()-start,
TimeToString(datetime(from/1000)), TimeToString(datetime(to/1000)));
}
//--- définit le nom du fichier pour stocker la base de données
string filename=_Symbol+" "+TimeToString(datetime(from/1000))+" - "+TimeToString(datetime(to/1000))+".sqlite";
StringReplace(nom de fichier, ": ", "."); // le caractère ":" n'est pas autorisé dans les noms de fichier
//--- ouvre/crée la base de données dans le dossier commun du terminal
int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE | DATABASE_OPEN_COMMON);
if(db==INVALID_HANDLE)
{
Print("Base de données : échec de l'ouverture de ", filename, " avec le code ", GetLastError());
return;
}
else
Print("Base de données :", filename, " ouvert avec succès");
//--- crée la table 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, "échec de 'create table TICKS' avec le code ", GetLastError());
DatabaseClose(db);
return;
}
//--- affiche la liste de tous les champs de la table TICKS
if(DatabasePrint(db, "PRAGMA TABLE_INFO(TICKS)", 0)<0)
{
PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(TICKS)\") a échoué, code d'erreur=%d à la ligne %d", GetLastError(), __LINE__);
DatabaseClose(db);
return;
}
//--- crée une requête paramétrée pour ajouter des ticks à la table 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)"; // paramètres de la requête
int request=DatabasePrepare(db, sql);
if(request==INVALID_HANDLE)
{
PrintFormat("DatabasePrepare() a échoué avec le code=%d", GetLastError());
Print("Requête SQL : ", sql);
DatabaseClose(db);
return;
}
//--- définit la valeur du premier paramètre de la requête
DatabaseBind(request, 0, _Symbol);
//--- mémorise l'heure de début avant d'ajouter des ticks à la table TICKS
start=GetTickCount();
DatabaseTransactionBegin(db);
int total=ArraySize(ticks);
bool request_error=false;
for(int i=0; i<total; i++)
{
//--- définit les valeurs des paramètres restants avant d'ajouter l'entrée
ResetLastError();
if(!DatabaseBind(request, 1, ticks[i].time))
{
PrintFormat("DatabaseBind() a échoué avec le code=%d", GetLastError());
PrintFormat("Tick #%d ligne=%d", i+1, __LINE__);
request_error=true;
break;
}
//--- si l'appel précédent à DatabaseBind() a réussi, définit le paramètre suivant
if(!request_error && !DatabaseBind(request, 2, ticks[i].bid))
{
PrintFormat("DatabaseBind() a échoué avec le code=%d", GetLastError());
PrintFormat("Tick #%d ligne=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 3, ticks[i].ask))
{
PrintFormat("DatabaseBind() a échoué avec le code=%d", GetLastError());
PrintFormat("Tick #%d ligne=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 4, ticks[i].last))
{
PrintFormat("DatabaseBind() a échoué avec le code=%d", GetLastError());
PrintFormat("Tick #%d ligne=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 5, ticks[i].volume))
{
PrintFormat("DatabaseBind() a échoué avec le code=%d", GetLastError());
PrintFormat("Tick #%d ligne=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 6, ticks[i].time_msc))
{
PrintFormat("DatabaseBind() a échoué avec le code=%d", GetLastError());
PrintFormat("Tick #%d ligne=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 7, ticks[i].volume_real))
{
PrintFormat("DatabaseBind() a échoué avec le code=%d", GetLastError());
PrintFormat("Tick #%d ligne=%d", i+1, __LINE__);
request_error=true;
break;
}
//--- exécute une requête d'insertion de l'entrée et recherche l'erreur
if(!request_error && !DatabaseRead(request) && (GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
{
PrintFormat("DatabaseRead() a échoué avec le code=%d", GetLastError());
DatabaseFinalize(request);
request_error=true;
break;
}
//--- réinitialise la requête avant la prochaine mise à jour des paramètres
if(!request_error && !DatabaseReset(request))
{
PrintFormat("DatabaseReset() a échoué avec le code=%d", GetLastError());
DatabaseFinalize(request);
request_error=true;
break;
}
} //--- tous les ticks ont été parcourus
//--- statuts des transactions
if(request_error)
{
PrintFormat("Table TICKS : échec de l'ajout de %d ticks", ArraySize(ticks));
DatabaseTransactionRollback(db);
DatabaseClose(db);
return;
}
else
{
DatabaseTransactionCommit(db);
PrintFormat("Table TICKS : ajout de %d ticks en %d ms",
ArraySize(ticks), GetTickCount()-start);
}
//--- ferme le fichier de base de données et information
DatabaseClose(db);
PrintFormat("Base de données : %s créée et fermée", filename);
}
/*
Résultat :
EURUSD : CopyTicksRange a reçu 268061 ticks en 47 ms (de 2020.03.18 12:40 à 2020.03.19 12:40)
Base de données : EURUSD 2020.03.18 12.40 - 2020.03.19 12.40.sqlite ouvert avec succès
#| 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 : 268061 ticks ajoutés en 797 ms
Base de données : EURUSD 2020.03.18 12.40 - 2020.03.19 12.40.sqlite créée et fermée
OnCalculateCorrelation=0.87 2020.03.19 13:00: EURUSD vs GBPUSD PERIOD_M30
*/
|