Изобретатели количественной базы данных

Автор:Маленькие мечты, Дата: 2022-11-04 19:12:34
Тэги:

Первое: резюме

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

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

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

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

Третье, изобретатели количественно используют встроенные базы данных.

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

Кроме того, стоимость обучения языку SQLite низкая, и большая часть работы, выполняемой на базе данных, выполняется с помощью SQLite. Знание базовой грамматики может удовлетворить большую часть потребностей.

Четвёртое, базовая грамматика

Скламент SQLite не отличается по размеру, однако некоторые команды чувствительны к размеру, например, GLOB и glob представляют разные значения. Склады SQLite могут начинаться с любых ключевых слов, таких как SELECT, INSERT, UPDATE, DELETE, ALTER, DROP и т. д. Они означают: извлечение данных, вставка данных, обновление данных, удаление данных, изменение базы данных, удаление таблицы данных.

function main() {
    // 创建:如果“users”表不存在就创建一个,“id”是整数且自动增加,“name”是文本形式且不为空
    Log(DBExec('CREATE TABLE IF NOT EXISTS "users" (id INTEGER PRIMARY KEY AUTOINCREMENT, name text not NULL);'));
    
    // 增加:
    Log(DBExec("INSERT INTO users(name) values('张三')"));
    Log(DBExec("INSERT INTO users(name) values('李四')"));
    
    // 删除:
    Log(DBExec("DELETE FROM users WHERE id=1;"));
    
    // 修改
    Log(DBExec("UPDATE users SET name='王五' WHERE id=2"));
    
    // 查询
    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, используя встроенную базу данных для количественного измерения.

Шаг первый: обновление администратораСначала убедитесь, что вы используете новейшую версию хостера. Если вы загрузили хостинг ранее, вам нужно сначала удалить его, и вы можете использовать его, если хотите.https://www.fmz.cn/m/add-nodeСтраница перезагружается и развертывается.

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

function main() {
    // 订阅合约
    _C(exchange.SetContractType, 'swap');
    
    // 创建数据表
    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);'
    ));
    
    // 获取10个tick数据
    while (true) {
        let tick = exchange.GetTicker();
        // 在tick表中增加数据
        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})`);
        // 查询所有数据
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }
    
    // 查询所有数据
    Log(DBExec('select * from tick'));
    
    // 查询第一个数据
    Log(DBExec('select * from tick limit 1'));
    
    // 查询前两个数据
    Log(DBExec('select * from tick limit 0,2'));
    
    // 删除第一个数据
    Log(DBExec('DELETE FROM tick WHERE id=1;'));
    
    // 修改第二个数据
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));
    
    // 查询所有数据
    let allDate = DBExec('select * from tick')
    Log(allDate);
}

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

    // 创建状态栏
    let table = {
        type: 'table',
        title: '币安Tick数据',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');

Вышеприведенный код использует данные из базы данных, чтобы создать таблицу данных Tick. В ней поле Tick columns в базе данных представляет поле Tick в базе состояния, а поле Tickvalues - поле Tick в базе состояния.img

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

/*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;'));
    // 订阅合约
    _C(exchange.SetContractType, 'swap');

    // 创建数据表
    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);'
    ));

    // 获取10个tick数据
    while (true) {
        let tick = exchange.GetTicker();
        // 在tick表中增加数据
        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})`);
        // 查询所有数据
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }

    // 查询所有数据
    Log(DBExec('select * from tick'));

    // 查询第一个数据
    Log(DBExec('select * from tick limit 1'));

    // 查询前两个数据
    Log(DBExec('select * from tick limit 0,2'));

    // 删除第一个数据
    Log(DBExec('DELETE FROM tick WHERE id=1;'));

    // 修改第二个数据
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));

    // 查询所有数据
    let allDate = DBExec('select * from tick')
    Log(allDate);

    // 创建状态栏
    let table = {
        type: 'table',
        title: '币安Tick数据',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

Нажмите на эту ссылкуhttps://www.fmz.com/strategy/388963Полное программное обеспечение также доступно для копирования.

Седьмое, итоги

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


/*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() {
    // 订阅合约
    _C(exchange.SetContractType, 'swap');

    // 创建数据表
    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);'
    ));

    // 获取10个tick数据
    while (true) {
        let tick = exchange.GetTicker();
        // 在tick表中增加数据
        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})`);
        // 查询所有数据
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }

    // 查询所有数据
    Log(DBExec('select * from tick'));

    // 查询第一个数据
    Log(DBExec('select * from tick limit 1'));

    // 查询前两个数据
    Log(DBExec('select * from tick limit 0,2'));

    // 删除第一个数据
    Log(DBExec('DELETE FROM tick WHERE id=1;'));

    // 修改第二个数据
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));

    // 查询所有数据
    let allDate = DBExec('select * from tick')
    Log(allDate);

    // 创建状态栏
    let table = {
        type: 'table',
        title: '币安Tick数据',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

Больше

Zyc1997Есть ли версия Python?

Маленькие мечтыЭто то же самое, что и призыв к функциям Python.