見出し画像

ビットコイン 自動売買 BOT 作成〈講座〉 BitMEX 最強ボットの作り方Websocket

ものまねが上手くなりたいと思っているあなた。

僕はものまねが好きだ! ものまねをやっていると 知識を簡単に勉強できる。

残りの人生の時間は短いし。 後悔しないようにBitmexのWebsocket自動売買手法を勉強しましょう。

前回はBitMEX取引所のREST API版のBOTを作成しましたが


REST API版のBOTは情報のやり取りは「HTTPSプロトコル」を使った「REST API」という方式で行われます。あとはBitMEXはこのプロトコルを使った「REST API」に使用頻度の制限を課しています。

当社の REST API へのリクエストは、5 分あたり 300 リクエストに制限されています。このカウンタは継続的に補充されます。ログインしていない場合は、レート制限は 5 分あたり 150 リクエストになります。


WebSocket というのは、サーバとブラウザ間のリアルタイム双方向通信を実現するための技術になります。

「WebSocket」方式は一度接続を行ったら、その接続を閉じずに維持し、サーバーとブラウザの相互での通信を続けます。
なんと、その間はリアルタイムで通信し放題!なんどでも最新情報を手に入れることができます!

よくサーバからのプッシュ通信とか、サーバとブラウザ間で頻繁にデータのやりとりするチャットとかオンラインゲームなどに使われます。

WebSocket 自体は最新のブラウザで実装され始めたのですが、仕様のまま書いてしまうと冗長なコードになってしまったり、古いブラウザに対応してくれなかったりするので、そのあたりを簡単に書けて、便利な拡張命令なども入っている Socketライブラリがよく利用されています。

今回、BitMEX取引所を戦場に、pythonのWebSocketライブラリを利用したbotを動かしています。

ポイントは「機先を取りたい」

BitMEXとのWebSocket通信を行っています。BTCの価格や現在もっているポジションの情報を得たり、それらの情報をもとに発注をしたりします。

WebSocket通信で1秒ごととか高い頻度で価格情報の確認や処理を行ったら、早く判断ができて、早く利確と損きりできます。

BitMEXのWebSocket API使用方法が掲載されています。

公式サイトの確認
https://www.bitmex.com/app/wsAPI

そして、BitMEX提供のWebSocket通信を行ってくれるpythonライブラリがあります。

事前導入

pip install bitmex_ws

Cloud9環境の場合は

sudo pip-3.6 install bitmex_ws

画像1

イブラリをインポート

#!/usr/bin/python3
from datetime import datetime as dt
import time
# WebSocket API をインポート
from bitmex_websocket import BitMEXWebsocket

次は WebSocket API接続用オブジェクトを生成

ws = BitMEXWebsocket(endpoint="https://www.bitmex.com/api/v1", symbol="XBTUSD", api_key='API_KEY', api_secret='SECRET_KEY')

BitMEXWebsocket経由でBitMEXとの通信を行ってくれるオブジェクトwsを作り出しています。
api_keyとapi_secretを指定しないと、ポジション情報など、アカウントのプライベートな情報が取得できないので、ご注意してください。

そして、初期化します。

ws.get_instrument()

instrumentalとは役に立つ情報ですね

// 各フィールドではテーブルを定義しております

// 保証される属性名はオブジェクトごとに固有のものです。

// 複数提供される場合、キーは合成です。

// すべての受信データで存在します。

instrumentデータの取得処理を呼び出します。
★取引高とビッド/アスクなどの最新商品情報

BitMexWebSocket接続したら、コネクタのメソッドを使用してデータを取得できます。 最新のデータがクライアントにストリーミングされます-サーバーをポーリングする必要はありません。

次はSocketの接続が活きている限り処理を追加します。

WebSocketの接続があることを条件に、while文を回します。

while ws.ws.sock.connected :

まず Ticker情報を確認します。

  tick = ws.get_ticker()

結果は下記となります。

画像2

内容説明は下記の通りです。

{
"last" : 最終価格,
"buy" : Bid価格,
"sell" : Ask価格,
"mid" : BidとAskの平均値

次はws.market_depth()ですね

ファイナンスでは、市場深度は、販売される数量と単価を表示するリアルタイムのリストです。 このリストは価格レベル別に整理されており、リアルタイムの市場活動を反映しています。 数学的には、市場価格を所定の量だけ動かすために必要な注文のサイズです。 市場が深い場合、価格を変更するには大量の注文が必要です。

#------market_depth情報確認------------------#
market_depth = ws.market_depth()

結果がわからないが下記のライブラリを導入します。

画像3

sudo pip-3.6 install pprint

綺麗にできました。

画像4

次は自分のアカウントのポジション情報ですね。

この情報はAPIキーを指定しているとき、ポジションが存在するときにしか取得できないので、ご注意ください。

BitmexのAPI申請画面は下記となります。事前に準備しておきましょう。

画像5

ポジション情報を取得方法は二つがあります。

1.ws.get_position()呼び出します。

2.プロパティ「data」の中にちゃんと入ってます

data=ws.data

if 'position' in ws.data:
   #キー名positionで検索します。
    positions = ws.data['position']
else:
    positions = []

ポジションがない場合positions = []に代入します。

取得したポジション情報には現在保有している全ての通貨セットのポジションが含まれますので、'XBTUSD'でフィルタリングします

#ポジションが存在場合
if 'position' in ws.data:
       #キー名positionで検索します。
       positions = ws.data['position']
       for position in positions:
          #'XBTUSD'でフィルタリングします
               if position['symbol'] == 'XBTUSD':
                   pprint.pprint(position)
#ポジションがない場合
else: 
       #存在しない場合は空の配列を設定します
       positions = [] 

下記の結果ができました。

画像6

qtyは保有の数ですね、マイナスの場合はshort方向の意味です。

また、dataプロパティには提供される情報の全てが含まれるようですので、BitMEXのAPI解説ページにある下記の情報も取得できます。

"announcement",// サイトのお知らせ
"chat",        // Trollbox チャット
"connected",   // 接続ユーザー/ボットの統計
"funding",     // 最新のスワップ資金調達率。 資金調達間隔ごとに送信 (通常8時間)
"instrument",  // 取引高とビッド/アスクなどの最新商品情報
"insurance",   // デイリーの保険基金に関する最新情報
"liquidation", // ブックに記入される清算注文
"orderBookL2", // フルレベル 2 のオーダーブック
"orderBook10", // 従来のフルブックプッシュを使用する上位 10 レベル
"publicNotifications", // システム全体への通知 (短期公開メッセージ用)
"quote",       // ブックの上位レベル
"quoteBin1m",  // 1 分足クォートビン
"quoteBin5m",  // 5 分足クォートビン
"quoteBin1h",  // 1 時間足クォートビン
"quoteBin1d",  // 1 日足クォートビン
"settlement",  // 決済
"trade",       // ライブ取引
"tradeBin1m",  // 1 分足取引ビン
"tradeBin5m",  // 5 分足取引ビン
"tradeBin1h",  // 1 時間足取引ビン
"tradeBin1d",  // 1 日足取引ビン
次のトピックには認証が必要です。
"affiliate",   // アフィリエイトの状況 (合計紹介ユーザーや支払い率等)
"execution",   // 個別執行 (注文ごとに複数の可能性)
"order",       // リアルタイムでの注文の最新状況
"margin",      // 最新アカウント残高と証拠金必要額に関する最新情報
"position",    // ポジションに関する最新情報
"privateNotifications", // 個人的通知 - 現在未使用
"transact"     // 入金/出金に関する最新情報
"wallet"       // ビットコインアドレス残高データ (合計入金・出金額等)


色々情報収集できましたので次はbotへの組み込み

今回のロジックは下記となります。

while true:
  APIで価格を取得する
  シグナルを計算する
  if ポジションを持っていない:
    if 買いシグナルが出た:
      買い注文を出す
else:
    if 利確シグナルが出た:
      利確注文を出す
    elif 損切シグナルが出た:
      損切注文を出す
  sleep(30//30秒待機

(1)価格を取得してシグナルを計算する
(2)まだポジションを取ってなければ、買いシグナルを確認し、シグナルが出ていれば買い注文を出す。出ていなければ何もしない。
(3)もし既にポジションを取っていれば、利確シグナルを確認する。シグナルが出ていれば利確注文を出す。出ていなければ、損切シグナルを確認する。シグナルが出ていれば損切注文を出す。両方出ていなければ何もしない。
(4)30秒間待機して、また(1)に戻る

まず-設定項目開始
#--------設定項目開始--------
#指定すると通知します
DISCORDURL = ''  
# エントリー用
# 1度に売買する数量(ドル)
LOT   = 100          
# 単価監視用
# ループの待ち時間
SLEEP = 30           
# 売買対象の取引所
EXCHANGE     = 'BITMEX' 
#レバレッジ設定
LEVERAGE = 3
#==================API-KEY設定部分=================
Web_MEX_API = 'ご自身のAPIキー'
Web_MEX_SECRET = 'ご自身のAPIシークレット'
#================================================
bitmex = ccxt.bitmex({
   'apiKey': Web_MEX_API,     # 
   'secret': Web_MEX_SECRET,  # 
})
#レバレッジ設定をBitMEXに反映する
bitmex.private_post_position_leverage({"symbol":"XBTUSD", "leverage": str(LEVERAGE)})
#--------設定項目完了----
####################################################
#下記DISCORDURL関数事前準備
#####################################################
def discord(message):
  # Provide the webhook URL that Discord generated
  discord_webhook_url = DISCORDURL
  # Post the message to the Discord webhook
  data = {"content": " ```"+ message+"``` "}
  requests.post(discord_webhook_url, data=data)

次はWebSocket API接続用オブジェクトを生成

mex_ws = BitMEXWebsocket(endpoint="wss://www.bitmex.com/realtime", symbol="XBTUSD", api_key=Web_MEX_API, api_secret=Web_MEX_SECRET)
# instrumentメソッドを一度呼びだす
mex_ws.get_instrument()

まず市場最新価額を収集しますね。

# 最終取引価格の取得
bitmex_last_price = mex_ws.get_ticker()['last'] 

次はチャネルブレイクアウト戦略導入。


トレンドフォローの戦略として広く知られているものです。1960年代にドンチャンが考案し、その後「タートルズ」という投資集団によって有名になりました。古典的な手法ではありますが、その有効性ゆえ、多くのヘッジファンドが使うトレード手法のベースとなっている、という話もあります。

画像7

チャネルブレイクアウトは一定期間以上の中長期トレードに有効性があるとされています。設定期間には20や40を使うことが多いようです。

完成したイメージは下記の通りです。

画像8

次は注文に関する知識

■ 取引手数料
■ Funding手数料
■ 3つの価格表示

まずは取引手数料です。

取引手数料は、注文が約定した瞬間に残高から引かれる(受け取る)ものです。

板に注文の指値を掲載していたらMaker、その価格で約定させた側となればTakerとなり、そのどちらになるかによって、手数料の率が異なります。

Takerとなった場合、取引量の0.075%の手数料が引かれ、
Makerとなった場合、取引量の0.025%の手数料がもらえます。
なお、紹介リンクから登録している場合は10%オフとなり、それぞれ 0.0675% と -0.0225% になります。

私の紹介リンクは下記となります。

https://www.bitmex.com/register/8yQyQx


・価格 $5000 のとき -$7.5(-$6.75)
・価格 $10000 のとき -$15.0(-$13.5)
・価格 $20000 のとき -$30.0(-$27.0)

たとえば、$10000でロングエントリーして、$10010で決済しても、手数料分で約$5分のマイナスになってしまいます。
平均$15以上の価格差でトレードを行わなければ結果として負けてしまうこと、勝っていたとしても平均$15に近すぎると意外と理が薄いということがわかります。

エントリー・決済の両方がMakerになった場合、
・価格 $10000 のとき +$5.0

この手数料に対して利益を上げるイメージを持ちやすくなると思います。

そしてFunding手数料

画像9

ロングポジションを持っているとき、
手数料率が +0.xxxx% で支払い、-0.xxxx% で受け取り、
ショートポジションを持っているとき、
手数料率が -0.xxxx% で支払い、+0.xxxx% で受け取り、となります。


また、BitMEX の3つの価格表示


下記の画面で価格が3つ載っているもの

画像10

・上の価格が 最新価格(Last Price)
・左下の価格が インデックス価格(Index Price)
・右下の価格が マーク価格(Mark Price)
と呼ばれる価格表示になります。

ここから先は

8,182字

¥ 4,980

この記事が気に入ったらサポートをしてみませんか?