見出し画像

BitMexのWebSocketでBOT作成(2)

前回は、WebSocketを使ってBitMexのTicker情報を取得するところまでやりました。

今回は、パーソナル情報の取得から、他のメソッドまで見てみたいと思います。

BitMexでAPIキーを取得する

パーソナル情報を取得するには、まずBitMexのAPIキーを取得する必要があります。
APIキーで個人を判別するということですね。

実はBitMexには、本番環境とテスト環境(TestNet)の2つが用意されています。
「いきなり本番環境でBotを動かすのは怖い...」
という人も多いと思うので、まずはテスト環境でBotを動かしてみるみる、という感じですね。優しい。

こちらがBitMex 本番環境で、
▶︎ BitMex本番環境
こちらがBitMex テスト環境です。
▶︎ BitMexテスト環境

BitMexの本番環境、テスト環境のダッシュボードは見た目がほぼ一緒なので一瞬分からなくなりますが、ロゴの色を見れば判断しやすいです。

画像1

今回はTestNetでAPIキーを取得しますので、BitMexテスト環境のアカウント取得済み前提で話を進めていきます。

画像2

①:「アカウント」をクリック
②:「APIキー」をクリック
③:APIキーに名前をつける
④:アクセス権限は「注文」を選択(これでキャンセルもできます)
⑤:二段階認証のトークンを入力
⑥:「APIキーを作成」をクリック

これでAPIキーが作成できます。
IDと秘密鍵が発行されるので、忘れないようにします。

APIキーを使ってBitMexからパーソナル情報を取得

APIキーが発行できたので、早速使っていきましょう。
前回のコードの続きからやりますので、分からない方は前回からどうぞ。

生成したキーとシークレットを変数に格納しておきます。
今回は手っ取り早くやっていますが、しっかりと書くのであれば別ファイルに保管しておくのがいいですね。

API_KEY = "apikey"
API_SECRET = "apisecret"

まずはポジションに関する情報を取得してみます。
前提のコードは前回できていますので、そこに付け加えていきます。

logger.info("Positions: {}".format(ws.positions()))

生成したwsオブジェクトに対して、positions関数を叩いてあげればポジション情報が見られるようです。
前回のコードに組み込むとこんな感じですね。

from bitmex_websocket import BitMEXWebsocket
import logging
from time import sleep


# メイン
def run():
   API_KEY = "apikey"
   API_SECRET = "apisecret"

   logger = setup_logger()
   ws = BitMEXWebsocket(endpoint="https://testnet.bitmex.com/api/v1", symbol="XBTUSD", api_key=API_KEY,
                        api_secret=API_SECRET)

   logger.info("データ: {}".format(ws.get_instrument()))

   # 止めるまで半永久
   while ws.ws.sock.connected:
       logger.info("Ticker: {}".format(ws.get_ticker()))
       if ws.api_key:
           logger.info("Positions: {}".format(ws.positions()))
           sleep(10)


def setup_logger():
   # コンソールハンドラを作成し、レベルをdebugに設定。
   logger = logging.getLogger()
   logger.setLevel(logging.DEBUG)
   ch = logging.StreamHandler()
   # フォーマット作成
   formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
   ch.setFormatter(formatter)
   logger.addHandler(ch)
   return logger


if __name__ == "__main__":
   run()

これで実行してみます。

スクリーンショット 2019-12-24 2.00.48

おや、配列がカラですね...
まあ何もポジション持っていないので当たり前なんですが。
とうわけで、適当に買ってもう1回流してみます。

スクリーンショット 2019-12-24 2.05.04

しっかり取れてますね。

bitmex-wsに用意されている他の関数

bitmex-wsに用意されている、他の関数も見てみます。

・funds
残高や証拠金などに関する情報が取得できます。

logger.info("Funds: {}".format(ws.funds()))

・market_depth
AskとBidの価格と数量に関する情報が取得できます。

logger.info("Market Depth: {}".format(ws.market_depth()))

・recent_trades
直近の取引情報を取得できます。

logger.info("Recent Trades: {}".format(ws.recent_trades()))

bitmex-wsに用意されているのはこれだけですが、BitMex側で用意している情報はまだまだたくさんあります。
すべてに関して説明はできないですが、全部でこれだけあります。

{
   'symbol': 'XBTUSD', 
   'rootSymbol': 'XBT', 
   'state': 'Open', 
   'typ': 'FFWCSX', 
   'listing': '2016-05-04T12:00:00.000Z', 
   'front': '2016-05-04T12:00:00.000Z', 
   'expiry': None, 
   'settle': None, 
   'relistInterval': None, 
   'inverseLeg': '', 
   'sellLeg': '', 
   'buyLeg': '', 
   'optionStrikePcnt': None, 
   'optionStrikeRound': None, 
   'optionStrikePrice': None, 
   'optionMultiplier': None, 
   'positionCurrency': 'USD', 
   'underlying': 'XBT', 
   'quoteCurrency': 'USD', 
   'underlyingSymbol': 'XBT=', 
   'reference': 'BMEX', 
   'referenceSymbol': '.BXBT', 
   'calcInterval': None, 
   'publishInterval': None, 
   'publishTime': None, 
   'maxOrderQty': 10000000, 
   'maxPrice': 1000000, 
   'lotSize': 1, 
   'tickSize': 0.5, 
   'multiplier': -100000000, 
   'settlCurrency': 'XBt', 
   'underlyingToPositionMultiplier': None, 
   'underlyingToSettleMultiplier': -100000000, 
   'quoteToSettleMultiplier': None, 
   'isQuanto': False, 
   'isInverse': True, 
   'initMargin': 0.01, 
   'maintMargin': 0.005, 
   'riskLimit': 20000000000, 
   'riskStep': 10000000000, 
   'limit': None, 
   'capped': False, 
   'taxed': True, 
   'deleverage': True, 
   'makerFee': -0.00025, 
   'takerFee': 0.00075, 
   'settlementFee': 0, 
   'insuranceFee': 0, 
   'fundingBaseSymbol': '.XBTBON8H', 
   'fundingQuoteSymbol': '.USDBON8H', 
   'fundingPremiumSymbol': '.XBTUSDPI8H', 
   'fundingTimestamp': '2019-12-23T20:00:00.000Z', 
   'fundingInterval': '2000-01-01T08:00:00.000Z', 
   'fundingRate': 0.000213, 
   'indicativeFundingRate': -0.002131, 
   'rebalanceTimestamp': None, 
   'rebalanceInterval': None, 
   'openingTimestamp': '2019-12-23T17:00:00.000Z', 
   'closingTimestamp': '2019-12-23T18:00:00.000Z', 
   'sessionInterval': '2000-01-01T01:00:00.000Z', 
   'prevClosePrice': 7554.84, 
   'limitDownPrice': None, 
   'limitUpPrice': None, 
   'bankruptLimitDownPrice': None, 
   'bankruptLimitUpPrice': None, 
   'prevTotalVolume': 126153482756, 
   'totalVolume': 126158076403, 
   'volume': 4593647, 
   'volume24h': 48145641, 
   'prevTotalTurnover': 1808853298186237, 
   'totalTurnover': 1808915008373483, 
   'turnover': 61710187246, 
   'turnover24h': 637137377221, 
   'homeNotional24h': 6371.373772209994, 
   'foreignNotional24h': 48145641, 
   'prevPrice24h': 7646, 
   'vwap': 7556.8654, 
   'highPrice': 7753.5, 
   'lowPrice': 7430, 
   'lastPrice': 7430, 
   'lastPriceProtected': 7430, 
   'lastTickDirection': 'ZeroMinusTick', 
   'lastChangePcnt': -0.0283, 
   'bidPrice': 7430, 
   'midPrice': 7430.25, 
   'askPrice': 7430.5, 
   'impactBidPrice': 7429.9725, 
   'impactMidPrice': 7434.5, 
   'impactAskPrice': 7438.8157, 
   'hasLiquidity': True, 
   'openInterest': 75486655, 
   'openValue': 1020353115635, 
   'fairMethod': 'FundingRate', 
   'fairBasisRate': 0.233235, 
   'fairBasis': 0.43, 
   'fairPrice': 7397.88, 
   'markMethod': 'FairPrice', 
   'markPrice': 7397.88, 
   'indicativeTaxRate': 0, 
   'indicativeSettlePrice': 7397.45, 
   'optionUnderlyingPrice': None, 
   'settledPrice': None, 
   'timestamp': '2019-12-23T17:50:45.000Z', 
   'tickLog': 0
}


dataプロパティの中に格納されていますので、必要な情報がある場合は、個人的に叩けば見られます。
例えば、一番上にある「symbol」を見たい場合は、以下のように書けば取得できます。

logger.info("Symbol: {}".format(ws.get_instrument()['symbol']))

便利ですね!