Pythonで仮想通貨自動取引 (小ネタ編1) : Quoineのオーダーのリカバリーには注意

More than 1 year has passed since last update.

Quoine APIでの注文が約定しなかった場合、どの様にリカバリするか?というのは、少し注意が必要である。と言うのも、Quoineは、注文したSize内で買える(売れる)ものがある場合、部分的に約定させてしまうからだ。例えば、100万円で1BTC買いを入れたとして、売り板に100万円以下の注文が0.1BTCあった場合、親切仕様のお陰でその分は約定してしまう。だから、発注後にタイムアウト等でキャンセルすると、元のBTC/JPY残高と合わない事象が発生して混乱する。

以下は、一部約定してCANCELしたときのAPI Responce。基本部分は、 こちらを利用させて頂いている。ichizoさん、ありがとうございます。


class quoineApi:
def __init__(self):
self.token_id = 'token ID'
self.api_secret = 'secret Key'
self.api_endpoint = 'https://api.quoine.com'

def get_api_call(self,path):
timestamp = str(int(time.time()))
auth_payload = {
'path': path,
'nonce': timestamp,
'token_id': self.token_id
}
sign = jwt.encode(auth_payload, self.api_secret, algorithm='HS256')
request_data=requests.get(
self.api_endpoint+path
,headers = {
'X-Quoine-API-Version': '2',
'X-Quoine-Auth': sign,
'Content-Type': 'application/json'
})
return request_data

#order check
def checkorder(self,id):
api = quoineApi()
result = api.get_api_call('/orders/'+str(id)).json()
if result['status'] == "live":
return False
elif result['status']=="filled":
return True
else:
#受付未完了など
return False

api.get_call のresult (一部伏せ字)

{'unwound_trade_id': None, 'created_at': 15118XXXXX, 

'iceberg_total_quantity': '0.0', 'trailing_stop_type': False,
'executions': [{'created_at': 15118XXXXX, 'id': 13XXXXXX,
'quantity': '0.033566', 'taker_side': 'buy', 'price':
'1123619.15006', 'my_side': 'buy'}, {'created_at': 15118XXXXX,
'id': 13XXXXXX, 'quantity': '0.033566', 'taker_side': 'buy',
'price': '1123619.15006', 'my_side': 'sell'}], 'side': 'sell',
'target': 'spot', 'price': 1123619.15006, 'settings': None,
'source_exchange': 0, 'disc_quantity': '0.0',
'stop_triggered_time': None, 'crypto_account_id': None,
'leverage_level': 1, 'currency_pair_code': None, 'order_fee':
'0.0', 'trade_id': None, 'average_price': '0.0', 'id': 1XXXXXXX9,
'order_type': 'limit', 'trailing_stop_value': False, 'quantity':
'0.143', 'filled_quantity': '0.033566', 'funding_currency': 'JPY',
'source_action': 'manual', 'updated_at': 15118XXXXX, 'product_id':
5, 'product_code': None, 'status': 'cancelled'}


解説

このオーダーは、 元々以下のパラメータで発注され、そしてキャンセルされている。

'price': 1123619.15006,

'quantity': '0.143
'side': 'sell'

checkorder では、'status'を見て終了判定していて、それ自体は良いのだが、executionsの中身を見るとSELL/BUYのペアの記録があり、0.033566BTCは、既に成立していることがわかる。その額は以下のパラメータでも取得できる。

 'filled_quantity': '0.033566'

従って、Cancel後に価格を変えてリトライする様な場合、元々のBTC Sizeから、filled_quantityを減算したSizeを反映しなければならないというおはなし。筆者は、ハマったので皆さんも気をつけて。