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.
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.
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.
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.
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.cn/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.El 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: 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.
/*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.
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.
/*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¿Hay alguna versión en Python?
Los inventores cuantifican - sueños pequeñosLa misma forma en que se llama a las funciones de Python.