データベースは最高のソリューションの1つであり,現在,データベースの適用は,すべての種類の日々の取引,高周波取引および他の戦略のための定量標準です. この記事では,FMZ Quantの組み込みデータベースを研究します (https://www.fmz.com資料の作成,保存,変更,削除,参照データ,そしてそれを実践に適用する方法を含む.
FMZ Quant プラットフォームに精通している人は,ローカル再利用のためにデータを保存する前に,戦略を停止するたびに自動的に必要な情報を保存する _G() 機能のみを使用できることを知っておくべきです. しかし,より複雑なフォーマットされたデータを保存したい場合は, _G() 機能は明らかに適用が不十分です. そのため,多くの人はこの問題を解決するために独自のデータベースを構築することを心に決めました.
自己構築データベースに関しては,Oracle,MySQL,KDB,OneTick,NoSQLを考える必要があります. これらは機能とパフォーマンスの両方で非常に優れたエンタープライズレベルのアプリケーションです. しかし,いくつかの問題もあります: 開始は困難で,構成は面倒で,保守は困難です. 小規模な定量トレーダーにとって,それは砲でハエを撃つようなものです. 始めても,機能の一部しか使用しません.
次に,FMZ Quantによって構築されたライトデータベースを見てみましょう. DBExecは,FMZ Quantの内蔵関係データ管理システムインターフェイスです.SQLiteをベースに開発され,Cで書かれています. サイズが小さく,リソース消費が少なく,処理も速いだけでなく,金融定量分析愛好家にとってデータ管理をローカルに実装するのに非常に適しています. 異なる
さらに,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 です. つまり,テーブルを作成するときに,システム予約された名前を避けるべきです. 上記のコードを実行して次の出力します:
SQLiteの基本的な文法を知って 鉄が熱い間に打つことで FMZ Quantの組み込みデータベースを使って Tickデータを収集して利用する インスタンスを作成します
先ず,Docker の最新バージョンを使用していることを確認してください.Docker をダウンロードして使用した場合は,まず削除し,その後,Docker をダウンロードして再展開します.https://www.fmz.com/m/add-node page.
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);
}
Windows を例に挙げると,戦略を実行した後,ドッカーディレクトリの
上記のコードは,まず"tick"というデータテーブルを作成し,次に"tick"のデータフィールドをテーブルに追加し,ループ内の交換から"tick"のデータを取得し,データテーブルに挿入します.同時に,データテーブル内のデータ量が10を超えると判断し,ループから飛び出します.最後に,それぞれデータテーブル内のデータを検索,削除,修正するために5つのSQLiteコマンドを使用します.そして,次の図のようにログにプリントします.
FMZ Quant データベースからデータを取得して,データをより視覚的に表示します. 追加コードは次のように表示されます.
// Create status bar
let table = {
type: 'table',
title: 'Binance Tick data',
cols: allDate.columns,
rows: allDate.values
}
LogStatus('`' + JSON.stringify(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;'));
// 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のフォローアップ記事を参照してください.