Использование SQLite для создания квантовой базы данных FMZ

Автор:Нинабадасс., Создано: 2021-04-24 11:32:35, Обновлено: 2021-04-24 16:21:38

Использование SQLite для создания квантовой базы данных FMZ [TOC]

Резюме

Данные являются источником количественной торговли. Очень важно эффективно управлять большим количеством данных. База данных является одним из лучших решений. В настоящее время применение базы данных стало стандартной количественной конфигурацией различных дневных торгов, высокочастотных торгов и других стратегий. В этой статье мы рассмотрим встроенную базу данных FMZ Quant (FMZ.COM), в том числе: как создавать таблицы данных, сохранять данные, изменять данные, удалять данные и справочные данные, а также как их использовать на практике.

Как выбрать базу данных

Те, кто знаком с FMZ Quant Trading Platform, должны были знать, что до этого, если вы хотите сохранить данные на локальном для повторного использования, вы можете использовать только функцию _G(). Каждый раз, когда вы прекращаете стратегию, функция _G() автоматически сохраняет необходимую информацию. Но если вы хотите сохранить все более и более сложные форматированные данные, функция _G(, очевидно, не подходит, поэтому многие люди думают о создании собственной базы данных для решения проблемы.

Когда дело доходит до самостоятельно построенных баз данных, каждый может подумать о Oracle, MySQL, KDB, OneTick, NoSQL... Это все отличные приложения на уровне предприятия, как с точки зрения функциональности, так и производительности. Но есть также некоторые проблемы: трудно начать, а конфигурация и обслуживание сложны. Для розничных инвесторов в количественной торговле это немного похоже на разрыв мухи на колесе. Даже если вы уже начали с этих приложений, будет использоваться только несколько функций из них.

Встроенная база данных FMZ Quant

Далее, давайте познакомимся с встроенной легкой базой данных FMZ Quant. DBExec - это интерфейс системы управления реляционными данными, встроенный в FMZ Quant. Он разработан на основе SQLite и написан на языке C. Он не только небольшой по размеру, малозанимает ресурсы, но и имеет очень быструю скорость обработки. Он очень подходит для любителей финансового количественного анализа для локального внедрения управления данными, потому что он может разделить различные объекты (такие как платформы, источники данных, цены) на различные таблицы и определить отношения между таблицами. Кроме того, пользователям не нужно устанавливать и настраивать его отдельно; до тех пор, пока они называют функцию DBExec (((), его можно использовать напрямую!

Кроме того, стоимость изучения языка 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. То есть, при создании таблиц следует избегать системно зарезервированных имен. Давайте запустим код выше, который экспортирует следующее:img

Пример стратегии

Зная базовый синтаксис 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. После выполнения этой стратегии, в словечнике \logs\storage докерного каталога будет создана папка с именем bot ID; откройте папку, и там будет файл с суффиксом .db3; этот файл является файлом встроенной базы данных FMZ Quant. Как показано на следующем рисунке:img

Вышеприведенный код сначала создает таблицу данных под названием tick, затем добавляет поле данных tick к таблице, затем получает данные tick с платформы в петле и вставляет эти данные в таблицу данных tick, и в то же время Если будет суждено, что количество данных в таблице данных превышает 10, он выйдет из петли. Наконец, используйте пять команд SQLite для запроса, удаления и изменения данных в таблице данных. И распечатайте его в журнале, как показано на следующем изображении:img

Шаг 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) + '`');

Вышеприведенный код создает таблицу Binance Tick Data из данных в базе данных. Поле колонны в базе данных представляет собой горизонтальный ряд в строке состояния, а поле значения представляет собой вертикальный ряд в строке состояния. Как показано ниже:img

Полный исходный код стратегии

/*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");

Заключение

База данных может не только нести массивные данные, но и мечты многих энтузиастов количественной торговли. Использование базы данных ни в коем случае не ограничивается примерами, упомянутыми в статье.


Больше