Gunakan SQLite untuk membina pangkalan data kuant FMZ [TOC]
Data adalah sumber perdagangan kuantitatif. Ia sangat penting untuk menguruskan sejumlah besar data dengan cekap. Pangkalan data adalah salah satu penyelesaian terbaik. Pada masa kini, aplikasi pangkalan data telah menjadi konfigurasi kuantitatif standard pelbagai perdagangan hari, perdagangan frekuensi tinggi dan strategi lain. Dalam artikel ini, kita akan mengkaji pangkalan data terbina dalam FMZ Quant (FMZ.COM), termasuk: cara membuat jadual data, menyimpan data, mengubah data, memadam data, dan data rujukan, serta cara menggunakannya dalam amalan.
Mereka yang biasa dengan Platform Perdagangan Kuantum FMZ harus tahu bahawa sebelum ini, jika anda ingin menyimpan data ke tempatan 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 sesuai, jadi ramai orang berfikir untuk membina pangkalan data mereka sendiri untuk menyelesaikan masalah ini.
Apabila ia datang kepada pangkalan data yang dibina sendiri, semua orang boleh memikirkan Oracle, MySQL, KDB, OneTick, NoSQL... Ini semua adalah aplikasi peringkat perusahaan yang sangat baik, baik dari segi fungsi dan prestasi. Tetapi terdapat juga beberapa masalah: sukar untuk memulakan, dan konfigurasi dan penyelenggaraan sukar. Bagi pelabur runcit dalam perdagangan kuantitatif, ia agak seperti memecahkan lalat pada roda. Walaupun anda sudah memulakan dengan aplikasi tersebut, hanya beberapa fungsi daripadanya yang akan digunakan.
DBExec adalah antara muka sistem pengurusan data relasional yang dibina ke dalam FMZ Quant. Ia dibangunkan berdasarkan SQLite dan ditulis dalam C. Ia bukan sahaja bersaiz kecil, tidak menggunakan banyak sumber, tetapi juga mempunyai kelajuan pemprosesan yang sangat cepat. Ia sangat sesuai untuk peminat analisis kuantitatif kewangan untuk melaksanakan pengurusan data secara tempatan, kerana ia boleh membahagikan pelbagai
Selain itu, kos belajar bahasa SQLite sangat rendah, dan kebanyakan kerja yang dilakukan pada pangkalan data dilakukan oleh pernyataan SQLite. Kebanyakan keperluan boleh dipenuhi dengan membiasakan diri dengan sintaks asas. Berikut adalah sintaks asas SQLite.
Sintaks SQLite tidak sensitif kepada huruf besar, tetapi beberapa perintah sensitif kepada huruf besar, seperti GLOB dan glob, yang mempunyai makna yang berbeza. Perintah SQLite boleh bermula dengan kata kunci apa pun, seperti SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, dll, yang masing-masing bermaksud: mengekstrak data, memasukkan data, mengemas kini data, memadamkan data, mengubah suai pangkalan data, dan memadamkan jadual data. Semua perintah diakhiri dengan titik koma. Berikut adalah operasi seperti penciptaan, penambahan, penghapusan, pengubahsuaian, dan pertanyaan pangkalan data yang mudah:
function main() {
// create: if the table of "users" do not exist, create one; "id" is integer and increases automatically; "name" is in form of text and not null
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('A')"));
Log(DBExec("INSERT INTO users(name) values('B')"));
// delete:
Log(DBExec("DELETE FROM users WHERE id=1;"));
// modify:
Log(DBExec("UPDATE users SET name='C' WHERE id=2"));
// query:
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 pengenalan nama, perlu diperhatikan bahawa jadual yang dikhaskan sistem adalah: kvdb, cfg, log, keuntungan, carta. iaitu, apabila membuat jadual, anda harus mengelakkan nama yang dikhaskan sistem. Mari kita jalankan kod di atas, yang mengeksport perkara berikut:
Setelah mengetahui sintaks asas SQLite, mari kita menyerang sementara besi panas; gunakan pangkalan data kuantitatif terbina dalam FMZ Quant untuk membuat contoh pengumpulan dan penggunaan data Tick.
Langkah 1: mengemas kini dockerPertama, pastikan anda menggunakan versi terbaru docker. Jika anda telah memuat turun dan menggunakan docker sebelum ini, anda perlu memadamkannya terlebih dahulu, dan memuat turun dan menyebarkannya semula di halaman (https://www.fmz.com/m/add-node).
Langkah 2: Buat strategi
function main() {
// set contract
_C(exchange.SetContractType, 'swap');
// create the 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 tick data
while (true) {
let tick = exchange.GetTicker();
// add data in 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})`);
// query all data
let allDate = DBExec('select * from tick');
if (allDate.values.length > 10) {
break;
}
Sleep(1000);
}
// query all data
Log(DBExec('select * from tick'));
// query the first data
Log(DBExec('select * from tick limit 1'));
// query the first two 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'));
// query all data
let allDate = DBExec('select * from tick')
Log(allDate);
}
Langkah 3: Mengoperasikan strategiAmbil Windows sebagai contoh. Selepas menjalankan strategi, folder yang dinamakan dengan bot ID akan dijana dalam kamus
Kod di atas mula-mula mencipta jadual data bernama
Langkah 4: Buat bar statusAkhirnya, kita menambah beberapa kepingan kod untuk membuat bar status untuk strategi dengan mendapatkan data dalam pangkalan data FMZ Quant untuk memaparkan data dengan lebih intuitif.
// create a 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
/*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;'));
// set contract
_C(exchange.SetContractType, 'swap');
// establish the 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 tick data
while (true) {
let tick = exchange.GetTicker();
// add data in 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})`);
// query all data
let allDate = DBExec('select * from tick');
if (allDate.values.length > 10) {
break;
}
Sleep(1000);
}
// query all data
Log(DBExec('select * from tick'));
// query the first data
Log(DBExec('select * from tick limit 1'));
// query the first two data
Log(DBExec('select * from tick limit 0,2'));
// delet 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'));
// query all data
let allDate = DBExec('select * from tick')
Log(allDate);
// create the status bar
let table = {
type: 'table',
title: 'Binance Tick data',
cols: allDate.columns,
rows: allDate.values
}
LogStatus('`' + JSON.stringify(table) + '`');
}
Klik pautan:https://www.fmz.com/strategy/265906, dan anda boleh menyalin kod sumber lengkap.
Jika data yang dikendalikan tidak mahu disimpan secara kekal ke cakera, anda boleh menambah:
simbol sebelum arahan SQL untuk beroperasi dalam pangkalan data dalam memori, dan data akan diset semula selepas bot dimulakan semula.
DBExec(":select 1,2,3");
Pangkalan data tidak hanya boleh membawa data besar, tetapi juga membawa impian banyak peminat perdagangan kuantitatif. Penggunaan pangkalan data tidak terhad kepada contoh yang disebutkan dalam artikel. Untuk kaedah penggunaan yang lebih lanjut, anda boleh merujuk kepada tutorial SQLite dan siri artikel yang akan dipaparkan di FMZ Quant kemudian.