Sumber dimuat naik... memuat...

Menggunakan SQLite untuk membina pangkalan data inventor kuantitatif

Penulis: , Dicipta: 2021-03-26 17:09:32, Dikemas kini: 2024-12-05 21:56:39

[TOC]

img

Ringkasan

Data adalah sumber transaksi kuantitatif, bagaimana untuk menguruskan data yang banyak dengan cekap adalah satu hubungan yang sangat penting, pangkalan data adalah salah satu penyelesaian terbaik, aplikasi pangkalan data hari ini telah menjadi persediaan standard kuantitatif untuk pelbagai strategi dagangan dalam hari, perdagangan frekuensi tinggi dan lain-lain.FMZ.COMDatabase terbina dalam termasuk: cara membuat jadual data, menyimpan data, mengubah data, memadam data, merujuk data dan bagaimana ia digunakan dalam pertempuran sebenar.

Cara memilih pangkalan data

Pencipta yang biasa dengan platform kuantiti mesti tahu bahawa sebelum ini untuk menyimpan data untuk penggunaan semula tempatan, hanya menggunakan fungsi _G(), setiap kali menghentikan dasar, fungsi _G() akan menyimpan maklumat yang diperlukan secara automatik. Tetapi jika anda ingin menyimpan data pemformatan yang lebih rumit, fungsi _G() jelas tidak sesuai, jadi ramai orang memikirkan untuk membina pangkalan data sendiri untuk menyelesaikan masalah ini.

Bercakap mengenai pembinaan pangkalan data sendiri, saya harap anda akan berfikir tentang Oracle, MySQL, KDB, OneTick, NoSQL... ini adalah aplikasi peringkat perusahaan yang sangat baik, baik fungsi dan prestasi yang sangat kuat. Tetapi juga menghadapi beberapa masalah: sukar digunakan, konfigurasi yang rumit dan masalah untuk mengekalkan, yang agak terasa seperti senjata untuk peruncit kuantiti, walaupun pengguna hanya menggunakan sebahagian kecil fungsi.

Pencipta Kuantifikasi Pangkalan Data Terbina

DBExec adalah antara muka sistem pengurusan data relasional yang dibina oleh pencipta untuk mengukur. Ia dibangunkan berdasarkan SQLite, ia sendiri ditulis dalam C, bukan sahaja kecil, menggunakan sumber yang rendah, tetapi juga cepat, sangat sesuai untuk pengendalian data yang dilakukan secara tempatan oleh peminat analisis kuantitatif kewangan, kerana ia dapat membahagikan pelbagai kerucut objek kerucut (seperti bursa, sumber data, harga) ke dalam pelbagai jadual, dan menentukan hubungan di antara jadual; selain itu pengguna tidak perlu memasang dan mengkonfigurasi secara berasingan, hanya memanggil fungsi DBExec ().

Di samping itu, kos belajar bahasa SQLite adalah rendah, dan kebanyakan kerja yang dilakukan pada pangkalan data dilakukan oleh pernyataan SQLite. Kefahaman dengan tatabahasa asas dapat memenuhi kebanyakan keperluan. Berikut adalah tatabahasa asas SQLite.

Grammatik asas

Perumusan SQLite tidak membezakan ukuran, tetapi terdapat beberapa arahan yang sensitif terhadap ukuran, seperti GLOB dan globe yang mewakili makna yang berbeza. Perkataan SQLite boleh bermula dengan mana-mana kata kunci, seperti SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, dan lain-lain, yang bermaksud: Mengekstrak data, memasukkan data, mengemas kini data, menghapus data, mengubah pangkalan data, memadamkan jadual data. Semua frasa berakhir dengan koma dalam bahasa Inggeris. Berikut adalah operasi mudah untuk membuat, menambah, memadam, memeriksa, dan lain-lain pangkalan 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 pangkalan data biasanya mengandungi satu atau lebih jadual, setiap jadual mempunyai tanda nama, perlu diperhatikan bahawa sistem menyimpan jadual masing-masing: kvdb, cfg, log, profit, chart.img

Contoh strategi

Dengan memahami tatabahasa asas SQLite, kami menggunakan besi panas untuk membuat contoh untuk mengumpul dan menggunakan data Tick dengan menggunakan pangkalan data pembangunnya yang kuantitatif.

Langkah 1: Mengemas kini pentadbirPertama, pastikan anda menggunakan hos yang versi terkini, jika anda telah memuat turun hos sebelum ini, anda perlu menghapusnya terlebih dahulu, dan pastikan anda menggunakan versi terbaru.https://www.fmz.com/m/add-nodeHalaman ini dimuat turun semula dan digunakan semula.

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: Jalankan strategiSebagai contoh, dalam Windows, selepas menjalankan polisi, folder yang dinamakan dengan nombor bot akan dihasilkan dalam direktori admin dalam direktori logs. Buka folder ini, yang mengandungi fail dengan suffix log.db3 sebagai suffix, yang merupakan fail inventor untuk mengukur pangkalan data terbina dalam. Gambar berikut menunjukkan:imgKod di atas mula-mula mencipta satu jadual data yang dinamakan kerucut tik, kemudian menambah medan data tik ke jadual itu, kemudian mendapatkan data tik dari bursa dalam gelung, dan memasukkan data ini ke dalam jadual data kerucut tik, dan memutuskan jumlah data dalam jadual data lebih daripada 10 untuk melompat keluar dari gelung. Akhirnya, data dalam jadual data diminta, dihapuskan, atau diubah suai dengan 5 perintah SQLite masing-masing. Dan dicetak ke dalam log, seperti yang ditunjukkan di bawah:img Langkah 4: Buat tetingkap statusAkhirnya, kami menambah beberapa kod untuk membuat tetingkap status untuk dasar dengan mengambil data dari pangkalan data pencipta yang kuantitatif untuk menunjukkan data dengan lebih intuitif.

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

Kod di atas menggunakan data dalam pangkalan data untuk membuat tetingkap data Tick. Dalam tetingkap ini, kolom-kolom tetingkap dalam pangkalan data mewakili bar tetingkap dalam bar status, dan bar nilai dalam bar tetingkap mewakili bar tetingkap dalam bar status.img

Kode Dasar 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 pautan inihttps://www.fmz.com/strategy/388963Anda boleh menyalin kod dasar penuh.

Pangkalan data memori

Jika data operasi tidak ingin disimpan secara kekal ke cakera, ia boleh ditambah sebelum pernyataan SQL:Simbol boleh dioperasikan di dalam pangkalan data ingatan, dan data boleh diletakkan semula apabila bot dihidupkan semula

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

Ringkasan

Perpustakaan data tidak hanya boleh memuatkan data yang besar, tetapi juga dapat memuatkan impian peminat perdagangan kuantiti yang banyak. Penggunaan pangkalan data tidak terhad kepada contoh dalam artikel ini, lebih banyak kaedah penggunaan boleh dirujuk ke tutorial SQLite, dan siri artikel yang dilancarkan oleh pencipta kuantiti.


Berkaitan

Lebih lanjut

dianwan99Bagus. Satu-satunya kelemahan ialah data tidak boleh dicatatkan secara tempatan, pada cakera sebenar.

williamfuDatabase tidak menyokong penyesuaian? Kode past past past error: ReferenceError: DBExec is not defined

SyukurlahBagus sekali.

Sokongan, anda boleh mencuba pangkalan data tempatan.

Terima kasih.