Создание количественной базы данных FMZ с SQLite

Автор:Лидия., Создано: 2022-11-09 11:40:34, Обновлено: 2023-09-20 10:55:14

img

Резюме

Данные являются источником количественной торговли, как эффективно управлять большим количеством данных является очень важным звеном, база данных является одним из лучших решений, в настоящее время применение базы данных является количественным стандартом для всех видов ежедневной торговли, высокочастотной торговли и других стратегий.https://www.fmz.com), в том числе: как создавать таблицы данных, хранить данные, изменять данные, удалять данные, справочные данные и как применять их на практике.

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

Те, кто знаком с платформой FMZ Quant, должны знать, что перед сохранением данных для локального повторного использования можно использовать только функцию _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 "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. то есть при создании таблиц, вы должны избегать системы зарезервированных имен.

img

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

Узнав основную грамматику SQLite, мы наносим удар, пока железо горячее, чтобы создать экземпляр сбора и использования данных Tick с помощью встроенной базы данных FMZ Quant.

Шаг 1: Обновление докера

Во-первых, убедитесь, что вы используете последнюю версию докера. Если вы загрузили и использовали докер раньше, вам нужно сначала удалить его, а затем перезагрузить и перераспределить его наhttps://www.fmz.com/m/add-node page.

Шаг 2: Создайте стратегию

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);
}

Шаг 3: реализовать стратегию

Возьмем, к примеру, Windows, после выполнения стратегии, в каталоге \logs\storage докерного каталога будет создана папка с именем робота. Откройте папку, и там будет файл с суффиксом . db3, который является файлом встроенной базы данных FMZ Quant. Как показано на следующей фигуре:

img

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

img

Шаг 4: Создать строку состояния

Наконец, мы добавляем код для создания строки состояния для стратегии, получая данные в базе данных FMZ Quant, чтобы отобразить данные более визуально, добавление кода показывает следующее:

    // Create 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;'));
    // 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чтобы скопировать полный код стратегии.

База данных памяти

Если вы не хотите сохранять данные на диске навсегда, вы можете добавить символ : перед командой SQL для работы в базе данных памяти, и данные будут сброшены после перезагрузки робота.

DBExec(":select 1,2,3");

Резюме

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


Связанные

Больше