Python
仮想通貨
BTC
自動取引
coincheck

Pythonで仮想通貨自動取引 (小ネタ編4) : Coincheckの注文後の実行状況確認

Coincheckも、部分約定するケースがあるため、約定履歴を取ったら、必ず'funds'の'btc'の額を確認して、実際にオーダーしたサイズと同じかチェックする必要がある。また、このとき注意しなければならないのは、売りの場合はこの値がマイナスになること。従って、この場合プラスに変更したり、絶対値を取るなどして比較しなければいけない。

以下はself.o1.history()より、1件のオーダー(order_id:592060XXX)を抜き出したもの。0.1BTCをSELLしたのだが、4つのオーダーに分割されている。なので、全額約定したかは、この4つのデータの実行サイズの和をとって、0.1になるか確認しなければならない。

{'liquidity': 'M', 'order_id': 592060XXX, 'funds': {'jpy': '80415.1592', 'btc': '-0.0472'}, 'side': 'sell', 'rate': '1703711.0', 'created_at': '2017-12-24T03:30:27.000Z', 'pair': 'btc_jpy', 'id': 999060856, 'fee': '0.0', 'fee_currency': None}
{'liquidity': 'T', 'order_id': 592060XXX, 'funds': {'jpy': '42593.05', 'btc': '-0.025'}, 'side': 'sell', 'rate': '1703722.0', 'created_at': '2017-12-24T03:30:27.000Z', 'pair': 'btc_jpy', 'id': 999060851, 'fee': '0.0', 'fee_currency': None}
{'liquidity': 'T', 'order_id': 592060XXX, 'funds': {'jpy': '33755.0202', 'btc': '-0.0198'}, 'side': 'sell', 'rate': '1704799.0', 'created_at': '2017-12-24T03:30:27.000Z', 'pair': 'btc_jpy', 'id': 999060850, 'fee': '0.0', 'fee_currency': None}
{'liquidity': 'T', 'order_id': 592060XXX, 'funds': {'jpy': '13629.728', 'btc': '-0.008'}, 'side': 'sell', 'rate': '1703716.0', 'created_at': '2017-12-24T03:30:27.000Z', 'pair': 'btc_jpy', 'id': 999060847, 'fee': '0.0', 'fee_currency': None}

以下のコードは、出したオーダをチェックする関数。
Coincheck APIのWrapperはこちらを使用。kmnさん、ありがとう!

from coincheck import order, market, account, settings

class CC:
    def __init__(self):
        self.o1 = order.Order(secret_key=settings.secret_key, access_key=settings.access_key)
        self.a1 = account.Account(secret_key=settings.secret_key, access_key=settings.access_key)
        self.id = ""
        self.size =""
        self.side = ""

    #買いオーダー
    def buyBtc(self,rate1,amount1):
        self.size = amount1
        self.side = "buy"
        result = self.o1.buy_btc_jpy(rate=rate1, amount=amount1)
        if result == False:
            return False
        if ('success' in result.keys()):
            if (result["success"]==True):
                self.id = result["id"]
                print ("cc order id : " + str(self.id))
                return  True
            else:
                print ('#### Coincheck order error  ####')
                print (result)
                return False
        else:
            print ('#### Coincheck order error  ####')
            print (result)
            return False

    def executedsizeget(self) : 
        #実行完了しているSizeを取得する
        history = self.o1.history()
        hh = history["transactions"]
        executedsize = 0
        for x in hh:
            if x['order_id']==self.id:
                #print (x)
                executedsize = executedsize + abs(float(x['funds']['btc']))
        return executedsize

    def checkorder(self) : 
        #オーダ完了してるかを確認(周期的にTrueになるまで呼ぶ)
        #print ("cc checking self.id =" + str(self.id))
        if self.executedsizeget() == self.size:
            print ("Coincheck order COMPLETED!")
            return True
        else:
            print ("Coincheck order not completed.")
            return False


本当は、order historyから対象オーダを探すのではなく、直接order idを指定してステータス情報取れるといいんだけどな。

ではでは。