avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada Pesan pribadi
4
fokus pada
1271
Pengikut

Menggunakan SQLite untuk membangun database kuantitatif penemu

Dibuat di: 2021-03-26 17:09:32, diperbarui pada: 2024-12-05 21:56:39
comments   5
hits   2295

[TOC]

Menggunakan SQLite untuk membangun database kuantitatif penemu

ringkasan

Data merupakan sumber dari perdagangan kuantitatif. Cara mengelola data dalam jumlah besar secara efisien merupakan mata rantai yang penting. Basis data merupakan salah satu solusi terbaik. Saat ini, penerapan basis data telah menjadi konfigurasi standar kuantitatif untuk berbagai perdagangan intraday, perdagangan frekuensi tinggi dan strategi lainnya. Dalam artikel ini, kita akan mempelajari basis data bawaan Inventor Quantitative (FMZ.COM), termasuk: cara membuat tabel data, menyimpan data, mengubah data, menghapus data, mereferensikan data, dan cara menerapkannya dalam pertempuran sesungguhnya.

Cara memilih database

Bagi yang sudah familiar dengan Inventor Quantitative Platform, pasti sudah tahu bahwa sebelum ini, jika Anda ingin menyimpan data secara lokal untuk digunakan kembali, Anda hanya dapat menggunakan fungsi _G(). Setiap kali Anda menghentikan strategi,_Fungsi G() akan secara otomatis menyimpan informasi yang diperlukan. Namun jika Anda ingin menyimpan data berformat lebih kompleks,_Fungsi G() jelas kurang bisa diterapkan, sehingga banyak orang yang berpikir untuk membangun basis data sendiri untuk mengatasi masalah ini.

Ketika berbicara tentang basis data yang dibangun sendiri, semua orang mungkin berpikir tentang Oracle, MySQL, KDB, OneTick, NoSQL… Ini semua adalah aplikasi tingkat perusahaan yang sangat baik, dengan fungsi dan kinerja yang sangat canggih. Namun, ada beberapa masalah yang dihadapi: sulit untuk memulai, konfigurasinya rumit, dan perawatannya merepotkan. Bagi pedagang kuantitatif eceran, ini seperti menggunakan meriam untuk membunuh lalat. Bahkan jika mereka memulai, mereka akan hanya menggunakan sebagian kecil fungsi.

Basis Data Kuantitatif Inventor Terintegrasi

Selanjutnya, mari kita lihat database ringan yang dibangun di InventorQuant. DBExec adalah antarmuka sistem manajemen data relasional yang dibangun di InventorQuant. Ini dikembangkan berdasarkan SQLite dan ditulis dalam C. Tidak hanya ukurannya kecil dan konsumsi sumber dayanya rendah , tetapi juga Kecepatan pemrosesannya cepat dan sangat cocok untuk penggemar analisis kuantitatif keuangan untuk menerapkan manajemen data secara lokal, karena “objek” yang berbeda (seperti bursa, sumber data, harga) dapat dibagi menjadi tabel yang berbeda dan hubungan dapat didefinisikan diantara meja. Selain itu, pengguna tidak perlu menginstal dan mengkonfigurasi secara terpisah, mereka dapat menggunakannya langsung dengan memanggil fungsi DBExec()!

Selain itu, biaya pembelajaran bahasa SQLite sangat rendah, dan sebagian besar pekerjaan yang dilakukan pada database dilakukan oleh pernyataan SQLite. Mengenal sintaks dasar dapat memenuhi sebagian besar kebutuhan. Berikut ini adalah sintaks dasar SQLite.

Sintaksis dasar

Sintaks SQLite tidak peka huruf besar/kecil, tetapi beberapa perintah peka huruf besar/kecil, seperti GLOB dan glob, yang memiliki arti berbeda. Pernyataan SQLite dapat dimulai dengan kata kunci apa saja, seperti SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, dsb., yang masing-masing berarti: mengekstrak data, menyisipkan data, memperbarui data, menghapus data, memodifikasi basis data, dan menghapus tabel data. Semua pernyataan diakhiri dengan titik koma. Berikut ini adalah pembuatan database sederhana, penambahan, penghapusan, modifikasi, query dan operasi lainnya:

function main() {
    // 创建:如果“users”表不存在就创建一个,“id”是整数且自动增加,“name”是文本形式且不为空
    Log(DBExec('CREATE TABLE IF NOT EXISTS "users" (id INTEGER PRIMARY KEY AUTOINCREMENT, name text not NULL);'));
    
    // 增加:
    Log(DBExec("INSERT INTO users(name) values('张三')"));
    Log(DBExec("INSERT INTO users(name) values('李四')"));
    
    // 删除:
    Log(DBExec("DELETE FROM users WHERE id=1;"));
    
    // 修改
    Log(DBExec("UPDATE users SET name='王五' WHERE id=2"));
    
    // 查询
    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"));
}

Basis data biasanya berisi satu atau beberapa tabel. Setiap tabel memiliki nama. Perlu dicatat bahwa tabel yang dicadangkan sistem adalah: kvdb, cfg, log, profit, chart. Dengan kata lain, ketika membuat tabel, Anda harus menghindari nama yang dicadangkan sistem. Mari kita jalankan kode di atas, yang akan mencetak yang berikut ini: Menggunakan SQLite untuk membangun database kuantitatif penemu

Contoh Strategi

Sekarang setelah kita mengetahui sintaksis dasar SQLite, kita dapat menggunakan basis data bawaan InventorQuant untuk membuat contoh pengumpulan dan penggunaan data Tick.

Langkah 1: Perbarui host Anda Pertama, pastikan Anda menggunakan versi host terbaru. Jika Anda telah mengunduh dan menggunakan host sebelumnya, Anda perlu menghapusnya terlebih dahulu, lalu mengunduhnya kembali dan menyebarkannya di https://www.fmz.com/ halaman m/tambah-simpul.

Langkah 2: Buat strategi

function main() {
    // 订阅合约
    _C(exchange.SetContractType, 'swap');
    
    // 创建数据表
    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);'
    ));
    
    // 获取10个tick数据
    while (true) {
        let tick = exchange.GetTicker();
        // 在tick表中增加数据
        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})`);
        // 查询所有数据
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }
    
    // 查询所有数据
    Log(DBExec('select * from tick'));
    
    // 查询第一个数据
    Log(DBExec('select * from tick limit 1'));
    
    // 查询前两个数据
    Log(DBExec('select * from tick limit 0,2'));
    
    // 删除第一个数据
    Log(DBExec('DELETE FROM tick WHERE id=1;'));
    
    // 修改第二个数据
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));
    
    // 查询所有数据
    let allDate = DBExec('select * from tick')
    Log(allDate);
}

Langkah 3: Jalankan strateginya Mengambil Windows sebagai contoh, setelah menjalankan kebijakan, folder yang diberi nama sesuai nomor robot akan dibuat di direktori “\logs\storage” dari direktori host. Buka folder tersebut dan akan ada file dengan sufiks “.db3 “di dalamnya, file ini adalah file basis data bawaan terkuantifikasi milik penemu. Seperti yang ditunjukkan pada gambar berikut: Menggunakan SQLite untuk membangun database kuantitatif penemu Kode di atas pertama-tama membuat tabel data bernama “tick”, kemudian menambahkan bidang data tick ke tabel, kemudian memperoleh data tick dari bursa dalam satu putaran dan memasukkan data ini ke dalam tabel data “tick”. Jika jumlah data pada tabel data melebihi 10, loop akan dilompati keluar. Terakhir, lima perintah SQLite digunakan untuk menanyakan, menghapus, dan memodifikasi data dalam tabel data. Dan cetak dalam log, seperti yang ditunjukkan pada gambar berikut: Menggunakan SQLite untuk membangun database kuantitatif penemu Langkah 4: Buat bilah status Terakhir, kami menambahkan beberapa kode untuk membuat bilah status bagi strategi tersebut dengan memperoleh data dari Inventor Quantitative Database untuk menampilkan data secara lebih intuitif. Kode yang baru ditambahkan adalah sebagai berikut:

    // 创建状态栏
    let table = {
        type: 'table',
        title: '币安Tick数据',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');

Kode di atas membuat tabel “Data Binance Tick” menggunakan data dalam database. Kolom “kolom” dalam basis data melambangkan “baris” dalam bilah status, dan kolom “nilai” melambangkan “kolom” dalam bilah status. Seperti yang ditunjukkan pada gambar berikut: Menggunakan SQLite untuk membangun database kuantitatif penemu

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;'));
    // 订阅合约
    _C(exchange.SetContractType, 'swap');

    // 创建数据表
    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);'
    ));

    // 获取10个tick数据
    while (true) {
        let tick = exchange.GetTicker();
        // 在tick表中增加数据
        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})`);
        // 查询所有数据
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }

    // 查询所有数据
    Log(DBExec('select * from tick'));

    // 查询第一个数据
    Log(DBExec('select * from tick limit 1'));

    // 查询前两个数据
    Log(DBExec('select * from tick limit 0,2'));

    // 删除第一个数据
    Log(DBExec('DELETE FROM tick WHERE id=1;'));

    // 修改第二个数据
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));

    // 查询所有数据
    let allDate = DBExec('select * from tick')
    Log(allDate);

    // 创建状态栏
    let table = {
        type: 'table',
        title: '币安Tick数据',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

Klik tautan ini https://www.fmz.com/strategy/388963 untuk menyalin kode strategi lengkap.

Basis data dalam memori

Jika Anda tidak ingin menyimpan data secara permanen ke disk, Anda dapat menambahkan:Simbol dapat dioperasikan dalam database memori, dan datanya diatur ulang setelah robot dihidupkan ulang

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

Meringkaskan

Basis data tersebut tidak hanya dapat menampung data dalam jumlah besar, tetapi juga mewujudkan impian kuantitatif dari banyak penggemar perdagangan kuantitatif. Penggunaan basis data tidak terbatas pada contoh-contoh dalam artikel ini. Untuk metode penggunaan yang lebih lengkap, silakan lihat tutorial SQLite dan rangkaian artikel berikutnya yang dirilis oleh Inventor Quantitative.