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.
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.
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
Di samping itu, ia adalah sangat mudah untuk belajar bahasa SQLite, dan kebanyakan kerja yang dilakukan pada pangkalan data diselesaikan oleh pernyataan SQLite.
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.
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.
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.
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);
}
Ambil Windows sebagai contoh, selepas menjalankan strategi, folder yang dinamakan mengikut nombor robot akan dicipta dalam direktori
Kod di atas mencipta jadual data bernama
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
/*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.
Jika anda tidak mahu menyimpan data ke cakera secara kekal, anda boleh menambah simbol
DBExec(":select 1,2,3");
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.