日本国内仮想通貨取引所FTX Japan/FTX JP(エフティーエックスジャパン)の「Quant Zone(クオンツゾーン)」機能を使えば、自動売買プログラムを簡単に自作できるようになったとのことで色々試してみました。
ビットコインFXの他にも豊富なアルトコインFX、レバレッジトークン、シットコインインデックスなど質のいい遊園地のような取引所なんですけども、ここで自動売買が手軽にできるようになれば一獲千金のチャンスもあるなと…!
Quant Zoneルールがどのように機能するよう設計されているか、動かし方を追記しながら紹介します。
Quant Zone(クオンツゾーン)のルール
Quant Zoneは、ユーザーが簡単にトレード戦略を構築し、シェアできるFTX JP取引所のコンテンツの一つです。
FTX口座の証拠金を使って注文を指示するプログラムルールです。
ルールは、例えば「BTCが8000ドル以上になったら、レバレッジ2倍のBTCショートエントリーする」というようなことを可能にします。
また、「BTCが8000ドル以上で、そのインデックスに対するBTC-ERPのプレミアムが1以上の場合は、2BTC-ERPを売り、2BTCを買う」というような、より複雑なルールにも対応しているのでかなり自由度が高いです。
Quant Zone(クオンツゾーン)のコンテストなどもある
【開催終了】イベント期間(香港時間、UTC + 8)
ルールの構築と提出:2020年4月20日午後11時59~4月14日00:00
投票:2020年4月21日の00:00~4月22日午後11時59分
受賞者発表- 2020年4月23日
FTX賞 :
第1位-カスタマイズFTX HTC EXODUS 1台のスマートフォン
第2位- 200 FTT
第3位- 200 FTT
第4位- 200 FTT
詳細はFTX取引所にて。
Quant Zone(クオンツゾーン)の設定方法
クオンツ・ゾーン(Quant Zone)にアクセス
FTX JP取引所にログインしメインメニューのアイコンから「クオンツ・ゾーン(Quant Zone)」にアクセスします。
すると、初めに同意を求められるのでクリックしてください。
以下の画面になるので「新しいルールを作成する(CREATE NEW RULE)」をクリックしてください。
それぞれのルールには、「トリガー」と「アクション」の2つのセクションがあります。
トリガー(発動)
トリガー(発動)とは、ルールを起動させる条件設定です。FTX市場データ、アカウント、関数を参照する任意のコードを入力することができます。
例えば、以下の図のようにBTCが$9,000以上になったときにトリガーを設定したい場合、以下のように「price(“BTC-PERP”) > 9000」とトリガーを設定することができます。
より複雑な例として、BTC-PERPが9,000$以上になり、インデックスにプレミアムがあり、BTC-PREPでBTCが1分前は9,000$を下回っていた場合に取引がトリガーされるというルールを設定する場合は以下のようになります。
(price(“BTC-PERP”) > 9000) and (premium(“BTC-PERP”) > 1) and (position_net(“BTC-PERP”) == 0) and (price(“BTC-PERP”,1) < 9000)
アクション(実行)
アクション(実行)では、ルールがトリガーされたときに実行される命令を指定します。
例として、BTCが$9,000を超えた時レバレッジ3倍でBTC-PERPでロングする場合、以下のようになります。
必要に応じて、複数のアクションを組み合わせることができます。
トリガーを一度だけ発動させる(条件付け)
Quant Zoneルールは、15秒ごとにトリガーの条件が満たされているかチェックし、 満たされていればアクションを実行します。
つまり、ルールが有効になっている間、一時停止ルールを使用しない限り、トリガーの条件が満たされている限りアクションを実行し続けるので注意しましょう。
先ほど設定したトリガー「BTC-ERPが9,000$以上」とアクション「BTC-PERPの3倍ロング」を設定している場合、BTCが9,000$を超えている限り、証拠金が尽きるまで3倍ロングをし続けることに。
これを防ぐには、一時停止ルールのアクションを使用するか、トリガー条件が満たされないように操作が必要になります。
Pause Rule(一時停止ルール)
一時停止ルールを使用して、選択した一定期間スリープさせることができます。 この方法では、ルールがトリガーされた場合、2回目のトリガーを行うか猶予期間ができます。
Set Variable(変数)
「Set Variable(変数の設定)」アクションを使用すると、ある名前の変数に数値を代入し保存することができます。その後、get_variable(“name”)で参照することができます。
例えば、get_variable(“v1”) < 3 を指定し、アクションとして Set Variable, v1, 5 を追加した場合、他のルールで変更されない限り、トリガーは一度だけ作用することになります。
例えば、送信するたびに注文サイズを1増加させたい場合、アクションの1つを以下のようにすることで個数を指定して注文を送ることができます。
Set Variable; “v1”; get_variable(“v1”)+1
変数はルールをまたいで存在するので、あるルールで変数を設定し、別のルールで参照することもできます。
実行する(Save and Run)
Quant Zoneのルール設計が完了したら、「SAVE DRAFT」をクリックして保存もしくは、「SAVE AND RUN」で保存し、すぐにプログラムの実行を開始することもできます。
作成したプログラムのモニタリング機能
ルールページに、作成した全てのアクティブなルール(プログラム)が表示されます。この一覧ページから編集、無効化、有効化、コピー、削除ができます。
下部には、作成したルールでの注文履歴(ログ)も表示され正しく動いているかチェックすることが出来ます。
Quant Zone(クオンツゾーン)で使える関数と定義一覧
この一覧は2020年4月時点のものです。最新の情報は以下のルール作成ページの「?」マークをクリックして参照してください。
マーケットデータ
price(“marketName”) | 引数に市場名を取り、アセットの最終価格を返します。 例: price(‘BTC-PERP’)はBTC-PERPの価格を返します。 |
---|---|
price(“marketName”,1) | アセットの1分前の価格を返します。 例: price(“BTC-PERP”,1)はBTC-PREPの1分前の価格を返します。 |
price(“marketName”, n) | アセットの「N」分前の価格を返します。 例: price(“ETH/USD”, 7)は7分前のETH/USDの価格を返します。 |
bid_price(“marketName”) | アセットの最高入札価格を返します。 例: bid_price(“ETH-PERP”)はETH/USDの最高入札価格を返します。 |
offer_price(“marketName”) | アセットの最高オファー価格を返します。 例: offer_price(“XRP-PERP”)はXRP-PERPの最高オファー価格を返します。 |
last_trade_price(“marketName”) | アセットの最後の取引価格を返します。 例: last_trade_price(“LINKBULL/USD”)その資産の最後に行われた取引価格を返します。 |
index_price(“marketName”) | その資産のインデックス価格を返します。 例: index_price(“EOS-PERP”)はEOS-PERPのインデックス価格を返します。 |
index_price(“marketName”, n) | その資産の「n」分前のインデックス価格を返します。 例: index_price(“LINK-PERP”, 33)はLINK-PERPの33分前のインデックス価格を返します。 |
premium(“marketName”) | アセットの先物プレミアム(マーク価格をインデックス価格で割ったもの)を返します。 例: premium(“ETH-PERP”)はETH-PERPのプレミアムを返します。 |
アカウントデータ
ウォレットからデータを取り出す際に使用する機能です。
collateral | ウォレットの米ドル建ての担保総額を返します。 例: collateral>500 このルールは、ウォレットの担保の総額が500ドルを超える場合に発動します。 |
---|---|
free_collateral | ウォレットの米ドル建ての担保不要の金額を返します。 例: free_collateral>500 このルールは、ウォレットの担保不要の金額が500ドルを超えた場合に発動します。 |
total_position_size | すべての先物の合計口座のポジションサイズ(米ドル)を返します。 例: total_position_size<2*total_collateral このルールは、合計ポジションが口座の担保の2倍を下回る場合に発動します。 |
margin_fraction | 口座証拠金率、つまり口座の総ポジションサイズと担保の比率を返します。 例: margin_fraction>1 |
open_margin_fraction | 未決済の注文を含む証拠金率を返します。 例 open_margin_fraction>1 |
leverage | 講座の担保と合計ポジションサイズのレートであるおおまかな口座のレバレッジ倍率を返します。 例: leverage<10 このルールはレバレッジが10倍を下回る場合発動します。 |
initial_mfr: | 初期証拠金要件を返します。 |
Maintenance_mfr: | 口座維持証拠金率要件を返します。 |
Liquidation_distance: | あなたのアカウントがどれほど清算に近いかのおおよその状態を返します。 |
ポジションデータ
position(“marketName”) | アセットポジションのサイズを返します。正の値または0を返します。 例: position(“BTC-PERP”)はBTC建でBTC-PERPのポジションのサイズを返します。 |
---|---|
position(“marketName”, “buy”) | ロングの場合、アセットポジションのサイズを返します。ショートの場合は0を返します。 例: position(“ALGO-PERP”. “buy”)はALGO-PERPロングのサイズを返します。 |
position(“marketName”,”sell”) | ショートの場合、アセットポジションのサイズを返します。ロングの場合は0を返します。 例: position(“BSV-PERP”,”sell”)BSV-PERPショートのサイズを返します。 |
position_side(“marketName”) | ポジションがロングの場合は1を、ショートの場合は-1を、どちらでもない場合は0を返します。 例: position_side(“ETH-PERP”)ETH-PERPロングを持っている場合、1を返します。 |
position_net(“marketName”) | ポジションのネットサイズを返します。 ロングの場合は正、ショートの場合は負となります。 例: position_net(“BTC-PERP”)はBTC-PERPのネットサイズを返します。 |
position_leverage(“marketName”) | ポジションのおおよそのレバレッジを返します。 例: position_leverage(“EOS-PERP”)はEOS-PERPポジションのおおまかなレバレッジを返します。 |
position_notional(“marketName”) | リスクのために米ドルでのポジションの想定元本を返します。 例: position_notional(“ALT-PERP”) はALT-PERPポジションの想定元本を返します。 |
ウォレットデータ
balance(“coinName”) | アセットの名前を取得し、ウォレットの中のそのアセットの合計残高を返します。 例: balance(‘BTC’)はウォレットのBTCの残高を返します。 |
---|---|
balance_free(‘coinName’) | アセットの名前を取得し、ウォレットの中のそのアセットの利用可能(未使用)残高を返します。 例: balance_free(‘ETH’)はウォレット内の利用可能なETHの合計額を返します。 |
数学関数
abs(x) | 数値を引数にとり、その絶対値を返します。 例: abs(-2)の場合、2が返されます。 |
---|---|
max(x,y) | 2つの数字は引数にとり、xとyの大きい方を返します。 例 max(3.2, 10)の場合、10が返されます。 |
min(x,y) | 2つの数字は引数にとり、xとyの小さい方を返します。 例 min(1, 5)の場合、1が返されます。 |
sqrt(x) | 正の数を取得し、その平方根を返します。 例: sqrt(25)は5を返します。 |
floor(x) | 数値を引数にとり、x以下の最大の整数を返します。 例: floor(2.5) は2を返します。 |
ceil(x): | 数値を引数にとり、x以上の最小の整数を返します。 例: ceil(2.5)は3を返します。 |
sign(x): | 数値を引数にとり、正の場合は1、負の場合は0を返します。 例: sign(10)は1を返し、sign(-5)は0を返します。 |
その他の関数
get_variable(‘name’): | 引数に変数名を取り、この変数に格納されている値を返します。 myVariableという変数に10を格納したとします。その場合、get_variable(‘myVariable’)は10を返します。 |
---|---|
perpetual(‘coin’): | 引数にコインの名前を取り、このコインに関連のある無期限先物市場の名前を返します。 例: perpetual(‘ETH’)はETH-PERPを返すので、price(perpetual(‘ETH’))はETH-PERPの価格を返します。 |
quarterly(‘coin’): | 引数にコインの名前を取り、このコインに関連する現在の四半期先物市場の名前を返します。 例: quarterly(‘ETH’)はETH-0626を返すので、price(quarterly(‘ETH’))はETH-0626の価格を返します。 |
time: | 現在のUNIX時間を返します。 |
minute: | 現在の時刻の分だけを返します。 |
hour: | 現在の世界標準時の時間だけを返します。 |
Quant Zone(クオンツゾーン)を使う注意事項
ルールは15秒に1回しかサイクルしない
ルールはFTXサーバーで動いていますが、15秒に1回しかサイクルしません。
なので、それよりも短い売買アクションを必要とする戦略(例えばスキャルピングなど)には適していないことになります。スイングボットが主ですね。
15秒内で起こったことは感知できない
例えば、一瞬だけ上髭が出てトリガー価格を上回ったとしても、それが15秒のサイクルに触れない一瞬であった場合、検知できません。ヒゲキャッチBOTは工夫が必要かも。
インジケーターを使った戦略は未対応
移動平均線のデッドクロスで売る、などインジケーターを使ったストラテジーの構築はできないようです。(もしかしたら裏技的にできるのかもしれないが)
そういう意味では自由度はそこまでないかなあという印象。
意図しない遅延は充分起こり得る
極端な取引量であったり、インターネットやプロバイダーの遅延などにより、ルールがトリガーされず、実行されない可能性は常にあります。
優秀なプラットフォームですが、FTXJP取引所の技術的なことで遅延が発生する可能性もあります。
FTX JPのQuant Zone(クオンツゾーン)まとめ
FTX JP取引所のQuant Zone(クオンツゾーン)で自動売買BOTプログラムを作る方法を解説してみました。
ビットコインFXの自動売買BOTを作ったことがない人でも、比較的簡単に自作できるようになると思います。
FTXが用意してくれた優れたプラットフォームを利用してBOT作りに挑戦してみてはいかがでしょうか。
Bybitにも似たような簡易BOT作成機能があります。
また、Quant Zoneを利用した高性能なBOTを販売する人も現われるかもしれません。FTX JP取引所のQuant Zoneで自作した経験があれば、陳腐なBOTに騙されることを防げますし、また本当に実力のあるBOTと出逢うことができるかもしれません。
トレードに可能性を感じますね!
コメント欄