Les ressources ont été chargées... Je charge...

Construire une base de données quantifiée d'inventeurs avec SQLite

Auteur: , Créé: 2021-03-26 17:09:32, Mis à jour: 2023-09-24 19:36:26

[TOC] Je vous en prie.

img

Résumé

Les données sont la source de la quantification des transactions, et la gestion efficace de grandes quantités de données est un élément clé. Les bases de données sont l'une des meilleures solutions. Aujourd'hui, les applications des bases de données sont déjà la configuration standard de la quantification de toutes sortes de stratégies telles que les transactions quotidiennes, les transactions haute fréquence.FMZ.COMLa base de données intégrée comprend: comment créer des tableaux de données, stocker des données, modifier des données, supprimer des données, référencer des données et comment les appliquer en temps réel.

Comment choisir une base de données

Les inventeurs familiers avec les plates-formes de quantification devraient savoir qu'auparavant, pour sauvegarder les données en répétition locale, il était possible d'utiliser uniquement la fonction _G(), qui sauvegarde automatiquement les informations requises chaque fois que la politique est arrêtée. Mais si vous souhaitez stocker des données de formatage plus complexes, la fonction _G() n'est évidemment pas très pratique, de sorte que beaucoup de gens ont pensé à créer leur propre base de données pour résoudre le problème.

En ce qui concerne la création de votre propre base de données, vous pouvez penser à Oracle, MySQL, KDB, OneTick, NoSQL... Ce sont des applications de niveau entreprise très performantes, puissantes en termes de fonctionnalités et de performances.

Les inventeurs quantifient la base de données intégrée

DBExec est une interface de gestion de données relationnelle basée sur SQLite, elle-même écrite en C. Non seulement elle est de petite taille, utilise peu de ressources et est rapide, mais elle est parfaite pour les amateurs d'analyse quantitative financière pour gérer les données localement, car elle permet de diviser les différents blocs d'objets (par exemple, les échanges, les sources de données, les prix) en différentes tables et de définir les relations entre les tables.

En outre, le coût d'apprentissage de SQLite est faible, et la plupart des tâches effectuées sur la base de données sont effectuées par des déclarations SQLite.

Grammaire de base

La syntaxe de SQLite est indistincte en termes de taille, mais certaines commandes sont sensibles à la taille, telles que GLOB et globe. Les statements SQLite peuvent commencer par n'importe quel mot-clé, tels que SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, etc. Ils indiquent 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, supprimer une table de données.

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

Une base de données contient généralement une ou plusieurs tables, chacune d'entre elles ayant un identifiant de nom. Il est important de noter que le système conserve les tables: kvdb, cfg, log, profit, chart.img

Exemples stratégiques

En apprenant la syntaxe de base de SQLite, nous avons profité de l'occasion pour créer une instance de collecte et d'utilisation des données de Tick en utilisant la base de données de quantification intégrée par l'inventeur.

Première étape: Mettre à jour l'administrateurTout d'abord, assurez-vous que vous utilisez la dernière version de l'hôte, si vous avez déjà téléchargé un hôte, vous devez le supprimer et le télécharger.https://www.fmz.com/m/add-nodeLa page a été redonnée et déployée.

Deuxième étape: créer une stratégie

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

Troisième étape: mettre en œuvre une stratégieDans le cas de Windows, après avoir exécuté la stratégie, un dossier nommé par le numéro du robot est généré dans le dossier de l'administrateur, dans le répertoire de l'architecture.imgLe code ci-dessus crée d'abord une table de données nommée "tick tick", puis ajoute des champs de données tick à cette table, puis récupère les données tick de l'échange dans le cycle et les insère dans la table de données tick tick, tout en sautant du cycle si la quantité de données de cette table est supérieure à 10. Enfin, les données de la table de données sont recherchées, supprimées ou modifiées par 5 commandes SQLite respectivement. Et imprimées dans le journal, comme le montre la figure suivante:img Étape 4: créer une barre d'étatEnfin, nous avons ajouté un peu de code pour créer une barre d'état pour la stratégie, en obtenant des données de la base de données quantifiées par l'inventeur, pour présenter les données de manière plus intuitive.

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

Le code ci-dessus utilise les données de la base de données pour créer une feuille de calcul de données CoinTick. Les champs de feuille de calcul des colonnes de feuille de calcul de la base de données représentent les barres de feuille de calcul de la barre d'état, et les champs de feuille de calcul des valeurs représentent les colonnes de feuille de calcul de la barre d'état.img

Le code 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;'));
    // 订阅合约
    _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) + '`');
}

Cliquez sur ce lienhttps://www.fmz.com/strategy/388963Il est possible de copier l'intégralité du code de la stratégie.

Base de données en mémoire

Si les données de l'opération ne sont pas souhaitées en permanence sur le disque, elles peuvent être ajoutées avant les statements SQL:Les symboles peuvent être utilisés dans une base de données en mémoire, et les données peuvent être réinitialisées après le redémarrage du robot.

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

Résumé

Les bases de données peuvent contenir non seulement des volumes énormes de données, mais aussi les rêves de nombreux amateurs de transactions quantitatives. Les utilisations des bases de données ne sont pas limitées aux exemples de cet article. Pour plus d'informations, vous pouvez consulter le tutoriel SQLite et la série d'articles publiés par les inventeurs de la quantification.


Relationnée

Plus de

Je vous en prie.C'est génial. Le seul inconvénient est que les données ne peuvent pas être enregistrées localement, sur le disque.

- Je ne sais pas.La base de données ne prend pas en charge l'exécution, n'est-ce pas?

Dieu merci.C'est très bien.

Vous pouvez essayer la base de données locale.

Merci beaucoup.