Sumber daya yang dimuat... Pemuatan...

Penemu Database Kuantitatif

Penulis:Penemu Kuantitas - Mimpi Kecil, Tanggal: 2022-11-04 19:12:34
Tag:

Pertama, ringkasan

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.

Ketiga, inventor mengkuantifikasi database internal

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.

4. 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

5. 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.cn/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

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

7. Kesimpulan

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.


/*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() {
    // 订阅合约
    _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) + '`');
}

Lebih banyak

Zyc1997Apakah ada versi Python?

Penemu Kuantitas - Mimpi KecilIni adalah cara yang sama dengan panggilan fungsi Python.