Membina Pangkalan Data Kuantitatif FMZ dengan SQLite

Penulis:Lydia, Dicipta: 2022-11-09 11:40:34, Dikemas kini: 2023-09-20 10:55:14

img

Abstrak

Data adalah sumber perdagangan kuantitatif, bagaimana untuk menguruskan sejumlah besar data dengan cekap adalah pautan yang sangat kritikal, pangkalan data adalah salah satu penyelesaian terbaik, pada masa ini aplikasi pangkalan data adalah standard kuantitatif untuk semua jenis perdagangan harian, perdagangan frekuensi tinggi dan strategi lain.https://www.fmz.com), termasuk: cara membuat jadual data, menyimpan data, mengubah data, memadam data, data rujukan dan cara menerapkannya dalam amalan.

Cara memilih pangkalan data

Mereka yang biasa dengan platform FMZ Quant harus tahu bahawa sebelum menyimpan data untuk kegunaan semula tempatan, anda hanya boleh menggunakan fungsi _G(), yang menyimpan maklumat yang diperlukan secara automatik setiap kali anda menghentikan strategi. Tetapi jika anda ingin menyimpan data yang diformat lebih dan lebih kompleks, fungsi _G() jelas tidak banyak digunakan, oleh itu, ramai orang membuat fikirannya untuk membina pangkalan data mereka sendiri untuk menyelesaikan masalah ini.

Apabila ia datang kepada pangkalan data yang dibina sendiri, anda mesti memikirkan Oracle, MySQL, KDB, OneTick, NoSQL... Ini adalah aplikasi peringkat perusahaan yang sangat baik dalam kedua-dua fungsi dan prestasi. Walau bagaimanapun, terdapat juga beberapa masalah: sukar untuk memulakan, dan konfigurasi rumit dan penyelenggaraan sukar. Bagi peniaga kuantitatif runcit, ia agak seperti menembak lalat dengan meriam. Walaupun mereka memulakan, mereka hanya menggunakan sebahagian kecil fungsi.

Pangkalan data terbina dalam FMZ Quant

DBExec adalah antara muka sistem pengurusan data relasional yang dibina oleh FMZ Quant. Ia dibangunkan berdasarkan SQLite dan ditulis dalam bahasa C. Ia bukan sahaja bersaiz kecil, sedikit penggunaan sumber, tetapi juga cepat dalam pemprosesan. Ia sangat sesuai untuk peminat analisis kuantitatif kewangan untuk melaksanakan pengurusan data secara tempatan, kerana pelbagai objek (seperti bursa, sumber data, dan harga) boleh dibahagikan kepada pelbagai jadual, dan hubungan antara jadual boleh ditakrifkan. Di samping itu, pengguna tidak perlu memasang dan mengkonfigurasi mereka secara berasingan. Mereka boleh menggunakannya secara langsung dengan memanggil fungsi DBExec)!

Di samping itu, ia adalah sangat mudah untuk belajar bahasa SQLite, dan kebanyakan kerja yang dilakukan pada pangkalan data diselesaikan oleh pernyataan SQLite.

Grammar asas

Grammar SQLite tidak sensitif kepada huruf besar, walaupun terdapat beberapa perintah yang sensitif kepada huruf besar, seperti GLOB dan glob, yang mewakili makna yang berbeza. Perkataan SQLite boleh bermula dengan kata kunci apa pun, seperti SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, dll., yang bermaksud: mengekstrak data, memasukkan data, mengemas kini data, memadamkan data, mengubah suai pangkalan data, dan memadamkan jadual data.

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 pangkalan data biasanya mengandungi satu atau lebih jadual, setiap jadual dikenal pasti dengan nama, perhatikan bahawa jadual yang dikhaskan sistem adalah: kvdb, cfg, log, keuntungan, carta. iaitu apabila membuat jadual, anda harus mengelakkan nama yang dikhaskan sistem.

img

Contoh strategi

Setelah mempelajari tatabahasa asas SQLite, kita menyerang semasa besi panas untuk membuat contoh mengumpul dan menggunakan data Tick dengan menggunakan pangkalan data terbina dalam FMZ Quant.

Langkah 1: Kemas kini docker

Pertama, pastikan anda menggunakan versi terbaru docker. Jika anda telah memuat turun dan menggunakan docker sebelum ini, anda perlu memadamkannya terlebih dahulu, dan kemudian muat turun semula dan menyebarkannya semula padahttps://www.fmz.com/m/add-node page.

Langkah 2: Buat 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: Jalankan strategi

Ambil Windows sebagai contoh, selepas menjalankan strategi, folder yang dinamakan mengikut nombor robot akan dicipta dalam direktori \logs\storage direktori docker. Buka folder, dan terdapat fail dengan akhiran . db3, yang merupakan fail pangkalan data terbina dalam FMZ Quant. Seperti yang ditunjukkan dalam gambar berikut:

img

Kod di atas mencipta jadual data bernama tick terlebih dahulu, kemudian menambah medan data tik ke jadual, kemudian mendapatkan data tik dari pertukaran dalam gelung, dan memasukkan data ke dalam jadual data tick. Pada masa yang sama, kita menilai bahawa jumlah data dalam jadual data melebihi 10, maka kita melompat keluar dari gelung. Akhirnya kita menggunakan 5 perintah SQLite untuk mencari, memadam dan mengubah suai data dalam jadual data masing-masing. Dan mencetak mereka ke dalam log, seperti yang ditunjukkan dalam gambar berikut:

img

Langkah 4: Buat bar status

Akhirnya, kita menambah beberapa kod untuk membuat bar status untuk strategi dengan mendapatkan data dalam pangkalan data FMZ Quant untuk memaparkan data dengan lebih visual, kod penambahan menunjukkan seperti berikut:

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

Kod di atas mencipta jadual Binance Tick data melalui data dalam pangkalan data. Lapangan kolom dalam pangkalan data mewakili garis dalam bar status, dan medan nilai mewakili kolom dalam bar status. Seperti yang ditunjukkan dalam gambar di bawah:

img

Kod 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 pada pautan inihttps://www.fmz.com/strategy/388963untuk menyalin kod strategi penuh.

Pangkalan data memori

Jika anda tidak mahu menyimpan data ke cakera secara kekal, anda boleh menambah simbol : sebelum perintah SQL untuk beroperasi dalam pangkalan data memori, dan data akan diset semula selepas robot dimulakan semula.

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

Ringkasan

Pangkalan data tidak hanya boleh membawa data yang besar, tetapi juga membawa impian banyak peminat perdagangan kuantitatif. Penggunaan pangkalan data tidak terhad kepada contoh dalam artikel ini. Untuk kaedah penggunaan yang lebih lanjut, sila rujuk tutorial SQLite dan artikel susulan FMZ Quant.


Berkaitan

Lebih lanjut