Использование SQLite для создания квантовой базы данных FMZ [TOC]
Данные являются источником количественной торговли. Очень важно эффективно управлять большим количеством данных. База данных является одним из лучших решений. В настоящее время применение базы данных стало стандартной количественной конфигурацией различных дневных торгов, высокочастотных торгов и других стратегий. В этой статье мы рассмотрим встроенную базу данных FMZ Quant (FMZ.COM), в том числе: как создавать таблицы данных, сохранять данные, изменять данные, удалять данные и справочные данные, а также как их использовать на практике.
Те, кто знаком с FMZ Quant Trading Platform, должны были знать, что до этого, если вы хотите сохранить данные на локальном для повторного использования, вы можете использовать только функцию _G(). Каждый раз, когда вы прекращаете стратегию, функция _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 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"));
}
В базе данных обычно содержится одна или несколько таблиц, каждая таблица имеет идентификацию имени, следует отметить, что системы зарезервированные таблицы: kvdb, cfg, log, profit, chart. То есть, при создании таблиц следует избегать системно зарезервированных имен. Давайте запустим код выше, который экспортирует следующее:
Зная базовый синтаксис SQLite, давайте начнем, пока железо горячее. Используйте встроенную количественную базу данных FMZ Quant, чтобы создать экземпляр сбора и использования данных Tick.
Шаг 1: обновление докераВо-первых, убедитесь, что вы используете последнюю версию докера. Если вы загрузили и использовали докер раньше, вам нужно сначала удалить его, а затем загрузить и развернуть его снова на странице (https://www.fmz.com/m/add-node).
Шаг 2: Создать стратегию
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);
}
Шаг 3: реализация стратегииВозьмем, к примеру, Windows. После выполнения этой стратегии, в словечнике
Вышеприведенный код сначала создает таблицу данных под названием
Шаг 4: создать строку состоянияНаконец, мы добавляем некоторые кусочки кода для создания строки состояния для стратегии путем получения данных в базе данных FMZ Quant, чтобы отобразить данные более интуитивно.
// create a 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;'));
// 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) + '`');
}
Нажмите на ссылку:https://www.fmz.com/strategy/265906, и вы можете скопировать полный исходный код.
Если управляемые данные не хотят быть сохранены на диске, вы можете добавить:
символ перед SQL-указанием для работы в базе данных в памяти, и данные будут сброшены после перезапуска бота.
DBExec(":select 1,2,3");
База данных может не только нести массивные данные, но и мечты многих энтузиастов количественной торговли. Использование базы данных ни в коем случае не ограничивается примерами, упомянутыми в статье.