Utiliser SQLite pour construire une base de données quantique FMZ [TOC] Je vous en prie.
Les données sont la source du trading quantitatif. Il est très important de gérer efficacement une grande quantité de données. La base de données est l'une des meilleures solutions. De nos jours, l'application de la base de données est devenue la configuration quantitative standard de diverses stratégies de day trading, de trading à haute fréquence et autres. Dans cet article, nous étudierons la base de données intégrée de FMZ Quant (FMZ.COM), y compris: comment créer des tableaux de données, enregistrer des données, modifier des données, supprimer des données et des données de référence, ainsi que comment les utiliser dans la pratique.
Ceux qui connaissent la plateforme de trading quantique FMZ devraient savoir qu'avant cela, si vous souhaitez enregistrer des données sur local pour une réutilisation, vous ne pouvez utiliser que la fonction _G(). Chaque fois que vous arrêtez la stratégie, la fonction _G() enregistrera automatiquement les informations requises. Mais si vous souhaitez enregistrer des données formatées de plus en plus complexes, la fonction _G( n'est évidemment pas appropriée, de sorte que beaucoup de gens pensent à créer leur propre base de données pour résoudre le problème.
Quand il s'agit de bases de données auto-construites, tout le monde peut penser à Oracle, MySQL, KDB, OneTick, NoSQL... Ce sont toutes d'excellentes applications au niveau de l'entreprise, à la fois en termes de fonctionnalité et de performance. Mais il y a aussi quelques problèmes: il est difficile de démarrer, et la configuration et la maintenance sont difficiles. Pour les investisseurs de détail dans le trading quantitatif, c'est un peu comme casser une mouche sur la roue. Même si vous commencez déjà avec ces applications, seules quelques fonctions d'entre elles seront utilisées.
DBExec est une interface de système de gestion de données relationnelle intégrée à FMZ Quant. Il est développé sur la base de SQLite et écrit en C. Il est non seulement de petite taille, peu occupant les ressources, mais a également une vitesse de traitement très rapide. Il est très approprié pour les amateurs d'analyse quantitative financière pour implémenter la gestion de données localement, car il peut diviser différents
En outre, le coût d'apprentissage du langage SQLite est très faible, et la plupart du travail effectué sur la base de données est effectué par des instructions SQLite. La plupart des besoins peuvent être satisfaits en se familiarisant avec la syntaxe de base. Voici la syntaxe de base de SQLite.
La syntaxe de SQLite est insensible aux petites et moyennes lettres, mais certaines commandes sont sensibles aux petites et moyennes lettres, comme GLOB et glob, qui ont des significations différentes. Les instructions SQLite peuvent commencer par n'importe quel mot clé, comme SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, etc., qui signifient respectivement: extraire des données, insérer des données, mettre à jour des données, supprimer des données, modifier une base de données et supprimer une table de données. Toutes les instructions se terminent par un point-virgule.
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"));
}
Une base de données contient généralement une ou plusieurs tables, chaque table a une identification de nom, il convient de noter que les tables réservées au système sont: kvdb, cfg, log, profit, graphique. C'est-à-dire que lors de la création de tables, vous devez éviter les noms réservés au système. Exécutons le code ci-dessus, qui exporte ce qui suit:
Après avoir connu la syntaxe de base de SQLite, frappons pendant que le fer est chaud; utilisez la base de données intégrée quantitative FMZ Quant pour créer une instance de collecte et d'utilisation des données Tick.
Étape 1: mettre à jour le dockerTout d'abord, assurez-vous d'utiliser la dernière version d'un docker. Si vous avez déjà téléchargé et utilisé un docker, vous devez d'abord le supprimer, puis le télécharger et le déployer à nouveau sur la page (https://www.fmz.com/m/add-node).
Étape 2: créer une stratégie
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);
}
Étape 3: mise en œuvre de la stratégiePrenez Windows comme exemple. Après avoir exécuté la stratégie, un dossier nommé avec l'ID de bot sera généré dans le dictionnaire
Le code ci-dessus crée d'abord une table de données nommée
Étape 4: créer la barre d'étatEnfin, nous ajoutons quelques morceaux de code pour créer une barre d'état pour la stratégie en obtenant les données dans la base de données FMZ Quant pour afficher les données de manière plus intuitive.
// create a status bar
let table = {
type: 'table',
title: 'Binance Tick data',
cols: allDate.columns,
rows: allDate.values
}
LogStatus('`' + JSON.stringify(table) + '`');
Le code ci-dessus crée une table
/*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) + '`');
}
Cliquez sur le lien:https://www.fmz.com/strategy/265906, et vous pouvez copier le code source complet.
Si les données exploitées ne veulent pas être sauvegardées en permanence sur le disque, vous pouvez ajouter le:
symbole avant l'instruction SQL pour fonctionner dans la base de données en mémoire, et les données seront réinitialisées après le redémarrage du bot.
DBExec(":select 1,2,3");
La base de données peut non seulement contenir des données massives, mais aussi les rêves de nombreux amateurs de trading quantitatif. L'utilisation de la base de données n'est en aucun cas limitée aux exemples mentionnés dans l'article. Pour plus de méthodes d'utilisation, vous pouvez vous référer au tutoriel SQLite et à la série d'articles qui seront publiés sur FMZ Quant plus tard.