Gunakan SQLite untuk Membangun Basis Data Kuantum FMZ

Penulis:Ninabadass, Dibuat: 2022-04-24 11:32:35, Diperbarui: 2022-04-24 16:21:38

Gunakan SQLite untuk Membangun Basis Data Kuantum FMZ [TOC]

Abstrak

Data adalah sumber perdagangan kuantitatif. sangat penting untuk mengelola sejumlah besar data secara efisien. basis data adalah salah satu solusi terbaik. saat ini, aplikasi basis data telah menjadi konfigurasi kuantitatif standar dari berbagai perdagangan harian, perdagangan frekuensi tinggi dan strategi lainnya.FMZ.COM), termasuk: cara membuat tabel data, menyimpan data, memodifikasi data, menghapus data, dan data referensi, serta cara menggunakannya dalam praktek.

Cara Memilih Database

Mereka yang akrab dengan FMZ Quant Trading Platform harus tahu bahwa sebelum ini, jika Anda ingin menyimpan data ke lokal untuk digunakan kembali, Anda hanya dapat menggunakan fungsi _G(). Setiap kali Anda menghentikan strategi, fungsi _G() akan secara otomatis menyimpan informasi yang diperlukan. Tetapi jika Anda ingin menyimpan data berformat yang semakin kompleks, fungsi _G() jelas tidak cocok, sehingga banyak orang berpikir untuk membangun basis data mereka sendiri untuk memecahkan masalah ini.

Ketika datang ke basis data yang dibuat sendiri, semua orang dapat memikirkan Oracle, MySQL, KDB, OneTick, NoSQL... Ini semua adalah aplikasi tingkat perusahaan yang sangat baik, baik dalam hal fungsi dan kinerja. Tapi ada juga beberapa masalah: sulit untuk memulai, dan konfigurasi dan pemeliharaan sulit. Bagi investor ritel dalam perdagangan kuantitatif, ini sedikit seperti memecahkan lalat di roda. Bahkan jika Anda sudah memulai dengan aplikasi tersebut, hanya beberapa fungsi dari mereka yang akan digunakan.

FMZ Quant Database Bawah Tanah

Selanjutnya, mari kita kenal dengan database ringan FMZ Quant. DBExec adalah antarmuka sistem manajemen data relasional yang dibangun ke dalam FMZ Quant. Ini dikembangkan berdasarkan SQLite dan ditulis dalam bahasa C. Ini tidak hanya berukuran kecil, tidak menggunakan sumber daya, tetapi juga memiliki kecepatan pemrosesan yang sangat cepat. Ini sangat cocok untuk penggemar analisis kuantitatif keuangan untuk menerapkan manajemen data secara lokal, karena dapat membagi berbagai objek (seperti platform, sumber data, harga) ke dalam tabel yang berbeda, dan mendefinisikan hubungan antara tabel. Selain itu, pengguna tidak perlu menginstalnya dan mengonfigurasinya secara terpisah; selama mereka memanggil fungsi DBExec, dapat digunakan secara langsung!

Selain itu, biaya belajar bahasa SQLite sangat rendah, dan sebagian besar pekerjaan yang dilakukan pada database dilakukan oleh pernyataan SQLite. Sebagian besar kebutuhan dapat dipenuhi dengan membiasakan diri dengan sintaksis dasar. Berikut ini adalah sintaksis dasar SQLite.

Sintaks Dasar

Sintaks SQLite tidak sensitif huruf besar, tetapi beberapa perintah sensitif huruf besar, seperti GLOB dan glob, yang memiliki arti yang berbeda. Pernyataan SQLite dapat dimulai dengan kata kunci apa pun, seperti SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, dll, yang masing-masing berarti: mengekstrak data, memasukkan data, memperbarui data, menghapus data, memodifikasi database, dan menghapus tabel data. Semua perintah diakhiri dengan titik koma. Berikut adalah operasi seperti pembuatan, penambahan, penghapusan, modifikasi, dan kueri database sederhana:

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 database biasanya berisi satu atau lebih tabel, setiap tabel memiliki identifikasi nama, perlu dicatat bahwa tabel yang disediakan sistem adalah: kvdb, cfg, log, profit, chart. yaitu, ketika membuat tabel, Anda harus menghindari nama yang disediakan sistem. mari kita jalankan kode di atas, yang mengekspor hal berikut:img

Contoh Strategi

Setelah mengetahui sintaksis dasar SQLite, mari kita menyerang sementara besi panas; gunakan database kuantitatif built-in FMZ Quant untuk membuat contoh pengumpulan dan penggunaan data Tick.

Langkah 1: memperbarui dockerPertama, pastikan Anda menggunakan versi terbaru dari docker. Jika Anda telah mengunduh dan menggunakan docker sebelumnya, Anda perlu menghapusnya terlebih dahulu, dan mengunduhnya dan menyebarkannya lagi di halaman (https://www.fmz.com/m/add-node).

Langkah 2: Membuat 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. Setelah menjalankan strategi, folder yang diberi nama dengan ID bot akan dihasilkan di kamus \logs\storage dari direktori docker; buka folder, dan akan ada file dengan .db3 sebagai akhiran; file ini adalah file database bawaan FMZ Quant. Seperti yang ditunjukkan dalam gambar berikut:img

Kode di atas pertama kali membuat tabel data bernama tick, kemudian menambahkan bidang data tick ke tabel, kemudian mendapatkan data tick dari platform di loop, dan memasukkan data ini ke dalam tabel data tick, dan pada saat yang sama Jika dinilai bahwa jumlah data dalam tabel data melebihi 10, itu akan melompat keluar dari loop. Akhirnya, gunakan lima perintah SQLite untuk menanyakan, menghapus, dan memodifikasi data dalam tabel data. Dan cetak di log, seperti yang ditunjukkan dalam gambar berikut:img

Langkah 4: Buat bar statusAkhirnya, kami menambahkan beberapa potongan kode untuk membuat bilah status untuk strategi dengan mendapatkan data di database FMZ Quant untuk menampilkan data lebih intuitif.

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

Kode di atas membuat tabel Binance Tick Data dari data di database. Bidang kolom di database mewakili baris horisontal di bilah status, dan bidang nilai mewakili baris vertikal di bilah status. Seperti yang ditunjukkan di bawah:img

Kode 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 link:https://www.fmz.com/strategy/265906, dan Anda dapat menyalin kode sumber lengkap.

Database di dalam memori

Jika data yang dioperasikan tidak ingin disimpan secara permanen ke disk, Anda dapat menambahkan:simbol sebelum pernyataan SQL untuk beroperasi di database in-memory, dan data akan diatur ulang setelah bot di-restart.

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

Kesimpulan

Database ini tidak hanya dapat membawa data besar-besaran, tetapi juga membawa impian banyak penggemar perdagangan kuantitatif. Penggunaan database tidak terbatas pada contoh yang disebutkan dalam artikel. Untuk metode penggunaan lebih lanjut, Anda dapat merujuk ke tutorial SQLite dan serangkaian artikel yang akan diposting di FMZ Quant nanti.


Lebih banyak