//+------------------------------------------------------------------+ //| Script programı başlatma fonksiyonu | //+------------------------------------------------------------------+ void OnStart() { MqlTick ticks[]; //--- tikleri almadan önce başlangıç zamanını hatırla uint start=GetTickCount(); //--- günlük tik geçmişini talep et 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) failed, error=%d", _Symbol, TimeToString(datetime(from/1000)), TimeToString(datetime(to/1000)), _LastError); return; } else { //--- kaç tane tik alındı ve bunları almak için ne kadar zaman gerekti PrintFormat("%s: CopyTicksRange received %d ticks in %d ms (from %s to %s)", _Symbol, ArraySize(ticks), GetTickCount()-start, TimeToString(datetime(from/1000)), TimeToString(datetime(to/1000))); } //--- veritabanını depolamak için dosya adını ayarla string filename=_Symbol+" "+TimeToString(datetime(from/1000))+" - "+TimeToString(datetime(to/1000))+".sqlite"; StringReplace(filename, ":", "."); // dosya adlarında ":" karakteri kullanılamaz //--- ortak terminal klasöründe veritabanını aç/oluştur int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE | DATABASE_OPEN_COMMON); if(db==INVALID_HANDLE) { Print("Database: ", filename, " open failed with code ", GetLastError()); return; } else Print("Database: ", filename, " opened successfully"); //--- TICKS tablosu oluştur 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, " create table TICKS failed with code ", GetLastError()); DatabaseClose(db); return; } //--- TICKS tablosundaki tüm alanların listesini görüntüle if(DatabasePrint(db, "PRAGMA TABLE_INFO(TICKS)", 0)<0) { PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(TICKS)\") failed, error code=%d at line %d", GetLastError(), __LINE__); DatabaseClose(db); return; } //--- TICKS tablosuna tik eklemek için parametrelenmiş bir istek oluştur string sql="INSERT INTO TICKS (SYMBOL,TIME,BID,ASK,LAST,VOLUME,TIME_MSC,VOLUME_REAL)" " VALUES (?1,?2,?3,?4,?5,?6,?7,?8)"; // request parameters int request=DatabasePrepare(db, sql); if(request==INVALID_HANDLE) { PrintFormat("DatabasePrepare() failed with code=%d", GetLastError()); Print("SQL request: ", sql); DatabaseClose(db); return; } //--- ilk istek parametresinin değerini ayarla DatabaseBind(request, 0, _Symbol); //--- TICKS tablosuna tikleri eklemeden önce başlangıç zamanını hatırla start=GetTickCount(); DatabaseTransactionBegin(db); int total=ArraySize(ticks); bool request_error=false; for(int i=0; i<total; i++) { //--- girdi eklemeden önce kalan parametrelerin değerlerini ayarla ResetLastError(); if(!DatabaseBind(request, 1, ticks[i].time)) { PrintFormat("DatabaseBind() failed with code=%d", GetLastError()); PrintFormat("Tick #%d line=%d", i+1, __LINE__); request_error=true; break; } //--- önceki DatabaseBind() çağrısı başarılı olduysa, sonraki parametreyi ayarla if(!request_error && !DatabaseBind(request, 2, ticks[i].bid)) { PrintFormat("DatabaseBind() failed with code=%d", GetLastError()); PrintFormat("Tick #%d line=%d", i+1, __LINE__); request_error=true; break; } if(!request_error && !DatabaseBind(request, 3, ticks[i].ask)) { PrintFormat("DatabaseBind() failed with code=%d", GetLastError()); PrintFormat("Tick #%d line=%d", i+1, __LINE__); request_error=true; break; } if(!request_error && !DatabaseBind(request, 4, ticks[i].last)) { PrintFormat("DatabaseBind() failed with code=%d", GetLastError()); PrintFormat("Tick #%d line=%d", i+1, __LINE__); request_error=true; break; } if(!request_error && !DatabaseBind(request, 5, ticks[i].volume)) { PrintFormat("DatabaseBind() failed with code=%d", GetLastError()); PrintFormat("Tick #%d line=%d", i+1, __LINE__); request_error=true; break; } if(!request_error && !DatabaseBind(request, 6, ticks[i].time_msc)) { PrintFormat("DatabaseBind() failed with code=%d", GetLastError()); PrintFormat("Tick #%d line=%d", i+1, __LINE__); request_error=true; break; } if(!request_error && !DatabaseBind(request, 7, ticks[i].volume_real)) { PrintFormat("DatabaseBind() failed with code=%d", GetLastError()); PrintFormat("Tick #%d line=%d", i+1, __LINE__); request_error=true; break; } //--- girdiyi eklemek için bir istek yürüt ve bir hata olup olmadığını kontrol et if(!request_error && !DatabaseRead(request) && (GetLastError()!=ERR_DATABASE_NO_MORE_DATA)) { PrintFormat("DatabaseRead() failed with code=%d", GetLastError()); DatabaseFinalize(request); request_error=true; break; } //--- sonraki parametre güncellemesinden önce isteği sıfırla if(!request_error && !DatabaseReset(request)) { PrintFormat("DatabaseReset() failed with code=%d", GetLastError()); DatabaseFinalize(request); request_error=true; break; } } //--- tüm tikler gözden geçilerek tamamlandı //--- işlem durumu if(request_error) { PrintFormat("Table TICKS: failed to add %d ticks ", ArraySize(ticks)); DatabaseTransactionRollback(db); DatabaseClose(db); return; } else { DatabaseTransactionCommit(db); PrintFormat("Table TICKS: added %d ticks in %d ms", ArraySize(ticks), GetTickCount()-start); } //--- veritabanı dosyasını kapat ve bunu rapor et DatabaseClose(db); PrintFormat("Database: %s created and closed", filename); } /* Sonuç: 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 opened successfully #| 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 */ |