Permalink
Switch branches/tags
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
201 lines (154 sloc) 10.5 KB

ビットメックス(BitMEX)の自動売買BOT

ビットメックス(BitMEX)用の自動売買botのサンプル

このbotは無料で使用することができ、自由にカスタマイズすることができる。 カスタマイズによって自分の独自の戦略なども組み込むことができる。

主にこのサンプルが提供するのは以下のもの。

  • BitMEX オブジェクトはREST/WebSocketAPIをラップしている。
    • 全てのデータはリアルタイムかつ効率的にWebSocket経由で取り込まれる。
    • BitMEX.buy(), BitMEX.sell(), BitMEX.open_orders() などを介して注文・キャンセル・注文一覧などの操作ができる。
    • 出金のリクエスト(メールと2FAでの認証は必要)
    • 接続エラーとWebSocket再接続が処理されている。
    • 永続的なAPI Keyがサポートされている。
  • 独自のトレーディング戦略を組み込む土台
    • ロング(買い)とショート(売り)のシンプルな売買機能が実装されている。
    • より複雑な戦略はユーザー次第。インデックスデータを組み込むことにチャレンジして,独自の戦略を開発できる。

まずはテストネットで開発しよう! テストネットは完全に無料で、ライブマーケットと同じ。

BitMEXは、このコードを使用する際に発生した損失について責任を追わない このコードはあくまでもサンプルを作成することを目的にしている 実際の取引にこのコードを使わないように(投資は自己責任)

これは洗練された自動売買botではない。 あくまでもBitMEX APIを使用したサンプル。 安易に使うと資産を失うことになる。

使い方

  1. テストネット BitMEX アカウントを作成し、テスト用のBTCを入金する
  2. pip install bitmex-market-maker
  3. marketmaker setup
    • settings.pymarket_maker/ が作成される。
    • settings.py のパラメータを編集する。
  4. settings.pyBitMEX API Key and Secretを追加する。
    • ユーザー・パスワードの認証は実装されていない
    • DRY_RUN=True でテスト実行できる
  5. marketmaker [symbol] で実行できる ex) marketmaker XBTUSD
  6. もしパフォーマンスに納得がいけば本番 API Key を作成して BASE_URL を調整して自動売買botを稼働させることができる。

操作概要

この自動売買botは、以下の原則に基づいている。

  • 自動売買botは最後の 買値売値 からどこからスタートするかを決める
  • ユーザーが設定したパラメータに基づいて注文を作成していく
    • settings.MAINTAIN_SPREADS が設定されている場合は現在のスプレッドの内側から外側に向けて動く
    • 設定がない場合は、間隔を計算して自動で決める
  • ユーザーが限度額を定めることもできる。もし限度額を超えていれば自動売買botはその注文を停止する。
  • 以下の注文は自動売買botが現在、市場状況に出している注文と比較される。
    • すでにある注文を望ましい内容に修正できる場合は修正される。
    • それ以外の場合は新たに注文を作成する。
    • 余分な注文はキャンセルする。
  • 自動売買botは取引された契約、注文状況、合計デルタの詳細を表示する。

シンプルなアウトプット

botを実行すると下記のようなアウトプットになる。

例:

2016-01-28 17:29:31,054 - INFO - market_maker - BitMEX Market Maker Version: 1.0
2016-01-28 17:29:31,074 - INFO - ws_thread - Connecting to wss://testnet.bitmex.com/realtime?subscribe=quote:XBT7D,trade:XBT7D,instrument,order:XBT7D,execution:XBT7D,margin,position
2016-01-28 17:29:31,074 - INFO - ws_thread - Authenticating with API Key.
2016-01-28 17:29:31,075 - INFO - ws_thread - Started thread
2016-01-28 17:29:32,079 - INFO - ws_thread - Connected to WS. Waiting for data images, this may take a moment...
2016-01-28 17:29:32,079 - INFO - ws_thread - Got all market data. Starting.
2016-01-28 17:29:32,079 - INFO - market_maker - Using symbol XBT7D.
2016-01-28 17:29:32,079 - INFO - market_maker - Order Manager initializing, connecting to BitMEX. Live run: executing real trades.
2016-01-28 17:29:32,079 - INFO - market_maker - Resetting current position. Cancelling all existing orders.
2016-01-28 17:29:33,460 - INFO - market_maker - XBT7D Ticker: Buy: 388.61, Sell: 389.89
2016-01-28 17:29:33,461 - INFO - market_maker - Start Positions: Buy: 388.62, Sell: 389.88, Mid: 389.25
2016-01-28 17:29:33,461 - INFO - market_maker - Current XBT Balance: 3.443498
2016-01-28 17:29:33,461 - INFO - market_maker - Current Contract Position: -1
2016-01-28 17:29:33,461 - INFO - market_maker - Avg Cost Price: 389.75
2016-01-28 17:29:33,461 - INFO - market_maker - Avg Entry Price: 389.75
2016-01-28 17:29:33,462 - INFO - market_maker - Contracts Traded This Run: 0
2016-01-28 17:29:33,462 - INFO - market_maker - Total Contract Delta: -17.7510 XBT
2016-01-28 17:29:33,462 - INFO - market_maker - Creating 4 orders:
2016-01-28 17:29:33,462 - INFO - market_maker - Sell 100 @ 389.88
2016-01-28 17:29:33,462 - INFO - market_maker - Sell 200 @ 390.27
2016-01-28 17:29:33,463 - INFO - market_maker -  Buy 100 @ 388.62
2016-01-28 17:29:33,463 - INFO - market_maker -  Buy 200 @ 388.23
-----
2016-01-28 17:29:37,366 - INFO - ws_thread - Execution: Sell 1 Contracts of XBT7D at 389.88
2016-01-28 17:29:38,943 - INFO - market_maker - XBT7D Ticker: Buy: 388.62, Sell: 389.88
2016-01-28 17:29:38,943 - INFO - market_maker - Start Positions: Buy: 388.62, Sell: 389.88, Mid: 389.25
2016-01-28 17:29:38,944 - INFO - market_maker - Current XBT Balance: 3.443496
2016-01-28 17:29:38,944 - INFO - market_maker - Current Contract Position: -2
2016-01-28 17:29:38,944 - INFO - market_maker - Avg Cost Price: 389.75
2016-01-28 17:29:38,944 - INFO - market_maker - Avg Entry Price: 389.75
2016-01-28 17:29:38,944 - INFO - market_maker - Contracts Traded This Run: -1
2016-01-28 17:29:38,944 - INFO - market_maker - Total Contract Delta: -17.7510 XBT
2016-01-28 17:29:38,945 - INFO - market_maker - Amending Sell: 99 @ 389.88 to 100 @ 389.88 (+0.00)

高度な使い方

この自動売買botでは独自のトレード戦略を実装することができる。 market_maker.OrderManager クラスはBitMEXでの発注、更新、および監視を制御する。 独自のトレード戦略を実装するには以下を行う。

  • market_maker.OrderManager を継承する
  • OrderManager.place_orders() メソッドオーバーライドする

例:

from market_maker.market_maker import OrderManager

class CustomOrderManager(OrderManager):
    def place_orders(self) -> None:
        # implement your custom strategy here

ここでは buy_ordersell_order などの注文をセットする必要がある。 その注文は「価格・数量・買いか売りか」の情報からなる。

例:

buy_order = {
    'price': 1234.5, # float
    'orderQty': 100, # int
    'side': 'Buy'
}

sell_order = {
    'price': 9876.5, # float
    'orderQty': 100, # int
    'side': 'Sell'
}

self.converge_orders() メソッドを使用することで注文を実行することができる。 converge_orders() メソッドは実際に設定した注文情報をもとに BitMEX上で必要に応じて注文の作成・修正・削除してくれる。

例:

def place_orders(self) -> None:
    buy_orders = []
    sell_orders = []

    # populate buy and sell orders, e.g.
    buy_orders.append({'price': 998.0, 'orderQty': 100, 'side': "Buy"})
    buy_orders.append({'price': 999.0, 'orderQty': 100, 'side': "Buy"})
    sell_orders.append({'price': 1000.0, 'orderQty': 100, 'side': "Sell"})
    sell_orders.append({'price': 1001.0, 'orderQty': 100, 'side': "Sell"})

    self.converge_orders(buy_orders, sell_orders)

独自のトレードロジックを実行するには run_loop() メソッドを使用する。

例:

order_manager = CustomOrderManager()
order_manager.run_loop()

CTRL-C でプログラムを終了するまで実行し続ける。 custom_strategy.py には独自のトレード戦略の実装例があるので参考になる。

レート制限についての注意事項

BitMEX APIはデフォルトでは5分あたりのリクエスト制限を300に設定している。(平均1秒に1リクエスト)

このbotはWebSocketと一括注文(bulk order/注文配置や修正)を使用することで 大幅にBitMEX APIを呼び出す数を減らしている。

APIへのほとんど呼び出しは次の場合をのぞいて1カウントとする:

  • 一括注文(bulk order/注文配置や修正): 1オーダーにつき0.1カウントとし、小数点以下は切り上げる。例えば16オーダーを一括注文する場合は1.6なので切り上げて2とカウントする。
  • 一括注文キャンセル: オーダー数に関わらず1カウントする。 これはレート制限を超えてもブロックされない。キャンセルについては常に成功する。 このボットはエラーが起きた時や、プログラムが中断するときに、全ての注文をキャンセルする。

複数の契約を引用していたり、レート制限が障害になっている場合は email support まで詳細をメールする。 ほとんどのケースにおいて、ユーザーのレート制限を引き上げることができる(とのこと)。

トラブルシューティング

一般的なエラー:

  • TypeError: __init__() got an unexpected keyword argument 'json'
    • これは requests のバージョンが古いために起こるので、その場合は pip install -U requests を実行してアップデートする。

互換性

このモジュールはPython3.5以上をサポートしている。

参考

BitMEXはpython用のライブラリを作成している。