Utiliser SQLite pour construire une base de données quantique FMZ

Auteur:Je suis désolée., Créé à: 2022-04-24 11:32:35, Mis à jour à: 2022-04-24 16:21:38

Utiliser SQLite pour construire une base de données quantique FMZ [TOC] Je vous en prie.

Résumé

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.

Comment choisir une base de données

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.

Base de données intégrée FMZ Quant

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 objets (tels que les plateformes, les sources de données, les prix) en différents tableaux, et définir les relations entre les tableaux. En outre, les utilisateurs n'ont pas besoin de l'installer et de le configurer séparément; tant qu'ils appellent la fonction DBExec (((), il peut être utilisé directement!

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.

Syntaxe de base

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:img

Exemple de stratégie

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 \logs\storage du répertoire docker; ouvrez le dossier, et il y aura un fichier avec .db3 comme suffixe; ce fichier est le fichier de la base de données intégrée FMZ Quant. Comme indiqué dans la figure suivante:img

Le code ci-dessus crée d'abord une table de données nommée tick, puis ajoute le champ de données de tick à la table, puis obtient les données de tick de la plate-forme dans la boucle, et insère ces données dans la table de données tick, et en même temps Si la quantité de données dans la table de données dépasse 10, elle saute de la boucle. Enfin, utilisez cinq commandes SQLite pour interroger, supprimer et modifier les données dans la table de données. Et imprimez-le dans le journal, comme indiqué dans l'image suivante:img

É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 Binance Tick Data à partir des données de la base de données. Le champ colonnes dans la base de données représente la ligne horizontale dans la barre d'état, et le champ values représente la ligne verticale dans la barre d'état. Comme indiqué ci-dessous:img

Le code source complet de la stratégie

/*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.

Base de données en mémoire

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

Conclusion

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.


Plus de