En la carga de los recursos... Cargando...

Construir una base de datos cuantitativa de FMZ con SQLite

El autor:FMZ~Lydia, Creado: 2022-11-09 11:40:34, Actualizado: 2023-09-20 10:55:14

img

Resumen de las actividades

Los datos son la fuente del comercio cuantitativo, cómo gestionar una gran cantidad de datos de manera eficiente es un vínculo muy crítico, la base de datos es una de las mejores soluciones, hoy en día la aplicación de la base de datos es el estándar cuantitativo para todo tipo de comercio diario, comercio de alta frecuencia y otras estrategias.https://www.fmz.com), incluyendo: cómo crear tablas de datos, almacenar datos, modificar datos, borrar datos, datos de referencia y cómo aplicarlos en la práctica.

Cómo elegir la base de datos

Aquellos que están familiarizados con la plataforma FMZ Quant deben saber que antes de guardar datos para su reutilización local, solo se puede usar la función _G(), que guarda la información necesaria automáticamente cada vez que se detiene la estrategia.

Cuando se trata de bases de datos autoconstruidas, debes pensar en Oracle, MySQL, KDB, OneTick, NoSQL... Estas son aplicaciones de nivel empresarial muy excelentes tanto en función como en rendimiento. Sin embargo, también hay varios problemas: es difícil comenzar, y la configuración es engorrosa y el mantenimiento es difícil. Para los comerciantes cuantitativos minoristas, es un poco como disparar moscas con cañones. Incluso si comienzan, solo usan una pequeña parte de las funciones.

Base de datos integrada de FMZ Quant

A continuación, echemos un vistazo a la base de datos ligera incorporada por FMZ Quant. DBExec es una interfaz integrada del sistema de gestión de datos relacional de FMZ Quant. Está desarrollada sobre la base de SQLite y está escrita en C. No sólo es de tamaño pequeño, poco consumo de recursos, sino también rápido en el procesamiento. Es muy adecuado para los entusiastas del análisis cuantitativo financiero para implementar la gestión de datos localmente, ya que diferentes objetos (como intercambios, fuentes de datos y precios) se pueden dividir en diferentes tablas, y las relaciones entre tablas se pueden definir. Además, los usuarios no necesitan instalar y configurarlos por separado. ¡Pueden usarlos directamente llamando a la función DBExec!)

Además, es muy fácil aprender el lenguaje SQLite, y la mayor parte del trabajo realizado en la base de datos se completa con instrucciones SQLite. Si usted está familiarizado con la gramática básica, puede cumplir con la mayoría de los requisitos. La siguiente es la gramática básica de SQLite.

Gramática básica

La gramática de SQLite es insensible a mayúsculas y minúsculas, aunque hay algunos comandos que son sensibles a mayúsculas y minúsculas, como GLOB y glob, que representan diferentes significados. Las instrucciones de SQLite pueden comenzar con cualquier palabra clave, como SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, etc., que significan: extraer datos, insertar datos, actualizar datos, eliminar datos, modificar base de datos y eliminar tabla de datos. Todas las instrucciones se terminan con puntos y coma en inglés.

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

Una base de datos generalmente contiene una o más tablas, cada tabla se identifica por un nombre, tenga en cuenta que las tablas reservadas para el sistema son: kvdb, cfg, log, profit, chart. es decir, al crear tablas, debe evitar los nombres reservados para el sistema.

img

Ejemplos de estrategias

Habiendo aprendido la gramática básica de SQLite, golpeamos mientras el hierro está caliente para crear una instancia de recopilación y uso de datos de Tick utilizando la base de datos incorporada de FMZ Quant.

Paso 1: actualizar el docker

En primer lugar, asegúrese de que está utilizando la última versión del docker. Si usted ha descargado y utilizado el docker antes, usted necesita para eliminar primero, y luego volver a descargar y volver a desplegar enhttps://www.fmz.com/m/add-node page.

Paso 2: Crear la estrategia

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

Paso 3: Ejecutar la estrategia

Tomemos Windows como ejemplo, después de ejecutar la estrategia, se creará una carpeta con el nombre del número de robot en el directorio \logs\storage del directorio docker. Abre la carpeta y hay un archivo con el sufijo . db3, que es el archivo de la base de datos integrada de FMZ Quant. Como se muestra en la siguiente figura:

img

El código anterior crea primero una tabla de datos llamada tick, luego agrega el campo de datos de tick a la tabla, luego obtiene los datos de tick del intercambio en el bucle e inserta los datos en la tabla de datos tick. Al mismo tiempo, juzgamos que la cantidad de datos en la tabla de datos supera 10, luego saltamos del bucle. Finalmente, usamos 5 comandos de SQLite para buscar, eliminar y modificar los datos en la tabla de datos respectivamente. Y imprimirlos en los registros, como se muestra en la siguiente imagen:

img

Paso 4: Crear la barra de estado

Por último, añadimos un poco de código para crear una barra de estado para la estrategia mediante la obtención de los datos en la base de datos FMZ Quant para mostrar los datos de manera más visual, el código de adición muestra lo siguiente:

    // Create status bar
    let table = {
        type: 'table',
        title: 'Binance Tick data',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');

El código anterior crea una tabla de Binance Tick data a través de los datos en la base de datos. El campo columns en la base de datos representa las columnas en la barra de estado, y el campo valores representa las columnas en la barra de estado. Como se muestra en la figura a continuación:

img

Código de estrategia completo

/*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) + '`');
}

Haga clic en este enlacehttps://www.fmz.com/strategy/388963para copiar el código completo de la estrategia.

Base de datos de memoria

Si no desea guardar los datos en el disco permanentemente, puede agregar el símbolo : antes de la instrucción SQL para operar en la base de datos de memoria, y los datos se restablecerán después de reiniciar el robot.

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

Resumen de las actividades

La base de datos no solo puede llevar datos masivos, sino también llevar el sueño de muchos entusiastas del comercio cuantitativo. El uso de bases de datos no se limita de ninguna manera a los ejemplos en este artículo. Para más métodos de uso, consulte el tutorial de SQLite y los artículos de seguimiento de FMZ Quant.


Relacionados

Más.