エンジニアの頭の中

トレードbotエンジニアが書く技術と投資のブログ

【BitMEX】REST APIでPost-Only注文を行う方法

f:id:mitsu3204:20180910024229j:plain

BitMEXで発注時にTakerになって手数料を徴収されることを防ぐため、APIからPost-Onlyオプションを指定して注文を実行する方法について説明します。

目次
  • BitMEXのMaker手数料とTaker手数料
    • Maker手数料
    • Taker手数料
    • 具体例
    • 意図せずTakerになってしまう場合がある
  • Takerになることを防ぐためのPost-Only
    • Web画面のPost-Onlyオプション指定方法
    • APIのPost-Onlyオプション指定方法

BitMEXのMaker手数料とTaker手数料

BitMEXは約定時に手数料が発生しますが、Maker手数料とTaker手数料というものがあります。

Post-Onlyを使う動機は、Maker手数料を手に入れること&Taker手数料の支払いを避けることだと思うので、まずMaker手数料とTaker手数料について説明します。

Maker手数料

Makerとは、板(オーダーブック)に注文を並べる人のことを指します。発注後にすぐに約定せずに板の注文価格と量が表示されているのがMakerです。

f:id:mitsu3204:20180906185228p:plain

指値で注文を行う場合、通常は注文金額と量が板に乗っかりその注文はMakerとして扱われます。

このMakerとしての注文が約定すると、BitMEXではMaker手数料として-0.025%が発生するのですが、手数料率がマイナスなので取引額の0.025%分を頂くことができます

例えば、10,000 USD分のビットコインをMaker注文で購入した場合であれば、Maker手数料として10,000 USDの0.025%にあたる2.5 USD相当のビットコインがもらえるというわけです。

Makerが、手数料を支払うのではなく貰える理由は、Makerが市場に流動性を提供しているからです。Makerの注文があることによって、市場の参加者は購入や売却ができるため、Makerは価値を提供しているわけです。その価値に対する報酬としてMaker手数料がもらえるという仕組みです。

Taker手数料

Takerとは、発注後に板に乗らずに即座に約定する注文のことです。TakerはMakerの出した板上の注文を消化します。

成行注文や、既に板に並んでいる価格を指定した指値注文が、Takerに該当します。

Takerの場合、約定した際には取引額の0.075%がTaker手数料として徴収されます(支払う)。

Takerは、Makerの提供した流動性を享受しているため、その価値に対して手数料を支払っているというわけです。

具体例

具体的なMaker、Takerの例として、板の状態と指値の価格を見てみましょう。

f:id:mitsu3204:20180906185228p:plain

上記の板の場合、best bid と best askが6358.0 USDと6358.5 USDなので、買い注文、売り注文の際の指値とMaker、Takerの関係は以下の表の通りとなります。

- 6358.0 以下 6358.5 以上
買い注文 Maker Taker
売り注文 Taker Maker
意図せずTakerになってしまう場合がある

相場は常に動いているため、一瞬で板の状況が変わる可能性があります。

Makerを狙って指値で注文した場合でも、次の瞬間には自分が指定した指値の価格に対応する反対方向の注文(買い、売りのこと)が発生していて、注文と同時にすぐに約定して、意図せずTakerとなってしまう場合があります

例えば先ほどの板の場合であれば、Makerになるつもりで6358.0の価格で買い注文を発行したけど、注文が受け付けられるまでの一瞬や数秒の間に、板の状況が変わり6358.0が最も安い売り注文として板に並んでしまった場合です。

この場合、Maker手数料を手に入れるつもりで出した指値注文が、Takerになったことによって逆に手数料を徴収されてしまうということになります。

ある程度の大きさの値幅を狙って売買をしている場合、Taker手数料を徴収されても大して気にすることはないと思いますが、小さな値幅を狙って高頻度で取引している場合や、Maker手数料をもらうこと自体を目的とした取引の場合は、この不意にTakerになってしまうことが無視できない痛手になる可能性があります。

Takerになることを防ぐためのPost-Only

発注時にPost-Onlyオプションを指定することによって、上記のように意図せずTakerになってしまうことを防ぐことができます。

このオプションを指定して注文を実行すると、Takerになってしまう場合は、自動で注文がキャンセルされるのです。

Web画面のPost-Onlyオプション指定方法

Web画面上でPost-Onlyオプションを指定して注文を行うには、以下の赤枠で囲ったチェックボックスをチェック状態にすることで、該当のオプションを指定することができます。

f:id:mitsu3204:20180906181413p:plain

APIのPost-Onlyオプション指定方法

APIから注文を行う際にPost-Onlyオプションを指定するには、以下のパラメータを指定することによって、Post-Onlyオプションが有効になります。

パラメータ名
execInst ParticipateDoNotInitiate

BitMEXのAPIの公式ドキュメント(英語)には記載されています。

f:id:mitsu3204:20180906193017p:plain

ソースコードは、Pythonでccxtを使っていれば以下のようになります。

import ccxt

bitmex = ccxt.bitmex({
    'apiKey': 'APIキー',
    'secret': 'APIシークレット'
})

bitmex.create_order(symbol='BTC/USD',
             type='limit',
             side='<Buy または Sell>',
             amount= <注文量>,
             price = <注文単価>,
             params = {'execInst': 'ParticipateDoNotInitiate'})

orderメソッドの引数であるparamsに、辞書型でパラメータを指定できるので、上記のパラメータを文字列で指定するだけです。

気をつけるべき点としては、Post-Onlyオプションを指定して注文を行った場合、Takerとなる注文は自動でキャンセルされるので、自動キャンセルされた場合の対応を考慮しておくことが重要です

注文がキャンセルされたままで良いのか、それとも指値を変更して注文を出し直すべきなのかなど、開発する側の要件に応じて対応は異なってくると思います。

以上になります。

ccxtの使い方を知りたい場合は、以下の記事をご覧ください。

www.hacky.xyz

BitMEXのWebSocket APIを使ったbotの開発についても記事を書いています。興味があるかたは、ぜひご覧ください。

www.hacky.xyz