SQLite で FMZ の量的なデータベースを構築する

作者: リン・ハーンリディア作成日:2022年9月20日 11:40:34 更新日:2023年9月20日 10:55:14

img

抽象

データベースは最高のソリューションの1つであり,現在,データベースの適用は,すべての種類の日々の取引,高周波取引および他の戦略のための定量標準です. この記事では,FMZ Quantの組み込みデータベースを研究します (https://www.fmz.com資料の作成,保存,変更,削除,参照データ,そしてそれを実践に適用する方法を含む.

データベースを選択する方法

FMZ Quant プラットフォームに精通している人は,ローカル再利用のためにデータを保存する前に,戦略を停止するたびに自動的に必要な情報を保存する _G() 機能のみを使用できることを知っておくべきです. しかし,より複雑なフォーマットされたデータを保存したい場合は, _G() 機能は明らかに適用が不十分です. そのため,多くの人はこの問題を解決するために独自のデータベースを構築することを心に決めました.

自己構築データベースに関しては,Oracle,MySQL,KDB,OneTick,NoSQLを考える必要があります. これらは機能とパフォーマンスの両方で非常に優れたエンタープライズレベルのアプリケーションです. しかし,いくつかの問題もあります: 開始は困難で,構成は面倒で,保守は困難です. 小規模な定量トレーダーにとって,それは砲でハエを撃つようなものです. 始めても,機能の一部しか使用しません.

FMZ Quant の組み込みデータベース

次に,FMZ Quantによって構築されたライトデータベースを見てみましょう. DBExecは,FMZ Quantの内蔵関係データ管理システムインターフェイスです.SQLiteをベースに開発され,Cで書かれています. サイズが小さく,リソース消費が少なく,処理も速いだけでなく,金融定量分析愛好家にとってデータ管理をローカルに実装するのに非常に適しています. 異なるオブジェクト (交換,データソース,価格など) を異なるテーブルに分割し,テーブル間の関係を定義することができます. さらに,ユーザーはそれらを別々にインストールして設定する必要はありません. DBExec) 関数を呼び出して直接使用できます!

さらに,SQLite言語を学ぶことは非常に簡単で,データベース上の作業の大半はSQLite文言によって完了する.基本的な文法を知っていれば,ほとんどの要件を満たすことができます.以下はSQLiteの基本的な文法です.

基本文法

SQLite の文法では小数字感がなく,GLOB や glob のような小数字感のあるコマンドがいくつかあり,それぞれ異なる意味を表す.SQLite のステートメントは,SELECT,INSERT,UPDATE,DELETE,ALTER,DROP など,任意のキーワードで開始できる.これは:データを取り出す,データ挿入,データ更新,データ削除,データベースを変更,データテーブルを削除する.すべてのステートメントは英語の半角点で終了する.以下は簡単なデータベース作成,追加,削除,変更,チェック操作です.

function main() {
    // Create: If the "users" table does not exist, create one, "id" is an integer and is incremented automatically, "name" is in text form and is not empty
    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('Zhang San')"));
    Log(DBExec("INSERT INTO users(name) values('Li Si')"));
    
    // Delete:
    Log(DBExec("DELETE FROM users WHERE id=1;"));
    
    // Modify:
    Log(DBExec("UPDATE users SET name='Wang Wu' WHERE id=2"));
    
    // Search:
    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"));
}

データベースは通常,1つ以上のテーブルを含んでおり,各テーブルは名前で識別されます. システム予約されたテーブルは: kvdb, cfg, log, profit, chart です. つまり,テーブルを作成するときに,システム予約された名前を避けるべきです. 上記のコードを実行して次の出力します:

img

戦略の例

SQLiteの基本的な文法を知って 鉄が熱い間に打つことで FMZ Quantの組み込みデータベースを使って Tickデータを収集して利用する インスタンスを作成します

ステップ1: ドーカーを更新する

先ず,Docker の最新バージョンを使用していることを確認してください.Docker をダウンロードして使用した場合は,まず削除し,その後,Docker をダウンロードして再展開します.https://www.fmz.com/m/add-node page.

ステップ2 戦略を策定する

function main() {
    // Subscribe contracts
    _C(exchange.SetContractType, 'swap');
    
    // Create 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);'
    ));
    
    // Get 10 pieces of tick data
    while (true) {
        let tick = exchange.GetTicker();
        // Add data to 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})`);
        // Search all data
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }
    
    // Search all data
    Log(DBExec('select * from tick'));
    
    // Search the first data
    Log(DBExec('select * from tick limit 1'));
    
    // Search first two pieces of 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'));
    
    // Search all data
    let allDate = DBExec('select * from tick')
    Log(allDate);
}

ステップ3: 戦略を実行する

Windows を例に挙げると,戦略を実行した後,ドッカーディレクトリの \logs\storage ディレクトリにロボット番号の名前でフォルダが作成されます. フォルダを開くと, FMZ Quant 内蔵データベースのファイルである後尾. db3 のファイルがあります. 次の図のように:

img

上記のコードは,まず"tick"というデータテーブルを作成し,次に"tick"のデータフィールドをテーブルに追加し,ループ内の交換から"tick"のデータを取得し,データテーブルに挿入します.同時に,データテーブル内のデータ量が10を超えると判断し,ループから飛び出します.最後に,それぞれデータテーブル内のデータを検索,削除,修正するために5つのSQLiteコマンドを使用します.そして,次の図のようにログにプリントします.

img

ステップ4: 状態バーを作成

FMZ Quant データベースからデータを取得して,データをより視覚的に表示します. 追加コードは次のように表示されます.

    // Create status bar
    let table = {
        type: 'table',
        title: 'Binance Tick data',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');

上記のコードは,データベース内のデータを介してBinance Tick dataテーブルを作成します.データベース内のkolumnsフィールドは,ステータスバーのrowを表し,valuesフィールドはステータスバーのcolumnsを表します.以下の図のように:

img

完全な戦略コード

/*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;'));
    // Subscribe contracts
    _C(exchange.SetContractType, 'swap');

    // Create 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 pieces of tick data
    while (true) {
        let tick = exchange.GetTicker();
        // Add data to 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})`);
        // Search all data
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }

    // Search all data
    Log(DBExec('select * from tick'));

    // Search the first data
    Log(DBExec('select * from tick limit 1'));

    // Search first two pieces of 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'));

    // Search all data
    let allDate = DBExec('select * from tick')
    Log(allDate);

    // Create status bar
    let table = {
        type: 'table',
        title: 'Binance Tick data',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

このリンクをクリックします.https://www.fmz.com/strategy/388963完全な戦略コードをコピーします.

メモリデータベース

データを永久にディスクに保存したくない場合は SQL 命令の前に : 符号を追加してメモリ データベースで動作し ロボットを再起動するとデータがリセットされます

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

概要

データベースは膨大なデータを運ぶだけでなく,多くの定量取引の愛好家の夢も運ぶことができます.データベースの使用は,この記事の例に限ったものではありません.より多くの使用方法については,SQLiteチュートリアルとFMZ Quantのフォローアップ記事を参照してください.


関連性

もっと