Membangun Basis Data Kuantitatif FMZ dengan SQLite

Penulis:Lydia, Dibuat: 2022-11-09 11:40:34, Diperbarui: 2023-09-20 10:55:14

img

Abstrak

Data adalah sumber perdagangan kuantitatif, bagaimana mengelola sejumlah besar data secara efisien adalah tautan yang sangat penting, basis data adalah salah satu solusi terbaik, saat ini aplikasi basis data adalah standar kuantitatif untuk semua jenis perdagangan harian, perdagangan frekuensi tinggi dan strategi lainnya.https://www.fmz.com), termasuk: bagaimana membuat tabel data, menyimpan data, memodifikasi data, menghapus data, data referensi dan bagaimana menerapkannya dalam praktek.

Cara memilih database

Mereka yang terbiasa dengan platform FMZ Quant harus tahu bahwa sebelum menyimpan data untuk penggunaan kembali lokal, Anda hanya dapat menggunakan fungsi _G(), yang menyimpan informasi yang dibutuhkan secara otomatis setiap kali Anda menghentikan strategi.

Ketika datang ke basis data yang dibuat sendiri, Anda harus memikirkan Oracle, MySQL, KDB, OneTick, NoSQL... Ini adalah aplikasi tingkat perusahaan yang sangat baik baik dalam fungsi dan kinerja. Namun, ada juga beberapa masalah: sulit untuk memulai, dan konfigurasi rumit dan pemeliharaan sulit. Untuk pedagang kuantitatif ritel, ini seperti menembak lalat dengan meriam. Bahkan jika mereka memulai, mereka hanya menggunakan sebagian kecil fungsi.

Basis data bawaan FMZ Quant

Selanjutnya, mari kita lihat database ringan yang dibangun oleh FMZ Quant. DBExec adalah antarmuka sistem manajemen data relasional built-in dari FMZ Quant. Ini dikembangkan berdasarkan SQLite dan ditulis dalam bahasa C. Ini tidak hanya kecil ukurannya, konsumsi sumber daya yang sedikit, tetapi juga cepat dalam pemrosesan. Ini sangat cocok untuk penggemar analisis kuantitatif keuangan untuk menerapkan manajemen data secara lokal, karena berbagai objek (seperti bursa, sumber data, dan harga) dapat dibagi menjadi tabel yang berbeda, dan hubungan antara tabel dapat didefinisikan. Selain itu, pengguna tidak perlu menginstal dan mengkonfigurasi mereka secara terpisah. Mereka dapat menggunakannya secara langsung dengan memanggil fungsi DBExec!

Selain itu, sangat mudah untuk belajar bahasa SQLite, dan sebagian besar pekerjaan yang dilakukan pada database diselesaikan oleh pernyataan SQLite.

Tata bahasa dasar

Grammar SQLite tidak sensitif huruf besar, meskipun ada beberapa perintah yang sensitif huruf besar, seperti GLOB dan glob, yang mewakili makna yang berbeda. Pernyataan SQLite dapat dimulai dengan kata kunci apa pun, seperti SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, dll, yang berarti: ekstrak data, masukkan data, perbarui data, hapus data, modifikasi database, dan hapus tabel data. Semua pernyataan diakhiri dengan semikolon bahasa Inggris. Berikut ini adalah operasi pembuatan database sederhana, menambahkan, menghapus, mengubah, dan memeriksa:

function main() {
    // Create: If the "users" table does not exist, create one, "id" is an integer and is incremented automatically, "name" is in text form and is not empty
    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('Zhang San')"));
    Log(DBExec("INSERT INTO users(name) values('Li Si')"));
    
    // Delete:
    Log(DBExec("DELETE FROM users WHERE id=1;"));
    
    // Modify:
    Log(DBExec("UPDATE users SET name='Wang Wu' WHERE id=2"));
    
    // Search:
    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 diidentifikasi dengan nama, perhatikan 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 dan output sebagai berikut:

img

Contoh strategi

Setelah mempelajari tata bahasa dasar SQLite, kita menyerang sementara besi panas untuk membuat contoh mengumpulkan dan menggunakan data Tick dengan menggunakan built-in database FMZ Quant.

Langkah 1: Perbarui docker

Pertama, pastikan Anda menggunakan versi terbaru dari docker. Jika Anda telah men-download dan menggunakan docker sebelumnya, Anda perlu menghapusnya terlebih dahulu, dan kemudian mendownload ulang dan menyebarkannya kembali padahttps://www.fmz.com/m/add-node page.

Langkah 2: Membuat strategi

function main() {
    // Subscribe contracts
    _C(exchange.SetContractType, 'swap');
    
    // Create 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);'
    ));
    
    // Get 10 pieces of tick data
    while (true) {
        let tick = exchange.GetTicker();
        // Add data to 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})`);
        // Search all data
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }
    
    // Search all data
    Log(DBExec('select * from tick'));
    
    // Search the first data
    Log(DBExec('select * from tick limit 1'));
    
    // Search first two pieces of 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'));
    
    // Search all data
    let allDate = DBExec('select * from tick')
    Log(allDate);
}

Langkah 3: Melakukan strategi

Ambil Windows sebagai contoh, setelah menjalankan strategi, folder yang diberi nama setelah nomor robot akan dibuat di direktori \logs\storage dari direktori docker. Buka folder, dan ada file dengan akhiran . db3, yang merupakan file dari database bawaan FMZ Quant. Seperti yang ditunjukkan dalam gambar berikut:

img

Kode di atas membuat tabel data bernama tick pertama, kemudian menambahkan bidang data tick ke tabel, kemudian mendapatkan data tick dari pertukaran di loop, dan memasukkan data ke dalam tabel data tick. Pada saat yang sama, kita menilai bahwa jumlah data dalam tabel data melebihi 10, maka kita melompat keluar dari loop. Akhirnya kita menggunakan 5 perintah SQLite untuk mencari, menghapus dan memodifikasi data dalam tabel data masing-masing. Dan mencetak mereka ke log, seperti yang ditunjukkan dalam gambar berikut:

img

Langkah 4: Buat bar status

Akhirnya kita menambahkan beberapa kode untuk membuat bar status untuk strategi dengan mendapatkan data di database FMZ Quant untuk menampilkan data lebih visual, menambahkan kode menunjukkan sebagai berikut:

    // Create 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 melalui data dalam database. kolom bidang dalam database mewakili bar di status bar, dan nilai bidang mewakili kolom di status bar. Seperti yang ditunjukkan pada gambar di bawah:

img

Kode 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;'));
    // Subscribe contracts
    _C(exchange.SetContractType, 'swap');

    // Create 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 pieces of tick data
    while (true) {
        let tick = exchange.GetTicker();
        // Add data to 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})`);
        // Search all data
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }

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

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

    // Search first two pieces of 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'));

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

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

Klik link ini.https://www.fmz.com/strategy/388963untuk menyalin kode strategi penuh.

Basis data memori

Jika Anda tidak ingin menyimpan data ke disk secara permanen, Anda dapat menambahkan simbol : sebelum perintah SQL untuk beroperasi di database memori, dan data akan diatur ulang setelah robot di-restart.

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

Ringkasan

Database tidak hanya dapat membawa data besar-besaran, tetapi juga membawa mimpi banyak penggemar perdagangan kuantitatif. Penggunaan database tidak terbatas pada contoh-contoh dalam artikel ini. Untuk metode penggunaan lebih lanjut, silakan lihat tutorial SQLite dan artikel lanjutan FMZ Quant.


Berkaitan

Lebih banyak