Gunakan SQLite untuk membina pangkalan data kuant FMZ

Penulis:Ninabadass, Dicipta: 2022-04-24 11:32:35, Dikemas kini: 2022-04-24 16:21:38

Gunakan SQLite untuk membina pangkalan data kuant FMZ [TOC]

Abstrak

Data adalah sumber perdagangan kuantitatif. Ia sangat penting untuk menguruskan sejumlah besar data dengan cekap. Pangkalan data adalah salah satu penyelesaian terbaik. Pada masa kini, aplikasi pangkalan data telah menjadi konfigurasi kuantitatif standard pelbagai perdagangan hari, perdagangan frekuensi tinggi dan strategi lain. Dalam artikel ini, kita akan mengkaji pangkalan data terbina dalam FMZ Quant (FMZ.COM), termasuk: cara membuat jadual data, menyimpan data, mengubah data, memadam data, dan data rujukan, serta cara menggunakannya dalam amalan.

Cara Memilih Pangkalan Data

Mereka yang biasa dengan Platform Perdagangan Kuantum FMZ harus tahu bahawa sebelum ini, jika anda ingin menyimpan data ke tempatan untuk digunakan semula, anda hanya boleh menggunakan fungsi _G(). Setiap kali anda menghentikan strategi, fungsi _G() akan menyimpan maklumat yang diperlukan secara automatik. Tetapi jika anda ingin menyimpan data berformat yang lebih kompleks, fungsi _G() jelas tidak sesuai, jadi ramai orang berfikir untuk membina pangkalan data mereka sendiri untuk menyelesaikan masalah ini.

Apabila ia datang kepada pangkalan data yang dibina sendiri, semua orang boleh memikirkan Oracle, MySQL, KDB, OneTick, NoSQL... Ini semua adalah aplikasi peringkat perusahaan yang sangat baik, baik dari segi fungsi dan prestasi. Tetapi terdapat juga beberapa masalah: sukar untuk memulakan, dan konfigurasi dan penyelenggaraan sukar. Bagi pelabur runcit dalam perdagangan kuantitatif, ia agak seperti memecahkan lalat pada roda. Walaupun anda sudah memulakan dengan aplikasi tersebut, hanya beberapa fungsi daripadanya yang akan digunakan.

Pangkalan Data Terbina Dalam FMZ Quant

DBExec adalah antara muka sistem pengurusan data relasional yang dibina ke dalam FMZ Quant. Ia dibangunkan berdasarkan SQLite dan ditulis dalam C. Ia bukan sahaja bersaiz kecil, tidak menggunakan banyak sumber, tetapi juga mempunyai kelajuan pemprosesan yang sangat cepat. Ia sangat sesuai untuk peminat analisis kuantitatif kewangan untuk melaksanakan pengurusan data secara tempatan, kerana ia boleh membahagikan pelbagai objek (seperti platform, sumber data, harga) ke dalam pelbagai jadual, dan menentukan hubungan antara jadual. Di samping itu, pengguna tidak perlu memasang dan mengkonfigurasinya secara berasingan; selagi mereka memanggil fungsi DBExec, ia boleh digunakan secara langsung!

Selain itu, kos belajar bahasa SQLite sangat rendah, dan kebanyakan kerja yang dilakukan pada pangkalan data dilakukan oleh pernyataan SQLite. Kebanyakan keperluan boleh dipenuhi dengan membiasakan diri dengan sintaks asas. Berikut adalah sintaks asas SQLite.

Sintaks Asas

Sintaks SQLite tidak sensitif kepada huruf besar, tetapi beberapa perintah sensitif kepada huruf besar, seperti GLOB dan glob, yang mempunyai makna yang berbeza. Perintah SQLite boleh bermula dengan kata kunci apa pun, seperti SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, dll, yang masing-masing bermaksud: mengekstrak data, memasukkan data, mengemas kini data, memadamkan data, mengubah suai pangkalan data, dan memadamkan jadual data. Semua perintah diakhiri dengan titik koma. Berikut adalah operasi seperti penciptaan, penambahan, penghapusan, pengubahsuaian, dan pertanyaan pangkalan data yang mudah:

function main() {
    // create: if the table of "users" do not exist, create one; "id" is integer and increases automatically; "name" is in form of text and not null 
    Log(DBExec('CREATE TABLE IF NOT EXISTS "users" (id INTEGER PRIMARY KEY AUTOINCREMENT, name text not NULL);'));
    
    // add: 
    Log(DBExec("INSERT INTO users(name) values('A')"));
    Log(DBExec("INSERT INTO users(name) values('B')"));
    
    // delete: 
    Log(DBExec("DELETE FROM users WHERE id=1;"));
    
    // modify:
    Log(DBExec("UPDATE users SET name='C' WHERE id=2"));
    
    // query:
    Log(DBExec('select 2, ?, ?, ?, ?', 'ok', true,9.8,null));
    Log(DBExec('select * from kvdb'));
    Log(DBExec('select * from cfg'));
    Log(DBExec('select * from log'));
    Log(DBExec('select * from profit'));
    Log(DBExec('select * from chart'));
    Log(DBExec("selEct * from users"));
}

Sebuah pangkalan data biasanya mengandungi satu atau lebih jadual, setiap jadual mempunyai pengenalan nama, perlu diperhatikan bahawa jadual yang dikhaskan sistem adalah: kvdb, cfg, log, keuntungan, carta. iaitu, apabila membuat jadual, anda harus mengelakkan nama yang dikhaskan sistem. Mari kita jalankan kod di atas, yang mengeksport perkara berikut:img

Contoh Strategi

Setelah mengetahui sintaks asas SQLite, mari kita menyerang sementara besi panas; gunakan pangkalan data kuantitatif terbina dalam FMZ Quant untuk membuat contoh pengumpulan dan penggunaan data Tick.

Langkah 1: mengemas kini dockerPertama, pastikan anda menggunakan versi terbaru docker. Jika anda telah memuat turun dan menggunakan docker sebelum ini, anda perlu memadamkannya terlebih dahulu, dan memuat turun dan menyebarkannya semula di halaman (https://www.fmz.com/m/add-node).

Langkah 2: Buat strategi

function main() {
    // set contract 
    _C(exchange.SetContractType, 'swap');
    
    // create the data table 
    DBExec('CREATE TABLE IF NOT EXISTS "tick" (id INTEGER PRIMARY KEY AUTOINCREMENT,'.concat(
        'High FLOAT not NULL,', 
        'Low FLOAT not NULL,', 
        'Sell FLOAT not NULL,', 
        'Buy FLOAT not NULL,', 
        'Last FLOAT not NULL,', 
        'Volume INTEGER not NULL,', 
        'Time INTEGER not NULL);'
    ));
    
    // obtain 10 tick data 
    while (true) {
        let tick = exchange.GetTicker();
        // add data in the tick table 
        DBExec(`INSERT INTO tick(High, Low, Sell, Buy, Last, Volume, Time) values(${tick.High}, ${tick.Low}, ${tick.Sell}, ${tick.Buy}, ${tick.Last}, ${tick.Volume}, ${tick.Time})`);
        // query all data
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }
    
    // query all data 
    Log(DBExec('select * from tick'));
    
    // query the first data 
    Log(DBExec('select * from tick limit 1'));
    
    // query the first two data 
    Log(DBExec('select * from tick limit 0,2'));
    
    // delete the first data 
    Log(DBExec('DELETE FROM tick WHERE id=1;'));
    
    // modify the second data 
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));
    
    // query all data 
    let allDate = DBExec('select * from tick')
    Log(allDate);
}

Langkah 3: Mengoperasikan strategiAmbil Windows sebagai contoh. Selepas menjalankan strategi, folder yang dinamakan dengan bot ID akan dijana dalam kamus \logs\storage direktori docker; buka folder, dan akan ada fail dengan .db3 sebagai akhiran; fail ini adalah fail pangkalan data terbina dalam FMZ Quant. Seperti yang ditunjukkan dalam gambar berikut:img

Kod di atas mula-mula mencipta jadual data bernama tick, kemudian menambah medan data tik ke jadual, kemudian mendapatkan data tik dari platform dalam gelung, dan memasukkan data ini ke dalam jadual data tick, dan pada masa yang sama Jika dinilai bahawa jumlah data dalam jadual data melebihi 10, ia akan melompat keluar dari gelung. Akhirnya, gunakan lima perintah SQLite untuk menanya, memadam, dan mengubah suai data dalam jadual data. Dan cetakannya di log, seperti yang ditunjukkan dalam imej berikut:img

Langkah 4: Buat bar statusAkhirnya, kita menambah beberapa kepingan kod untuk membuat bar status untuk strategi dengan mendapatkan data dalam pangkalan data FMZ Quant untuk memaparkan data dengan lebih intuitif.

    // create a status bar 
    let table = {
        type: 'table',
        title: 'Binance Tick data',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');

Kod di atas mencipta jadual Binance Tick Data dari data dalam pangkalan data. medan kolom dalam pangkalan data mewakili baris horizontal dalam bar status, dan medan nilai mewakili baris vertikal dalam bar status. Seperti yang ditunjukkan di bawah:img

Kod Sumber Strategi Lengkap

/*backtest
start: 2020-07-19 00:00:00
end: 2020-08-17 23:59:00
period: 15m
basePeriod: 15m
exchanges: [{"eid":"Binance","currency":"LTC_USDT"}]
*/

function main() {
    Log(DBExec('DROP TABLE tick;'));
    // set contract 
    _C(exchange.SetContractType, 'swap');

    // establish the data table 
    DBExec('CREATE TABLE IF NOT EXISTS "tick" (id INTEGER PRIMARY KEY AUTOINCREMENT,'.concat(
        'High FLOAT not NULL,',
        'Low FLOAT not NULL,',
        'Sell FLOAT not NULL,',
        'Buy FLOAT not NULL,',
        'Last FLOAT not NULL,',
        'Volume INTEGER not NULL,',
        'Time INTEGER not NULL);'
    ));

    // obtain 10 tick data 
    while (true) {
        let tick = exchange.GetTicker();
        // add data in the tick table
        DBExec(`INSERT INTO tick(High, Low, Sell, Buy, Last, Volume, Time) values(${tick.High}, ${tick.Low}, ${tick.Sell}, ${tick.Buy}, ${tick.Last}, ${tick.Volume}, ${tick.Time})`);
        // query all data 
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }

    // query all data 
    Log(DBExec('select * from tick'));

    // query the first data 
    Log(DBExec('select * from tick limit 1'));

    // query the first two data 
    Log(DBExec('select * from tick limit 0,2'));

    // delet the first data 
    Log(DBExec('DELETE FROM tick WHERE id=1;'));

    // modify the second data
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));

    // query all data 
    let allDate = DBExec('select * from tick')
    Log(allDate);

    // create the status bar 
    let table = {
        type: 'table',
        title: 'Binance Tick data',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

Klik pautan:https://www.fmz.com/strategy/265906, dan anda boleh menyalin kod sumber lengkap.

Pangkalan Data dalam Memori

Jika data yang dikendalikan tidak mahu disimpan secara kekal ke cakera, anda boleh menambah:simbol sebelum arahan SQL untuk beroperasi dalam pangkalan data dalam memori, dan data akan diset semula selepas bot dimulakan semula.

DBExec(":select 1,2,3");

Kesimpulan

Pangkalan data tidak hanya boleh membawa data besar, tetapi juga membawa impian banyak peminat perdagangan kuantitatif. Penggunaan pangkalan data tidak terhad kepada contoh yang disebutkan dalam artikel. Untuk kaedah penggunaan yang lebih lanjut, anda boleh merujuk kepada tutorial SQLite dan siri artikel yang akan dipaparkan di FMZ Quant kemudian.


Lebih lanjut