//+------------------------------------------------------------------+ //| 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 */ |