Данные являются источником количественной торговли, как эффективно управлять большим количеством данных является очень важным звеном, база данных является одним из лучших решений, в настоящее время применение базы данных является количественным стандартом для всех видов ежедневной торговли, высокочастотной торговли и других стратегий.https://www.fmz.com), в том числе: как создавать таблицы данных, хранить данные, изменять данные, удалять данные, справочные данные и как применять их на практике.
Те, кто знаком с платформой FMZ Quant, должны знать, что перед сохранением данных для локального повторного использования можно использовать только функцию _G(), которая автоматически сохраняет необходимую информацию каждый раз, когда вы останавливаете стратегию. Но если вы хотите сохранить все более и более сложные форматированные данные, функция _G(, очевидно, не очень применима, поэтому многие люди решили создать свою собственную базу данных для решения этой проблемы.
Когда дело доходит до самостоятельно построенных баз данных, вы должны думать о Oracle, MySQL, KDB, OneTick, NoSQL... Это очень отличные приложения на уровне предприятий как по функциональности, так и по производительности. Однако есть также несколько проблем: трудно начать, а конфигурация громоздкая и обслуживание сложное. Для розничных количественных трейдеров это немного похоже на стрельбу в мух с пушкой. Даже если они начинают, они используют только небольшую часть функций.
Далее, давайте посмотрим на легкую базу данных, встроенную FMZ Quant. DBExec - это встроенный интерфейс системы управления реляционными данными FMZ Quant. Он разработан на основе SQLite и написан на C. Он не только небольшой по размеру, мало потребляет ресурсы, но и быстрый в обработке. Он очень подходит для любителей финансового количественного анализа для локальной реализации управления данными, потому что различные
Кроме того, язык SQLite очень легко изучить, и большая часть работы, выполняемой на базе данных, выполняется с помощью SQLite-указаний.
Грамматика SQLite не чувствительна к большим и малым буквам, хотя есть некоторые команды, которые чувствительны к большим и малым буквам, такие как GLOB и glob, которые представляют разные значения. Указы SQLite могут начинаться с любого ключевого слова, такого как SELECT, INSERT, UPDATE, DELETE, ALTER, DROP и т. д., что означает: извлечь данные, вставить данные, обновить данные, удалить данные, изменить базу данных и удалить таблицу данных. Все команды заканчиваются английскими запятой и запятой. Ниже приведены простые операции создания базы данных, добавления, удаления, изменения и проверки:
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"));
}
База данных обычно содержит одну или несколько таблиц, каждая таблица идентифицируется по имени, обратите внимание, что системы зарезервированные таблицы: kvdb, cfg, log, profit, chart. то есть при создании таблиц, вы должны избегать системы зарезервированных имен.
Узнав основную грамматику SQLite, мы наносим удар, пока железо горячее, чтобы создать экземпляр сбора и использования данных Tick с помощью встроенной базы данных FMZ Quant.
Во-первых, убедитесь, что вы используете последнюю версию докера. Если вы загрузили и использовали докер раньше, вам нужно сначала удалить его, а затем перезагрузить и перераспределить его наhttps://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);
}
Возьмем, к примеру, Windows, после выполнения стратегии, в каталоге
Вышеприведенный код сначала создает таблицу данных под названием
Наконец, мы добавляем код для создания строки состояния для стратегии, получая данные в базе данных FMZ Quant, чтобы отобразить данные более визуально, добавление кода показывает следующее:
// Create status bar
let table = {
type: 'table',
title: 'Binance Tick data',
cols: allDate.columns,
rows: allDate.values
}
LogStatus('`' + JSON.stringify(table) + '`');
Вышеприведенный код создает таблицу
/*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) + '`');
}
Нажмите на эту ссылкуhttps://www.fmz.com/strategy/388963чтобы скопировать полный код стратегии.
Если вы не хотите сохранять данные на диске навсегда, вы можете добавить символ
DBExec(":select 1,2,3");
База данных может не только нести массивные данные, но и мечту многих энтузиастов количественной торговли. Использование баз данных никоим образом не ограничивается примерами в этой статье. Для получения дополнительных методов использования, пожалуйста, ознакомьтесь с руководством SQLite и последующими статьями FMZ Quant.