Utilice SQLite para construir la base de datos cuántica FMZ

El autor:No lo sé., Creado: 2022-04-24 11:32:35, Actualizado: 2022-04-24 16:21:38

Utilice SQLite para construir la base de datos cuántica FMZ [TOC] ¿Qué quieres decir?

Resumen de las actividades

Los datos son la fuente del comercio cuantitativo. Es muy crítico para gestionar eficientemente una gran cantidad de datos. La base de datos es una de las mejores soluciones. Hoy en día, la aplicación de la base de datos se ha convertido en la configuración cuantitativa estándar de varias estrategias de comercio diario, comercio de alta frecuencia y otras estrategias. En este artículo estudiaremos la base de datos incorporada de FMZ Quant (FMZ.COM), incluyendo: cómo crear tablas de datos, guardar datos, modificar datos, borrar datos y datos de referencia, así como cómo utilizarlos en la práctica.

Cómo seleccionar la base de datos

Aquellos que están familiarizados con la plataforma de negociación cuántica FMZ deberían haber sabido que antes de esto, si desea guardar datos a local para su reutilización, solo puede usar la función _G(). Cada vez que detenga la estrategia, la función _G() guardará automáticamente la información requerida. Pero si desea guardar datos formateados más y más complejos, la función _G( obviamente no es adecuada, por lo que muchas personas piensan en construir su propia base de datos para resolver el problema.

Cuando se trata de bases de datos construidas por uno mismo, todo el mundo puede pensar en Oracle, MySQL, KDB, OneTick, NoSQL... Todas estas son excelentes aplicaciones de nivel empresarial, tanto en términos de función como de rendimiento. Pero también hay algunos problemas: es difícil comenzar, y la configuración y el mantenimiento son difíciles. Para los inversores minoristas en el comercio cuantitativo, es un poco como romper una mosca en la rueda. Incluso si ya comienzas con esas aplicaciones, solo se utilizarán algunas funciones de ellas.

Base de datos integrada de FMZ Quant

A continuación, conozcamos la base de datos ligera integrada de FMZ Quant. DBExec es una interfaz de sistema de gestión de datos relacional integrada en FMZ Quant. Se desarrolla sobre la base de SQLite y está escrito en C. No solo es de tamaño pequeño, ocupa poco recursos, sino que también tiene una velocidad de procesamiento muy rápida. Es muy adecuado para los entusiastas del análisis cuantitativo financiero para implementar la gestión de datos localmente, ya que puede dividir diferentes objetos (como plataformas, fuentes de datos, precios) en diferentes tablas y definir las relaciones entre las tablas. Además, los usuarios no necesitan instalarlo y configurarlo por separado; siempre y cuando llamen a la función DBExec (((), se puede usar directamente!

Además, el costo de aprender el lenguaje SQLite es muy bajo, y la mayor parte del trabajo realizado en la base de datos se realiza mediante instrucciones SQLite.

Sintáctica básica

La sintaxis de SQLite es insensible a mayúsculas y minúsculas, pero algunos comandos son sensibles a mayúsculas y minúsculas, como GLOB y glob, que tienen diferentes significados. Las instrucciones de SQLite pueden comenzar con cualquier palabra clave, como SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, etc., que respectivamente significan: extraer datos, insertar datos, actualizar datos, eliminar datos, modificar la base de datos y eliminar la tabla de datos. Todas las instrucciones se terminan con un punto y coma. Las siguientes son operaciones como la creación, adición, eliminación, modificación y consulta de una base de datos simple:

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

Una base de datos generalmente contiene una o más tablas, cada tabla tiene una identificación de nombre, debe tenerse en cuenta que las tablas reservadas para el sistema son: kvdb, cfg, log, profit, gráfico. Es decir, al crear tablas, debe evitar los nombres reservados para el sistema.img

Ejemplo de estrategia

Después de conocer la sintaxis básica de SQLite, vamos a golpear mientras el hierro está caliente; usar la base de datos cuantitativa integrada de FMZ Quant para crear una instancia de recopilación y uso de datos de Tick.

Paso 1: actualizar el dockerEn primer lugar, asegúrese de que está utilizando la última versión de un docker. Si usted ha descargado y utilizado un docker antes, usted necesita para eliminar primero, y descargar y desplegar de nuevo en la página (https://www.fmz.com/m/add-node).

Paso 2: crear una estrategia

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

Paso 3: estrategia de operaciónTomemos Windows como ejemplo. Después de ejecutar la estrategia, se generará una carpeta llamada con el ID de bot en el diccionario \logs\storage del directorio docker; abra la carpeta y habrá un archivo con .db3 como sufijo; este archivo es el archivo de la base de datos integrada de FMZ Quant. Como se muestra en la siguiente figura:img

El código anterior primero crea una tabla de datos llamada tick, luego agrega el campo de datos de tick a la tabla, luego obtiene los datos de tick de la plataforma en el bucle e inserta estos datos en la tabla de datos tick, y al mismo tiempo Si se juzga que la cantidad de datos en la tabla de datos supera 10, salta del bucle. Finalmente, use cinco comandos de SQLite para consultar, eliminar y modificar los datos en la tabla de datos. Y imprímelo en el registro, como se muestra en la siguiente imagen:img

Paso 4: crear la barra de estadoPor último, añadimos algunas piezas 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 intuitiva.

    // create a 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 Binance Tick Data a partir de los datos de la base de datos. El campo columns en la base de datos representa la fila horizontal en la barra de estado, y el campo valores representa la fila vertical en la barra de estado. Como se muestra a continuación:img

Código fuente de la estrategia completa

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

Haga clic en el enlace:https://www.fmz.com/strategy/265906, y puedes copiar el código fuente completo.

Base de datos en memoria

Si los datos operados no quieren ser guardados permanentemente en el disco, puede añadir el:símbolo antes de la instrucción SQL para operar en la base de datos en memoria, y los datos se restablecerán después de reiniciar el bot.

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

Conclusión

La base de datos no solo puede llevar datos masivos, sino también llevar los sueños de muchos entusiastas del comercio cuantitativo. El uso de la base de datos no se limita, de ninguna manera, a los ejemplos mencionados en el artículo. Para más métodos de uso, puede consultar el tutorial de SQLite y la serie de artículos que se publicarán en FMZ Quant más adelante.


Más.