BitmexのAPIを触ってみました。

bitmexのbot作成に必要なAPIを関数化してみました。
（とりあえず動かしてみたものなので、ログ出し関連は雑です。）

インジケータ作成器と合わせて使えばサクっと動かせそう。
https://qiita.com/redmeteor777/items/464e2a5ce29683a143b3

価格情報取得はbitmexからじゃなくCryptowatchを使う予定なのでここには未実装。

注文
create_order

未約定の注文があるかの確認(戻り値で注文IDを返す)
check_order

未約定の注文をキャンセル(注文IDが必要)
cancel_order(id)

口座残高の取得
get_collateral

ポジション情報の取得
get_position



###[別ファイルにAPIキーを保存しておきます。]

```const.py
# APIキーを設定
apiKey = 'xxxxxxxxxxxxxxxxxxxxxxxx'
          
# APIシークレットを設定
secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
```          


###[APIをまとめたファイル]

```bitmex_API.py


import ccxt
import numpy as np
from datetime import datetime
import time

# 定義ファイル
import const

# 売買注文を行う関数
def create_order(symbol, type, side, amount, price=None):

	"""
	引数
	symbol(str) : 'BTC/USD'
	type(str) : 'Limit' -> 指値　/ 'Market' -> 成行
	side(str) : 'Buy' -> 買い / 'Sell' -> 売り
	amount(float/int) -> 注文枚数
	price(float/int) -> 注文価格(成行の場合は省略可)
	"""

	# ccxtの読み込み
	bitmex = ccxt.bitmex()
	bitmex.apiKey = const.apiKey # APIキーを設定
	bitmex.secret = const.secret # APIシークレットを設定

	while True:
		result = {}

		try:
			# 注文を実行

			create_order = bitmex.private_post_order({
				'symbol' : symbol,
				'type' : type,
				'side' : side,
				'orderQty' : amount,
				'price' : price
				})


			return create_order

		except ccxt.BaseError as e:
			print("Failed Post Order : " + str(e))
			time.sleep(20)

# 売買注文の約定確認を行う関数
def check_order():
	"""
	引数 : なし
	戻り値 : 未約定の注文ID
	"""
	while True:
		try:
			print("---------- Checking Order ----------")
			
			# ccxtの読み込み
			bitmex = ccxt.bitmex()
			bitmex.apiKey = const.apiKey # APIキーを設定
			bitmex.secret = const.secret # APIシークレットを設定

			orders = []
			order_id = []
			len_orders = 0
			orders = bitmex.fetch_open_orders()

			if len(orders) > 0:
				len_orders = len(orders)
				print("---------- {} Order Remaining ----------".format(len_orders))

				for i in orders:
					order_id.append(i['info']['orderID'])
				
				print(order_id)

			elif orders == []:
				print("---------- Nothing Order ----------")
				order_id = 0
			
			return order_id
		
		except ccxt.BaseError as e:
			print("Failed Check Order : " + str(e))
			time.sleep(20)

# 売買注文のキャンセルを行う関数
def cancel_order(order_id):
	"""
	引数 : なし
	戻り値 : キャンセルの結果（全部成功=1、それ以外=0）
	"""
	while True:
		try:
			print("---------- Cancel Order ----------")
			
			# ccxtの読み込み
			bitmex = ccxt.bitmex()
			bitmex.apiKey = const.apiKey # APIキーを設定
			bitmex.secret = const.secret # APIシークレットを設定

			cancel_order = []

			if order_id != 0:
				for i in order_id:
					cancel_result = bitmex.cancel_order(i)
					cancel_order.append(cancel_result['info']['ordStatus'])

			
			return cancel_order

		except ccxt.BaseError as e:
			print("Failed Cancel Order : " + str(e))
			time.sleep(20)

# 口座残高を取得する関数
def get_collateral():
	"""
	引数 : なし
	戻り値 
		result['total'] # 証拠金総額
		result['used'] # 拘束中証拠金
		result['free'] # 使用可能証拠金
	"""

	# ccxtの読み込み
	bitmex = ccxt.bitmex()
	bitmex.apiKey = const.apiKey # APIキーを設定
	bitmex.secret = const.secret # APIシークレットを設定

	while True:
		result = {}
		try:
			# 口座残高を取得
			collateral = bitmex.fetch_balance()
			# 総額
			result['total'] = collateral['BTC']['total']
			# 拘束中
			result['used'] = collateral['BTC']['used']
			# 使用可能
			result['free'] = collateral['BTC']['free']

			return result

		except ccxt.BaseError as e:
			print_log("Failed Get Balance : " + str(e))
			time.sleep(20)

# ポジション情報を取得する関数
def get_position():
	"""
	引数 : なし
	戻り値 
		result['side'] # None->ノーポジ、BUY->ロング、SELL->ショート
		result['used'] # 拘束中証拠金
		result['free'] # 使用可能証拠金
		result['lots'] # ロットサイズ
		result['averageprice'] # 全ロットの平均価格
	"""

	# ccxtの読み込み
	bitmex = ccxt.bitmex()
	bitmex.apiKey = const.apiKey # APIキーを設定
	bitmex.secret = const.secret # APIシークレットを設定

	while True:
		result = {}
		try:
			
			position = bitmex.private_get_position()

			if position == []:
				result['side'] = 'NONE'
				result['lots'] = 0
			else:
				result['lots'] = abs(float(position[0]['currentQty']))
				result['averageprice'] = float(position[0]['avgEntryPrice'])

				if position[0]['currentQty'] < 0:
					result['side'] = 'SELL'
				elif position[0]['currentQty'] > 0:
					result['side'] = 'BUY'
			
			return result

		except ccxt.BaseError as e:
			print_log("Failed Get Positions : " + str(e))
			time.sleep(20)

			return result