[TOC]

データは定量取引の源泉です。大量のデータをいかに効率的に管理するかが重要なポイントです。データベースは最適なソリューションの1つです。今日では、データベースの応用は、さまざまなデイトレード、高頻度取引の定量的標準構成となっています。その他の戦略。この記事では、データ テーブルの作成方法、データの保存方法、データの変更方法、データの削除方法、データの参照方法、実際の戦闘での適用方法など、Inventor Quantitative (FMZ.COM) の組み込みデータベースについて説明します。
Inventor Quantitative Platformに精通している人は、これまでは、再利用のためにデータをローカルに保存したい場合は_G()関数しか使用できなかったことを知っているはずです。戦略を停止するたびに、_G() 関数は必要な情報を自動的に保存します。しかし、より複雑な形式のデータを保存したい場合は、_G() 関数は明らかにあまり適用できないため、多くの人がこの問題を解決するために独自のデータベースを構築することを考えました。
自作データベースといえば、おそらく誰もが Oracle、MySQL、KDB、OneTick、NoSQL などを思い浮かべるでしょう。これらはすべて、非常に強力な機能とパフォーマンスを備えた優れたエンタープライズ レベルのアプリケーションです。しかし、いくつかの問題も抱えています。始めるのが難しい、設定が面倒、メンテナンスが面倒などです。個人の定量分析トレーダーにとって、これはハエを殺すために大砲を使うようなものです。たとえ始めたとしても、機能のごく一部だけを使用します。
次に、InventorQuantに組み込まれている軽量データベースを見てみましょう。DBExecは、InventorQuantに組み込まれているリレーショナルデータ管理システムインターフェースです。SQLiteをベースに開発され、C言語で書かれています。サイズが小さく、リソース消費が少ないだけでなく、処理速度が速く、異なる「オブジェクト」(取引所、データソース、価格など)を異なるテーブルに分割し、関係を定義できるため、金融定量分析愛好家がローカルでデータ管理を実装するのに非常に適しています。テーブルの間。さらに、ユーザーは個別にインストールして構成する必要はなく、DBExec() 関数を呼び出すだけで直接使用できます。
さらに、SQLite 言語の学習コストは非常に低く、データベースで実行される作業のほとんどは SQLite ステートメントによって実行されます。基本的な構文を理解していれば、ほとんどのニーズを満たすことができます。以下は SQLite の基本構文です。
SQLite 構文では大文字と小文字は区別されませんが、GLOB や glob など、意味が異なり大文字と小文字が区別されるコマンドもあります。 SQLite ステートメントは、SELECT、INSERT、UPDATE、DELETE、ALTER、DROP などの任意のキーワードで開始できます。これらのキーワードはそれぞれ、データの抽出、データの挿入、データの更新、データの削除、データベースの変更、データ テーブルの削除を意味します。すべての文はセミコロンで終わります。以下は、単純なデータベースの作成、追加、削除、変更、クエリ、およびその他の操作です。
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"));
}
データベースには通常、1 つ以上のテーブルが含まれます。各テーブルには名前があります。システム予約済みのテーブルは、kvdb、cfg、log、profit、chart であることに注意してください。つまり、テーブルを作成するときは、システム予約名を避ける必要があります。上記のコードを実行すると、次のように出力されます。

SQLite の基本的な構文がわかったので、InventorQuant の組み込みデータベースを使用して、Tick データを収集して使用する例を作成できます。
ステップ1: ホストを更新する まず、ホストの最新バージョンを使用していることを確認してください。以前にホストをダウンロードして使用したことがある場合は、まずそれを削除してから、再度ダウンロードして https://www.fmz.com/ に展開する必要があります。 m/add-node ページ。
ステップ2: 戦略を立てる
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);
}
ステップ3: 戦略を実行する
Windowsを例にとると、ポリシーを実行すると、ホストディレクトリの「\logs\storage」ディレクトリにロボット番号にちなんで名付けられたフォルダが生成されます。フォルダを開くと、「.db3」というサフィックスを持つファイルがあります。 」というファイルがあります。このファイルは発明者の定量化された組み込みデータベースのファイルです。次の図に示すように:
上記のコードは、まず「tick」という名前のデータテーブルを作成し、次にテーブルにtickデータフィールドを追加し、次にループで取引所からtickデータを取得し、このデータを「tick」データテーブルに挿入します。データテーブル内の値が 10 を超えると、ループが終了します。最後に、5 つの SQLite コマンドを使用して、データ テーブル内のデータを照会、削除、および変更します。次の図に示すように、ログに出力します。
ステップ4: ステータスバーを作成する
最後に、Inventor Quantitative Database からデータを取得して、より直感的にデータを表示することで、戦略のステータス バーを作成するコードを追加します。新しく追加されたコードは次のとおりです。
// 创建状态栏
let table = {
type: 'table',
title: '币安Tick数据',
cols: allDate.columns,
rows: allDate.values
}
LogStatus('`' + JSON.stringify(table) + '`');
上記のコードは、データベース内のデータを使用して「Binance Tick Data」テーブルを作成します。データベースの「列」フィールドはステータス バーの「行」を表し、「値」フィールドはステータス バーの「列」を表します。次の図に示すように:

/*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) + '`');
}
完全な戦略コードをコピーするには、このリンク https://www.fmz.com/strategy/388963 をクリックしてください。
データをディスクに永久に保存したくない場合は、:シンボルはメモリデータベースで操作でき、ロボットの再起動後にデータがリセットされます。
DBExec(":select 1,2,3");
データベースは膨大な量のデータだけでなく、多くの定量取引愛好家の定量的な夢も実現します。データベースの利用は、本記事の例に限りません。より詳しい利用方法については、SQLite チュートリアルや Inventor Quantitative が公開している一連の記事を参照してください。