[Python3] [CCXT] BitMEX で IFD 注文

18/11/26 追記: こちらの方法は使えなくなりました

IFD 注文は、ある注文が約定したタイミングで自動的に別の注文を発行できるやつです。API のドキュメントでは OTO 注文と表記されています。

import time
import ccxt

BTCUSD = 'BTC/USD'
SELL = 'Sell'
BUY = 'Buy'

def create_ifd_order(first_side, size, limit_price, close_price, mex):
    opposite_side = SELL if first_side == BUY else BUY
    uniq_id = time.time()

    mex.create_limit_order(BTCUSD, first_side, size, limit_price, {
        'contingencyType': 'OneTriggersTheOther',
        'clOrdLinkID': uniq_id,
    })
    mex.create_limit_order(BTCUSD, opposite_side, size, close_price, {
        'clOrdLinkID': uniq_id,
    })

このように使います。

mex = ccxt.bitmex()
mex.apiKey = 'API_KEY'
mex.secret = 'API_SECRET'

size = 1000
# 8000ドルに買指値を入れる。約定直後、8100ドルに売指値が入る。
create_ifd_order(BUY, size, 8000, 8100, mex)
# 9000ドルに売指値を入れる。約定直後、8500ドルに買指値が入る。
create_ifd_order(SELL, size, 9000, 8500, mex)

OTO 注文を発行するには、最初の注文の contingencyType に 'OneTriggersTheOther' を指定します。あわせて、注文同士を関連付けるための文字列を clOrdLinkID として指定します。ここでは現在時刻を指定しています。

その後、同じ clOrdLinkID を指定して2つ目の注文をします。contingencyType の指定は不要です。これで最初の注文が完全に約定したタイミングで2つ目の注文が有効になります。

ご覧いただきありがとうございます!