Utilice SQLite para construir la base de datos cuántica FMZ [TOC] ¿Qué quieres decir?
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.
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.
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
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.
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.
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
El código anterior primero crea una tabla de datos llamada
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
/*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.
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");
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.