Python
api
仮想通貨
自動取引
Quoine

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

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を反映しなければならないというおはなし。筆者は、ハマったので皆さんも気をつけて。