[TOC]

Data adalah sumber perdagangan kuantitatif Cara menguruskan jumlah data yang besar adalah pautan kritikal Pangkalan data adalah salah satu penyelesaian terbaik Pada masa kini, aplikasi pangkalan data telah menjadi konfigurasi standard kuantitatif untuk pelbagai perdagangan intrahari, perdagangan frekuensi tinggi. dan strategi lain. Dalam artikel ini, kami akan mengkaji pangkalan data terbina dalam Inventor Quantitative (FMZ.COM), termasuk: cara membuat jadual data, menyimpan data, mengubah suai data, memadam data, data rujukan dan cara menggunakannya dalam pertempuran sebenar.
Mereka yang biasa dengan Platform Kuantitatif Inventor harus tahu bahawa sebelum ini, jika anda ingin menyimpan data secara setempat untuk digunakan semula, anda hanya boleh menggunakan fungsi _G() Setiap kali anda menghentikan strategi,_Fungsi G() akan menyimpan maklumat yang diperlukan secara automatik. Tetapi jika anda ingin menyimpan data berformat yang lebih kompleks,_Fungsi G() jelas tidak boleh digunakan, jadi ramai orang berfikir untuk membina pangkalan data mereka sendiri untuk menyelesaikan masalah ini.
Apabila bercakap tentang pangkalan data binaan sendiri, semua orang mungkin memikirkan Oracle, MySQL, KDB, OneTick, NoSQL… Ini semua adalah aplikasi peringkat perusahaan yang sangat baik, dengan fungsi dan prestasi yang sangat berkuasa. Walau bagaimanapun, ia juga menghadapi beberapa masalah: ia adalah sukar untuk memulakan, konfigurasi adalah rumit dan penyelenggaraan adalah menyusahkan Bagi peniaga kuantitatif runcit, ini adalah sedikit seperti menggunakan meriam untuk membunuh lalat Walaupun mereka memulakan, mereka akan hanya menggunakan sebahagian kecil daripada fungsi.
Seterusnya, mari kita lihat pangkalan data ringan yang dibina dalam InventorQuant ialah antara muka sistem pengurusan data relasi yang dibina dalam InventorQuant Ia dibangunkan berdasarkan SQLite dan ditulis dalam C. Ia bukan sahaja bersaiz kecil dan penggunaan sumber yang rendah , tetapi juga Kelajuan pemprosesan adalah pantas dan sangat sesuai untuk peminat analisis kuantitatif kewangan untuk melaksanakan pengurusan data secara tempatan, kerana “objek” yang berbeza (seperti pertukaran, sumber data, harga) boleh dibahagikan kepada jadual yang berbeza dan perhubungan boleh ditakrifkan antara meja. Di samping itu, pengguna tidak perlu memasang dan mengkonfigurasi secara berasingan, mereka boleh menggunakannya secara langsung dengan memanggil fungsi DBExec()!
Di samping itu, kos pembelajaran bahasa SQLite adalah sangat rendah, dan kebanyakan kerja yang dilakukan pada pangkalan data dilakukan oleh pernyataan SQLite. Memahami sintaks asas boleh memenuhi kebanyakan keperluan Berikut ialah sintaks asas SQLite.
Sintaks SQLite tidak sensitif huruf besar-besaran, tetapi beberapa perintah sensitif huruf besar-besaran, seperti GLOB dan glob, yang mempunyai makna yang berbeza. Pernyataan SQLite boleh bermula dengan mana-mana kata kunci, seperti SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, dsb., yang masing-masing bermaksud: ekstrak data, masukkan data, kemas kini data, padam data, ubah suai pangkalan data dan padam jadual data. Semua pernyataan berakhir dengan koma bertitik. Berikut ialah penciptaan pangkalan data yang mudah, penambahan, pemadaman, pengubahsuaian, pertanyaan dan operasi lain:
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"));
}
Pangkalan data biasanya mengandungi satu atau lebih jadual Setiap jadual mempunyai nama Perlu diingatkan bahawa jadual simpanan sistem adalah: kvdb, cfg, log, keuntungan, carta. Maksudnya, semasa membuat jadual, anda harus mengelakkan nama simpanan sistem. Mari jalankan kod di atas, yang akan mencetak perkara berikut:

Sekarang setelah kita mengetahui sintaks asas SQLite, kita boleh menggunakan pangkalan data terbina dalam InventorQuant untuk mencipta contoh mengumpul dan menggunakan data Tick.
Langkah 1: Kemas kini hos anda Mula-mula, pastikan anda menggunakan versi terbaharu hos Jika anda telah memuat turun dan menggunakan hos sebelum ini, anda perlu memadamnya dahulu dan kemudian memuat turun semula dan menggunakannya di https://www.fmz.com/. halaman m/tambah-nod.
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 strategi
Mengambil Windows sebagai contoh, selepas menjalankan dasar, folder yang dinamakan sempena nombor robot akan dijana dalam direktori “\logs\storage” pada direktori hos Buka folder dan akan ada fail dengan akhiran “.db3 ” di dalamnya. , fail ini ialah fail pangkalan data terbina dalam terkuantiti pencipta. Seperti yang ditunjukkan dalam rajah berikut:
Kod di atas mula-mula mencipta jadual data bernama “tanda”, kemudian menambah medan data semak pada jadual, kemudian memperoleh data semak daripada pertukaran dalam gelung dan memasukkan data ini ke dalam jadual data “tandakan”. dalam jadual data melebihi 10, gelung akan lompat keluar. Akhir sekali, lima perintah SQLite digunakan untuk membuat pertanyaan, memadam dan mengubah suai data dalam jadual data. Dan cetaknya dalam log, seperti yang ditunjukkan dalam rajah berikut:
Langkah 4: Buat bar status
Akhir sekali, kami menambah beberapa kod untuk membuat bar status untuk strategi dengan mendapatkan data daripada Pangkalan Data Kuantitatif Pencipta untuk memaparkan data dengan lebih intuitif Kod yang baru ditambah adalah seperti berikut:
// 创建状态栏
let table = {
type: 'table',
title: '币安Tick数据',
cols: allDate.columns,
rows: allDate.values
}
LogStatus('`' + JSON.stringify(table) + '`');
Kod di atas mencipta jadual “Binance Tick Data” menggunakan data dalam pangkalan data. Medan “lajur” dalam pangkalan data mewakili “baris” dalam bar status dan medan “nilai” mewakili “lajur” dalam bar status. Seperti yang ditunjukkan dalam rajah berikut:

/*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 pada pautan ini https://www.fmz.com/strategy/388963 untuk menyalin kod strategi yang lengkap.
Jika anda tidak mahu menyimpan data secara kekal ke cakera, anda boleh menambah:Simbol boleh dikendalikan dalam pangkalan data memori, dan data ditetapkan semula selepas robot dimulakan semula
DBExec(":select 1,2,3");
Pangkalan data bukan sahaja boleh membawa sejumlah besar data, tetapi juga membawa impian ramai peminat perdagangan kuantitatif. Penggunaan pangkalan data tidak terhad kepada contoh dalam artikel ini Untuk kaedah penggunaan lanjut, sila rujuk tutorial SQLite dan siri artikel berikutnya yang dikeluarkan oleh Inventor Quantitative.