Construir una base de datos cuantificada de inventores con SQLite

El autor: , Creado: 2021-03-26 17:09:32, Actualizado: 2023-09-24 19:36:26

[TOC] ¿Qué quieres decir?

img

Resumen

Los datos son la fuente de transacciones cuantificadas, y la gestión eficiente de grandes cantidades de datos es un elemento clave. Las bases de datos son una de las mejores soluciones, y hoy en día, la aplicación de las bases de datos ya es la configuración estándar de cuantificación para todo tipo de estrategias de transacciones diarias, transacciones de alta frecuencia y otras.FMZ.COMLa base de datos está integrada, incluyendo: cómo crear tablas de datos, almacenar datos, modificar datos, eliminar datos, referenciar datos y cómo aplicarlos en la vida real.

Cómo elegir una base de datos

Los inventores que están familiarizados con las plataformas de cuantificación deben saber que antes, para guardar datos en repetición local, solo se podía usar la función _G(), y cada vez que se detiene la política, la función _G() guardaba automáticamente la información que necesitaba. Pero si se deseaba guardar datos de formato más complejos, la función _G() no era muy útil, por lo que muchas personas pensaron en construir su propia base de datos para resolver el problema.

Cuando se habla de construir una base de datos propia, se puede pensar en Oracle, MySQL, KDB, OneTick, NoSQL... son aplicaciones de nivel empresarial muy buenas, muy potentes tanto en función como en rendimiento.

Los inventores cuantifican la base de datos incorporada

DBExec es una interfaz de sistema de gestión de datos relacional, basada en SQLite, desarrollada por el inventor. Está escrita en C. Es de pequeño tamaño, consume pocos recursos y es muy rápida. Es ideal para los aficionados a la analítica cuantitativa financiera, ya que puede administrar datos localmente, ya que puede dividir diferentes pares de objetos (por ejemplo, intercambios, fuentes de datos, precios) en diferentes tablas y definir las relaciones entre ellas.

Además, el costo de aprendizaje del lenguaje SQLite es bajo, y la mayor parte del trabajo realizado en la base de datos se realiza con las declaraciones de SQLite.

Gramática básica

La sintaxis de SQLite no distingue entre letras grandes y pequeñas, aunque hay algunos comandos sensibles a las letras grandes, como GLOB y glob que representan diferentes significados. Las oraciones de SQLite pueden comenzar con cualquier palabra clave, como SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, etc., que indican: extraer datos, insertar datos, actualizar datos, eliminar datos, modificar una base de datos, eliminar una tabla de datos.

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

Una base de datos suele contener una o varias tablas, cada una con un logotipo de nombre. Hay que tener en cuenta que el sistema guarda tablas por separado: kvdb, cfg, log, profit, chart.img

Ejemplos de estrategias

Con la comprensión de la sintaxis básica de SQLite, aprovechamos el tiempo para utilizar una base de datos cuantificada por los inventores para crear un ejemplo de recopilación y uso de datos de Tick.

Paso 1: actualizar el administradorPrimero, asegúrese de que está usando la versión más reciente del administrador.https://www.fmz.com/m/add-nodeLa página se vuelve a descargar y desplegar.

Paso 2: Crear una estrategia

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

Paso 3: Implementar una estrategiaEn el caso de Windows, después de ejecutar la política, se genera una carpeta con el nombre de robot en el directorio de los administradores, que se abre con un archivo con el archivo de los inventores cuantificando la base de datos interna.imgEl código anterior primero crea una tabla de datos llamada tick tick, luego le agrega un campo de datos de tick, luego obtiene los datos de tick de la bolsa en el ciclo y los inserta en la tabla de tick tick, y salta del ciclo si se determina que hay más de 10 datos en la tabla. Finalmente, consulta, elimina y modifica los datos de la tabla con 5 comandos SQLite, respectivamente, y imprime en el registro, como se muestra en la siguiente imagen:img Paso 4: Crear una barra de estadoPor último, añadimos un poco de código para crear una barra de estado para la política, obteniendo datos de la base de datos cuantificados por los inventores, para mostrar los datos de una manera más intuitiva, el nuevo código es el siguiente:

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

El código anterior utiliza los datos de la base de datos para crear una tabla de filtros de datos de tick. Los campos de columns de tick en la base de datos representan los columns de tick en la barra de estado, y los campos de tick valores representan las columns de tick en la barra de estado.img

Código completo de la estrategia

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

Haga clic en el enlacehttps://www.fmz.com/strategy/388963El código de la política completa puede ser copiado.

Base de datos de memoria

Si los datos de la operación no se desean guardar permanentemente en disco, se pueden agregar antes de una declaración SQL:Los símbolos pueden ser manejados en la base de datos de memoria, y los datos pueden ser reinsertados cuando el robot se reinicie.

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

Resumen

Las bases de datos no solo pueden contener grandes cantidades de datos, sino también los sueños de muchos amantes de la cuantificación. Los ejemplos de este artículo no se limitan a los usos de las bases de datos.


Relacionados

Más.

- ¿ Qué pasa?Es genial. El único inconveniente es que los datos no se registran localmente, en disco real.

- ¿ Qué?La base de datos no admite la recuperación ¿verdad? El código pegado en el pasado regresa el error: ReferenceError: DBExec is not defined

Dios mío.Qué maravilloso.

Apoyo, puedes probar con la base de datos local

Gracias.