Sumber daya yang dimuat... Pemuatan...

Menggunakan SQLite untuk membangun inventor database kuantitatif

Penulis: , Dibuat: 2021-03-26 17:09:32, Diperbarui: 2024-12-05 21:56:39

[TOC]

img

Rincian

Data adalah sumber dari transaksi kuantitatif, bagaimana mengelola sejumlah besar data secara efisien adalah bagian yang sangat penting, database adalah salah satu solusi terbaik, dan aplikasi database saat ini telah menjadi konfigurasi standar kuantitatif untuk berbagai strategi seperti perdagangan intraday, perdagangan frekuensi tinggi, dan lain-lain.FMZ.COMDatabase terintegrasi yang mencakup: cara membuat tabel data, menyimpan data, mengubah data, menghapus data, mengutip data, dan bagaimana menerapkannya dalam pertempuran nyata.

Cara Memilih Database

Penemu yang terbiasa dengan platform kuantifikasi harus tahu bahwa sebelum ini untuk menyimpan data ke duplikat lokal, hanya dapat menggunakan fungsi _G(), setiap kali kebijakan dihentikan, fungsi _G() akan secara otomatis menyimpan informasi yang dibutuhkan. Tetapi jika Anda ingin menyimpan data format yang lebih kompleks, fungsi _G() jelas tidak terlalu cocok, jadi banyak orang berpikir untuk membangun database sendiri untuk memecahkan masalah ini.

Ketika berbicara tentang membangun database sendiri, Anda mungkin berpikir tentang Oracle, MySQL, KDB, OneTick, NoSQL... ini adalah aplikasi tingkat perusahaan yang sangat baik, baik fitur maupun kinerja yang sangat kuat. Tetapi juga menghadapi beberapa masalah: sulit dioperasikan, konfigurasi yang rumit dan masalah pemeliharaan, yang sedikit terasa seperti senjata untuk pengecer transaksi kuantitatif, bahkan jika pengguna hanya menggunakan sebagian kecil dari fungsionalitas.

Inventor Kuantitas Database Bawah Tanah

DBExec adalah sebuah antarmuka sistem manajemen data relasional dengan built-in kuantifikasi, berbasis SQLite, sendiri ditulis dalam bahasa C, tidak hanya berukuran kecil, menggunakan sumber daya yang rendah, tetapi juga cepat, sangat cocok untuk para penggemar analisis kuantitatif keuangan untuk melakukan manajemen data secara lokal, karena dapat membagi berbagai jenis objek kuantifikasi (misalnya, bursa, sumber data, harga) ke dalam tabel yang berbeda, dan mendefinisikan hubungan antara tabel; selain itu pengguna tidak perlu menginstal dan mengkonfigurasi secara terpisah, hanya dengan memanggil fungsi DBExec (misalnya) dapat digunakan langsung!

Selain itu, biaya belajar SQLite sangat rendah, dan sebagian besar pekerjaan yang dilakukan pada database dilakukan oleh pernyataan SQLite.

Tata bahasa dasar

SQLite tidak memiliki tata bahasa yang berbeda, tetapi ada beberapa perintah yang sensitif terhadap ukuran besar, seperti GLOB dan glob yang mewakili makna yang berbeda. SQLite statements dapat dimulai dengan kata kunci apa pun, seperti SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, dll. Mereka menunjukkan: Mengambil data, memasukkan data, memperbarui data, menghapus data, memodifikasi database, menghapus tabel data.

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"));
}

Sebuah database biasanya berisi satu atau lebih tabel, masing-masing tabel memiliki tanda nama, perlu dicatat bahwa sistem menyimpan tabel masing-masing: kvdb, cfg, log, profit, chart.img

Contoh Strategi

Dengan memahami tata bahasa dasar SQLite, kami menggunakan besi panas untuk membuat sebuah contoh untuk mengumpulkan dan menggunakan data Tick.

Langkah 1: Perbarui AdministratorPertama-tama pastikan Anda menggunakan host versi terbaru, jika Anda telah mengunduh host sebelumnya, Anda harus menghapusnya terlebih dahulu, dan Anda dapat mengunduhnya secara gratis.https://www.fmz.com/m/add-nodeHalaman ini diunduh dan di-deploy kembali.

Langkah 2: Membuat 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: Mengoperasikan StrategiDalam contoh Windows, setelah menjalankan kebijakan ini, folder yang diberi nama dengan nomor robot akan dibuat di direktori host yang disebut dengan folder.db3 yang berisi file dengan suffix.db3 yang merupakan file inventor untuk mengukur database internal. Gambar berikut ini menunjukkan:imgKode di atas pertama-tama membuat sebuah tabel data yang diberi nama tick tick, kemudian menambahkan bidang data tick ke tabel tersebut, kemudian mengambil data tick dari bursa dalam loop, dan memasukkan data tersebut ke dalam tabel data tick tick, dan memutuskan bahwa jumlah data dalam tabel data lebih dari 10 untuk melompat dari loop. Akhirnya, dengan 5 perintah SQLite masing-masing, cari, hapus, atau ubah data dalam tabel data. Dan cetak ke dalam log, seperti yang ditunjukkan di bawah:img Langkah 4: Buat status barAkhirnya, kami menambahkan beberapa kode untuk membuat sebuah status bar untuk kebijakan kami dengan mengambil data dari inventor untuk mengukur data dari database, dan menampilkan data secara lebih intuitif, kode baru adalah sebagai berikut:

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

Kode di atas menggunakan data dalam database untuk membuat tabel filter data Tick. Di mana kolom filter di dalam database mewakili kolom filter di dalam kolom status, dan kolom filter di dalam kolom status.img

Kode lengkap strategi

/*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 link inihttps://www.fmz.com/strategy/388963Anda dapat menyalin kode strategi penuh.

Database dalam memori

Jika data yang dioperasikan tidak ingin disimpan secara permanen ke disk, dapat ditambahkan sebelum pernyataan SQL:Simbol dapat dioperasikan di dalam database memori, dan data ditempatkan kembali setelah bot dihidupkan kembali

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

Pengamatan

Database tidak hanya dapat memuat data yang sangat besar, tetapi juga dapat memuat impian para pecinta perdagangan kuantitatif. Penggunaan database tidak terbatas pada contoh-contoh dalam artikel ini, lebih banyak cara penggunaan dapat dilihat dalam tutorial SQLite, dan seri artikel yang dirilis oleh penemu kuantitatif berikutnya.


Berkaitan

Lebih banyak

dianwan99Sangat bagus. Satu-satunya kelemahan adalah data tidak dapat direkam secara lokal, di tengah-tengah disk.

williamfuReferenceError: DBExec is not defined. ReferenceError: DBExec is not defined. ReferenceError: DBExec is not defined

Syukurlah.Sangat bagus.

Anda dapat mencoba database lokal.

Terima kasih.