예제 #1
0
 def trade_zaif_ask(self, btc, zaif_ask):
     zaif = ZaifTradeApi(self.API_KEY, self.API_SECRET_KEY)
     r = zaif.trade(
         currency_pair='btc_jpy',
         action='bid',  # zaifでは「bid」が「買い」になる
         amount=btc,
         price=int((zaif_ask + 10000) / 10) * 10)
     LOG.tradelog(r)
     return r
예제 #2
0
 def trade_zaif_bid(self, btc, zaif_bid):
     zaif = ZaifTradeApi(self.API_KEY, self.API_SECRET_KEY)
     r = zaif.trade(
         currency_pair='btc_jpy',
         action='ask',  # zaifでは「ask」が「売り」になる
         amount=btc,
         price=int((zaif_bid - 10000) / 10) * 10)
     LOG.tradelog(r)
     return r
class EXCaccess:
    def __init__(self):
        self.investment = 10000  # 投資制限額
        # 予想利益額の閾値(閾値以上で注文)========================
        self.threshold_jpy_btc_mona = 300
        self.threshold_jpy_btc_bch = 150
        self.threshold_jpy_btc_xem = 150
        self.threshold_jpy_btc_eth = 150

        # 手数料 ( % )
        self.fee_BTC_JPY = 0
        self.fee_MONA_BTC = 0.1
        self.fee_MONA_JPY = 0.1
        self.fee_BCH_BTC = 0.3
        self.fee_BCH_JPY = 0.3
        self.fee_XEM_BTC = 0.1
        self.fee_XEM_JPY = 0.1
        self.fee_ETH_BTC = 0.1
        self.fee_ETH_JPY = 0.1

        # 注文確認の手がかりとして注文に付けるコメント
        self.order_comment = 'AutoTA'
        # API用キーの読み込み
        f = open('key_secret.txt', 'r')  # 本番用
        # f = open('test_keys.txt', 'r')  # テスト用
        txt = f.read()
        f.close()
        data = txt.split('\n')
        self.key = data[0]
        self.secret = data[1]

    def createErrorLog(self, locate: str):
        now = datetime.datetime.now()
        Path = 'error.log'
        with open(Path, 'a', newline='', encoding='shift-jis') as f:
            f.write('=====================================\n')
            f.write(str(now))
            f.write(locate)
            traceback.print_exc(file=f)

    # 公開情報に接続
    def getPublicAPI(self):
        while (1):
            try:
                self.zaif = ZaifPublicApi()
                break
            except:
                time.sleep(1)

    # 個人の情報に接続
    def getPrivateAPI(self):
        while (1):
            try:
                self.zaifp = ZaifTradeApi(self.key, self.secret)
                break
            except:
                time.sleep(1)

    # 余力額取得
    def getFunds(self):
        self.getPrivateAPI()
        while (1):
            try:
                result = self.zaifp.get_info2()['funds']
                break
            except:
                traceback.print_exc()
                self.createErrorLog('getFunds')
                time.sleep(1)
        return result

    # 各通貨ペアの相場から買い気配値と売り気配値の中間値を返す
    # 公開情報の.currency_pairsで取得できるaux_unit_step(取引単価?)
    # BTC/JPY:5.0
    # MONA/BTC:0.00000001
    # MONA/JPY:0.1
    # BCH/BTC:0.0001
    # BCH/JPY:5.0
    # XEM/BTC:0.00000001
    # XEM/JPY:0.0001
    # ETH/BTC:0.0001
    # ETH/JPY:5.0
    # ====================================================
    # fund type: JPY BTC MONA ETH XEM BCH
    # ask:sell, bid:buy
    # [0]:value [1]:quantity
    def getBTC_JPY(self):
        while (1):
            try:
                Btc_Jpy = self.zaif.depth('btc_jpy')
                break
            except:
                traceback.print_exc()
                self.createErrorLog('getBTC_JPY')
                time.sleep(1)
        askBtcJpy = Btc_Jpy['asks'][0][0]
        bidBtcJpy = Btc_Jpy['bids'][0][0]
        aveBtcJpy = (askBtcJpy + bidBtcJpy) / 2.0
        T_aveBtcJpy = Tick_int(int(aveBtcJpy), 5)
        return T_aveBtcJpy

    def getMONA_JPY(self):
        while (1):
            try:
                Mona_Jpy = self.zaif.depth('mona_jpy')
                break
            except:
                traceback.print_exc()
                self.createErrorLog('getMONA_JPY')
                time.sleep(1)
        askMonaJpy = Mona_Jpy['asks'][0][0]
        bidMonaJpy = Mona_Jpy['bids'][0][0]
        aveMonaJpy = (askMonaJpy + bidMonaJpy) / 2.0
        T_aveMonaJpy = Decimal(aveMonaJpy).quantize(Decimal('0.0'),
                                                    rounding=ROUND_DOWN)
        return T_aveMonaJpy

    def getMONA_BTC(self):
        while (1):
            try:
                Mona_Btc = self.zaif.depth('mona_btc')
                break
            except:
                traceback.print_exc()
                self.createErrorLog('getMONA_BTC')
                time.sleep(1)
        askMonaBtc = Mona_Btc['asks'][0][0]
        bidMonaBtc = Mona_Btc['bids'][0][0]
        aveMonaBtc = (askMonaBtc + bidMonaBtc) / 2.0
        T_aveMonaBtc = Decimal(aveMonaBtc).quantize(Decimal('0.00000000'),
                                                    rounding=ROUND_DOWN)
        return T_aveMonaBtc

    def getBCH_JPY(self):
        while (1):
            try:
                Bch_Jpy = self.zaif.depth('bch_jpy')
                break
            except:
                traceback.print_exc()
                self.createErrorLog('getBCH_JPY')
                time.sleep(1)
        askBchJpy = Bch_Jpy['asks'][0][0]
        bidBchJpy = Bch_Jpy['bids'][0][0]
        aveBchJpy = (askBchJpy + bidBchJpy) / 2.0
        T_aveBchJpy = Tick_int(int(aveBchJpy), 5)
        return T_aveBchJpy

    def getBCH_BTC(self):
        while (1):
            try:
                Bch_Btc = self.zaif.depth('bch_btc')
                break
            except:
                traceback.print_exc()
                self.createErrorLog('getBCH_BTC')
                time.sleep(1)
        askBchBtc = Bch_Btc['asks'][0][0]
        bidBchBtc = Bch_Btc['bids'][0][0]
        aveBchBtc = (askBchBtc + bidBchBtc) / 2.0
        T_aveBchBtc = Decimal(aveBchBtc).quantize(Decimal('0.0000'),
                                                  rounding=ROUND_DOWN)
        return T_aveBchBtc

    def getXEM_JPY(self):
        while (1):
            try:
                Xem_Jpy = self.zaif.depth('xem_jpy')
                break
            except:
                traceback.print_exc()
                self.createErrorLog('getXEM_JPY')
                time.sleep(1)
        askXemJpy = Xem_Jpy['asks'][0][0]
        bidXemJpy = Xem_Jpy['bids'][0][0]
        aveXemJpy = (askXemJpy + bidXemJpy) / 2.0
        T_aveXemJpy = Decimal(aveXemJpy).quantize(Decimal('0.0000'),
                                                  rounding=ROUND_DOWN)
        return T_aveXemJpy

    def getXEM_BTC(self):
        while (1):
            try:
                Xem_Btc = self.zaif.depth('xem_btc')
                break
            except:
                traceback.print_exc()
                self.createErrorLog('getXEM_BTC')
                time.sleep(1)
        askXemBtc = Xem_Btc['asks'][0][0]
        bidXemBtc = Xem_Btc['bids'][0][0]
        aveXemBtc = (askXemBtc + bidXemBtc) / 2.0
        T_aveXemBtc = Decimal(aveXemBtc).quantize(Decimal('0.00000000'),
                                                  rounding=ROUND_DOWN)
        return T_aveXemBtc

    def getETH_JPY(self):
        while (1):
            try:
                Eth_Jpy = self.zaif.depth('eth_jpy')
                break
            except:
                traceback.print_exc()
                self.createErrorLog('getETH_JPY')
                time.sleep(1)
        askEthJpy = Eth_Jpy['asks'][0][0]
        bidEthJpy = Eth_Jpy['bids'][0][0]
        aveEthJpy = (askEthJpy + bidEthJpy) / 2.0
        T_aveEthJpy = Tick_int(int(aveEthJpy), 5)
        return T_aveEthJpy

    def getETH_BTC(self):
        while (1):
            try:
                Eth_Btc = self.zaif.depth('eth_btc')
                break
            except:
                traceback.print_exc()
                self.createErrorLog('getETH_BTC')
                time.sleep(1)
        askEthBtc = Eth_Btc['asks'][0][0]
        bidEthBtc = Eth_Btc['bids'][0][0]
        aveEthBtc = (askEthBtc + bidEthBtc) / 2.0
        T_aveEthBtc = Decimal(aveEthBtc).quantize(Decimal('0.0000'),
                                                  rounding=ROUND_DOWN)
        return T_aveEthBtc

    # 三角裁定で利益が出るか計算
    def Monitoring(self):
        fj = self.getFunds()['jpy']

        if fj > self.investment:
            fj = self.investment

        self.getPublicAPI()
        aveBtcJpy = self.getBTC_JPY()
        aveMonaJpy = self.getMONA_JPY()
        aveMonaBtc = self.getMONA_BTC()
        aveBchJpy = self.getBCH_JPY()
        aveBchBtc = self.getBCH_BTC()
        aveXemJpy = self.getXEM_JPY()
        aveXemBtc = self.getXEM_BTC()
        aveEthJpy = self.getETH_JPY()
        aveEthBtc = self.getETH_BTC()

        # 買いと売りの中間点
        aves = [
            aveBtcJpy, aveMonaBtc, aveMonaJpy, aveBchBtc, aveBchJpy, aveXemBtc,
            aveXemJpy, aveEthBtc, aveEthJpy
        ]

        # ===========================================================
        # JPY->BTC, BTC->MONA, MONA->JPY
        #  BTC-ask,  MONA-ask,  MONA-bid

        # JPY->MONA, MONA->BTC, BTC->JPY
        #  MONA-ask,  MONA-bid,  BTC-bid

        # 手数料抜き============================================
        # Jpy_Btc_Mona = ((aveMonaJpy * fj) / (aveBtcJpy * aveMonaBtc))
        # Jpy_Mona_Btc = ((aveBtcJpy * aveMonaBtc * fj) / aveMonaJpy)
        # Jpy_Btc_Bch = ((aveBchJpy * fj) / (aveBtcJpy * aveBchBtc))
        # Jpy_Bch_Btc = ((aveBtcJpy * aveBchBtc * fj) / aveBchJpy)
        # Jpy_Btc_Xem = ((aveXemJpy * fj) / (aveBtcJpy * aveXemBtc))
        # Jpy_Xem_Btc = ((aveBtcJpy * aveXemBtc * fj) / aveXemJpy)
        # Jpy_Btc_Eth = ((aveEthJpy * fj) / (aveBtcJpy * aveEthBtc))
        # Jpy_Eth_Btc = ((aveBtcJpy * aveEthBtc * fj) / aveEthJpy)

        # 手数料あり============================================
        # ※decimal * floatができない.同じ型にキャストする必要あり
        Jpy_Btc_Mona = ((100 * float(aveMonaJpy))
                        / (float(aveMonaBtc) * (100 + self.fee_MONA_JPY))) * \
                       (100 / (float(aveBtcJpy) * (100 + self.fee_MONA_BTC))) * \
                       ((100 * fj) / (100 + self.fee_BTC_JPY))
        Jpy_Mona_Btc = ((100 * float(aveBtcJpy) * float(aveMonaBtc))
                        / (100 + self.fee_BTC_JPY)) * \
                       (100 / (float(aveMonaJpy) * (100 + self.fee_MONA_BTC))) * \
                       ((100 * fj) / (100 + self.fee_MONA_JPY))

        Jpy_Btc_Bch = ((100 * float(aveBchJpy))
                       / (float(aveBchBtc) * (100 + self.fee_BCH_JPY))) * \
                      (100 / (float(aveBtcJpy) * (100 + self.fee_BCH_BTC))) * \
                      ((100 * fj) / (100 + self.fee_BTC_JPY))
        Jpy_Bch_Btc = ((100 * float(aveBtcJpy) * float(aveBchBtc))
                       / (100 + self.fee_BTC_JPY)) * \
                      (100 / (float(aveBchJpy) * (100 + self.fee_BCH_BTC))) * \
                      ((100 * fj) / (100 + self.fee_BCH_JPY))

        Jpy_Btc_Xem = ((100 * float(aveXemJpy))
                       / (float(aveXemBtc) * (100 + self.fee_XEM_JPY))) * \
                      (100 / (float(aveBtcJpy) * (100 + self.fee_XEM_BTC))) * \
                      ((100 * fj) / (100 + self.fee_BTC_JPY))
        Jpy_Xem_Btc = ((100 * float(aveBtcJpy) * float(aveXemBtc))
                       / (100 + self.fee_BTC_JPY)) * \
                      (100 / (float(aveXemJpy) * (100 + self.fee_XEM_BTC))) * \
                      ((100 * fj) / (100 + self.fee_XEM_JPY))

        Jpy_Btc_Eth = ((100 * float(aveEthJpy))
                       / (float(aveEthBtc) * (100 + self.fee_ETH_JPY))) * \
                      (100 / (float(aveBtcJpy) * (100 + self.fee_ETH_BTC))) * \
                      ((100 * fj) / (100 + self.fee_BTC_JPY))
        Jpy_Eth_Btc = ((100 * float(aveBtcJpy) * float(aveEthBtc))
                       / (100 + self.fee_BTC_JPY)) * \
                      (100 / (float(aveEthJpy) * (100 + self.fee_ETH_BTC))) * \
                      ((100 * fj) / (100 + self.fee_ETH_JPY))

        # 各予想結果額
        estimates = [
            Jpy_Btc_Mona, Jpy_Mona_Btc, Jpy_Btc_Bch, Jpy_Bch_Btc, Jpy_Btc_Xem,
            Jpy_Xem_Btc, Jpy_Btc_Eth, Jpy_Eth_Btc
        ]

        # 最も高い予想結果額
        maxIndex = numpy.argmax(estimates)

        if maxIndex == 0 \
                and estimates[maxIndex] > (fj + self.threshold_jpy_btc_mona):
            judge = 'Jpy_Btc_Mona'
        elif maxIndex == 1 \
                and estimates[maxIndex] > (fj + self.threshold_jpy_btc_mona):
            judge = 'Jpy_Mona_Btc'
        elif maxIndex == 2 \
                and estimates[maxIndex] > (fj + self.threshold_jpy_btc_bch):
            judge = 'Jpy_Btc_Bch'
        elif maxIndex == 3 \
                and estimates[maxIndex] > (fj + self.threshold_jpy_btc_bch):
            judge = 'Jpy_Bch_Btc'
        elif maxIndex == 4 \
                and estimates[maxIndex] > (fj + self.threshold_jpy_btc_xem):
            judge = 'Jpy_Btc_Xem'
        elif maxIndex == 5 \
                and estimates[maxIndex] > (fj + self.threshold_jpy_btc_xem):
            judge = 'Jpy_Xem_Btc'
        elif maxIndex == 6 \
                and estimates[maxIndex] > (fj + self.threshold_jpy_btc_eth):
            judge = 'Jpy_Btc_Eth'
        elif maxIndex == 7 \
                and estimates[maxIndex] > (fj + self.threshold_jpy_btc_eth):
            judge = 'Jpy_Eth_Btc'
        else:
            judge = 'no routes'

        # 各予想利益額
        diffs = [
            int(Jpy_Btc_Mona - fj),
            int(Jpy_Mona_Btc - fj),
            int(Jpy_Btc_Bch - fj),
            int(Jpy_Bch_Btc - fj),
            int(Jpy_Btc_Xem - fj),
            int(Jpy_Xem_Btc - fj),
            int(Jpy_Btc_Eth - fj),
            int(Jpy_Eth_Btc - fj)
        ]

        resultList = [judge, fj, diffs[maxIndex], diffs, aves]
        return resultList

    # コメント'AutoTA'の注文が残っているか確認
    def checkActiveOrders(self, pair: str):
        # active_ordersの形式:
        # {'270906448': {
        # 'currency_pair': 'mona_btc',
        # 'action': 'ask',
        # 'amount': 33.0,
        # 'price': 0.00035692,
        # 'timestamp': '1510122394',
        # 'comment': ''}}
        time.sleep(0.3)
        self.getPrivateAPI()
        orderID = 0  # 注文が無ければこのまま0を返す
        price = 0
        amount = 0
        orders = []
        while 1:
            try:
                if pair == 'btc_jpy':
                    orders.append(
                        self.zaifp.active_orders(currency_pair='btc_jpy'))
                elif pair == 'mona_btc':
                    orders.append(
                        self.zaifp.active_orders(currency_pair='mona_btc'))
                elif pair == 'mona_jpy':
                    orders.append(
                        self.zaifp.active_orders(currency_pair='mona_jpy'))
                elif pair == 'xem_btc':
                    orders.append(
                        self.zaifp.active_orders(currency_pair='xem_btc'))
                elif pair == 'xem_jpy':
                    orders.append(
                        self.zaifp.active_orders(currency_pair='xem_jpy'))
                elif pair == 'bch_btc':
                    orders.append(
                        self.zaifp.active_orders(currency_pair='bch_btc'))
                elif pair == 'bch_jpy':
                    orders.append(
                        self.zaifp.active_orders(currency_pair='bch_jpy'))
                elif pair == 'eth_btc':
                    orders.append(
                        self.zaifp.active_orders(currency_pair='eth_btc'))
                elif pair == 'eth_jpy':
                    orders.append(
                        self.zaifp.active_orders(currency_pair='eth_jpy'))
                else:
                    pass
                break
            except:
                traceback.print_exc()
                time.sleep(1)

        # コメントが'AutoTA'のオーダーがあればID,価格,数量を返す
        for i in range(len(orders)):
            if orders[i] != []:
                for j in orders[i].keys():
                    if re.search(self.order_comment,
                                 str(orders[i][j]['comment'])):
                        orderID = int(j)
                        price = orders[i][j]['price']
                        amount = orders[i][j]['amount']
        resultList = [orderID, price, amount]
        return resultList

    # 注文IDと通貨ペアを指定して注文を取り消し
    def cancelOrder(self, orderID: int, pair: str):
        cancelFlag = False
        time.sleep(1)
        try:
            self.zaifp.cancel_order(order_id=orderID, currency_pair=pair)
            print('order canceled')
            cancelFlag = True
        except:
            traceback.print_exc()
            self.createErrorLog('cancelOrder')
        time.sleep(1)
        return cancelFlag

    # コメント'AutoTA'を付けて注文実行
    def tradePairs(self, pair, act, price, amount):
        while 1:
            try:
                self.getPrivateAPI()
                self.zaifp.trade(currency_pair=pair,
                                 action=act,
                                 price=price,
                                 amount=amount,
                                 comment=self.order_comment)
                break
            except:
                traceback.print_exc()
                self.createErrorLog('tradePairs')
            time.sleep(1)

    # 各取引======================================
    # JPY->BTC->MONA
    def order_JPY_BTC(self, prevFund, T_aveBtcJpy):
        print('JPY->BTC: ', end='', flush=True)
        # 手数料分を残して取引
        tradeJPY = (100 * prevFund) / (100 + self.fee_BTC_JPY)
        pair = 'btc_jpy'  # trade pair
        act = 'bid'  # ask ( sell order ) or bid ( buy order )
        price = T_aveBtcJpy
        amount = Decimal(tradeJPY / float(price)).quantize(Decimal('0.0000'),
                                                           rounding=ROUND_DOWN)
        print(price, end=' amount: ', flush=True)
        print(amount)
        if amount >= 0.0001:
            self.tradePairs(pair, act, price, amount)
        else:
            print('Do not Trade. Checking active orders...')

    def order_BTC_MONA(self, T_aveMonaBtc):
        print('BTC->MONA: ', end='', flush=True)
        while 1:
            try:
                myBTC = self.getFunds()['btc']
                # 手数料分を残して取引
                tradeBTC = (100 * myBTC) / (100 + self.fee_MONA_BTC)
                pair = 'mona_btc'  # trade pair
                act = 'bid'  # ask ( sell order ) or bid ( buy order )
                price = T_aveMonaBtc
                amount = Decimal(tradeBTC / float(price)).quantize(
                    Decimal('0'), rounding=ROUND_DOWN)
                print(price, end=' amount: ', flush=True)
                print(amount)
                break
            except:
                traceback.print_exc()
                self.createErrorLog('order_BTC_MONA')
            time.sleep(1)
        time.sleep(1)
        if amount >= 1:
            self.tradePairs(pair, act, price, amount)
        else:
            print('Do not Trade. Checking active orders...')

    def order_MONA_JPY(self, T_aveMonaJpy):
        print('MONA->JPY: ', end='', flush=True)
        while 1:
            try:
                myMONA = self.getFunds()['mona']
                # 手数料分を残して取引
                tradeMONA = (100 * myMONA) / (100 + self.fee_MONA_JPY)
                pair = 'mona_jpy'  # trade pair
                act = 'ask'  # ask ( sell order ) or bid ( buy order )
                price = T_aveMonaJpy
                amount = int(tradeMONA)
                print(price, end=' amount: ', flush=True)
                print(amount)
                break
            except:
                traceback.print_exc()
                self.createErrorLog('order_MONA_JPY')
            time.sleep(1)
        time.sleep(1)
        if amount >= 1:
            self.tradePairs(pair, act, price, amount)
        else:
            print('Do not Trade. Checking active orders...')
        return price * amount

    # JPY->MONA->BTC
    def order_JPY_MONA(self, prevFund, T_aveMonaJpy):
        print('JPY->MONA: ', end='', flush=True)
        while 1:
            try:
                # 手数料分を残して取引
                tradeJPY = (100 * prevFund) / (100 + self.fee_MONA_JPY)
                pair = 'mona_jpy'  # trade pair
                act = 'bid'  # ask ( sell order ) or bid ( buy order )
                price = T_aveMonaJpy
                amount = Decimal(tradeJPY / float(price)).quantize(
                    Decimal('0'), rounding=ROUND_DOWN)
                print(price, end=' amount: ', flush=True)
                print(amount)
                break
            except:
                traceback.print_exc()
                self.createErrorLog('JPY->MONA')
            time.sleep(1)
        time.sleep(1)
        if amount >= 1:
            self.tradePairs(pair, act, price, amount)
        else:
            print('Do not Trade. Checking active orders...')

    def order_MONA_BTC(self, T_aveMonaBtc):
        print('MONA->BTC: ', end='', flush=True)
        while 1:
            try:
                myMONA = self.getFunds()['mona']
                # 手数料分を残して取引
                tradeMONA = (100 * myMONA) / (100 + self.fee_MONA_BTC)
                pair = 'mona_btc'  # trade pair
                act = 'ask'  # ask ( sell order ) or bid ( buy order )
                price = T_aveMonaBtc
                amount = int(tradeMONA)
                print(price, end=' amount: ', flush=True)
                print(amount)
                break
            except:
                traceback.print_exc()
                self.createErrorLog('MONA->BTC')
            time.sleep(1)
        time.sleep(1)
        if amount >= 1:
            self.tradePairs(pair, act, price, amount)
        else:
            print('Do not Trade. Checking active orders...')

    def order_BTC_JPY(self, T_aveBtcJpy):
        print('BTC->JPY: ', end='', flush=True)
        while 1:
            try:
                myBTC = self.getFunds()['btc']
                # 手数料分を残して取引
                tradeBTC = (100 * myBTC) / (100 + self.fee_BTC_JPY)
                pair = 'btc_jpy'  # trade pair
                act = 'ask'  # ask ( sell order ) or bid ( buy order )
                price = T_aveBtcJpy
                amount = Decimal(tradeBTC).quantize(Decimal('0.0000'),
                                                    rounding=ROUND_DOWN)
                print(price, end=' amount: ', flush=True)
                print(amount)
                break
            except:
                traceback.print_exc()
                self.createErrorLog('BTC->JPY')
            time.sleep(1)
        time.sleep(1)
        if amount >= 0.0001:
            self.tradePairs(pair, act, price, amount)
        else:
            print('Do not Trade. Checking active orders...')
        return price * amount

    # JPY->BTC->BCH
    def order_BTC_BCH(self, T_aveBchBtc):
        print('BTC->BCH: ', end='', flush=True)
        while 1:
            try:
                myBTC = self.getFunds()['btc']
                # 手数料分を残して取引
                tradeBTC = (100 * myBTC) / (100 + self.fee_BCH_BTC)
                pair = 'bch_btc'  # trade pair
                act = 'bid'  # ask ( sell order ) or bid ( buy order )
                price = T_aveBchBtc
                amount = Decimal(tradeBTC / float(price)).quantize(
                    Decimal('0.0000'), rounding=ROUND_DOWN)
                print(price, end=' amount: ', flush=True)
                print(amount)
                break
            except:
                traceback.print_exc()
                self.createErrorLog('BTC->BCH')
            time.sleep(1)
        time.sleep(1)
        if amount >= 0.0001:
            self.tradePairs(pair, act, price, amount)
        else:
            print('Do not Trade. Checking active orders...')

    def order_BCH_JPY(self, T_aveBchJpy):
        print('BCH->JPY: ', end='', flush=True)
        while 1:
            try:
                myBCH = self.getFunds()['BCH']
                # 手数料分を残して取引
                tradeBCH = (100 * myBCH) / (100 + self.fee_BCH_JPY)
                pair = 'bch_jpy'  # trade pair
                act = 'ask'  # ask ( sell order ) or bid ( buy order )
                price = T_aveBchJpy
                amount = Decimal(tradeBCH).quantize(Decimal('0.0000'),
                                                    rounding=ROUND_DOWN)
                print(price, end=' amount: ', flush=True)
                print(amount)
                break
            except:
                traceback.print_exc()
                self.createErrorLog('BCH->JPY')
            time.sleep(1)
        time.sleep(1)
        if amount >= 0.0001:
            self.tradePairs(pair, act, price, amount)
        else:
            print('Do not Trade. Checking active orders...')
        return price * amount

    # JPY->BCH->BTC
    def order_JPY_BCH(self, prevFund, T_aveBchJpy):
        print('JPY->BCH: ', end='', flush=True)
        # 手数料分を残して取引
        tradeJPY = (100 * prevFund) / (100 + self.fee_BCH_JPY)
        pair = 'bch_jpy'  # trade pair
        act = 'bid'  # ask ( sell order ) or bid ( buy order )
        price = T_aveBchJpy
        amount = Decimal(tradeJPY / float(price)).quantize(Decimal('0.0000'),
                                                           rounding=ROUND_DOWN)
        print(price, end=' amount: ', flush=True)
        print(amount)
        if amount >= 0.0001:
            self.tradePairs(pair, act, price, amount)
        else:
            print('Do not Trade. Checking active orders...')

    def order_BCH_BTC(self, T_aveBchBtc):
        print('BCH->BTC: ', end='', flush=True)
        while 1:
            try:
                myBCH = self.getFunds()['BCH']
                # 手数料分を残して取引
                tradeBCH = (100 * myBCH) / (100 + self.fee_BCH_BTC)
                pair = 'bch_btc'  # trade pair
                act = 'ask'  # ask ( sell order ) or bid ( buy order )
                price = T_aveBchBtc
                amount = Decimal(tradeBCH).quantize(Decimal('0.0000'),
                                                    rounding=ROUND_DOWN)
                print(price, end=' amount: ', flush=True)
                print(amount)
                break
            except:
                traceback.print_exc()
                self.createErrorLog('BCH->BTC')
            time.sleep(1)
        time.sleep(1)
        if amount >= 0.0001:
            self.tradePairs(pair, act, price, amount)
        else:
            print('Do not Trade. Checking active orders...')

    # JPY->BTC->XEM
    def order_BTC_XEM(self, T_aveXemBtc):
        print('BTC->XEM: ', end='', flush=True)
        while 1:
            try:
                myBTC = self.getFunds()['btc']
                # 手数料分を残して取引
                tradeBTC = (100 * myBTC) / (100 + self.fee_XEM_BTC)
                pair = 'xem_btc'  # trade pair
                act = 'bid'  # ask ( sell order ) or bid ( buy order )
                price = T_aveXemBtc
                amount = Decimal(tradeBTC / float(price)).quantize(
                    Decimal('0'), rounding=ROUND_DOWN)
                print(price, end=' amount: ', flush=True)
                print(amount)
                break
            except:
                traceback.print_exc()
                self.createErrorLog('BTC->XEM')
            time.sleep(1)
        time.sleep(1)
        if amount >= 1:
            self.tradePairs(pair, act, price, amount)
        else:
            print('Do not Trade. Checking active orders...')

    def order_XEM_JPY(self, T_aveXemJpy):
        print('XEM->JPY: ', end='', flush=True)
        while 1:
            try:
                myXEM = self.getFunds()['xem']
                # 手数料分を残して取引
                tradeXEM = (100 * myXEM) / (100 + self.fee_XEM_JPY)
                pair = 'xem_jpy'  # trade pair
                act = 'ask'  # ask ( sell order ) or bid ( buy order )
                price = T_aveXemJpy
                amount = Decimal(tradeXEM).quantize(Decimal('0.0'),
                                                    rounding=ROUND_DOWN)
                print(price, end=' amount: ', flush=True)
                print(amount)
                break
            except:
                traceback.print_exc()
                self.createErrorLog('XEM->JPY')
            time.sleep(1)
        time.sleep(1)
        if amount >= 0.1:
            self.tradePairs(pair, act, price, amount)
        else:
            print('Do not Trade. Checking active orders...')
        return price * amount

    # JPY->XEM->BTC
    def order_JPY_XEM(self, prevFund, T_aveXemJpy):
        print('JPY->XEM: ', end='', flush=True)
        # 手数料分を残して取引
        tradeJPY = (100 * prevFund) / (100 + self.fee_XEM_JPY)
        pair = 'xem_jpy'  # trade pair
        act = 'bid'  # ask ( sell order ) or bid ( buy order )
        price = T_aveXemJpy
        amount = Decimal(tradeJPY / float(price)).quantize(Decimal('0.0'),
                                                           rounding=ROUND_DOWN)
        print(price, end=' amount: ', flush=True)
        print(amount)
        if amount >= 0.1:
            self.tradePairs(pair, act, price, amount)
        else:
            print('Do not Trade. Checking active orders...')

    def order_XEM_BTC(self, T_aveXemBtc):
        print('XEM->BTC: ', end='', flush=True)
        while 1:
            try:
                myXEM = self.getFunds()['xem']
                # 手数料分を残して取引
                tradeXEM = (100 * myXEM) / (100 + self.fee_XEM_BTC)
                pair = 'xem_btc'  # trade pair
                act = 'ask'  # ask ( sell order ) or bid ( buy order )
                price = T_aveXemBtc
                amount = Decimal(tradeXEM).quantize(Decimal('0'),
                                                    rounding=ROUND_DOWN)
                print(price, end=' amount: ', flush=True)
                print(amount)
                break
            except:
                traceback.print_exc()
                self.createErrorLog('XEM->BTC')
            time.sleep(1)
        time.sleep(1)
        if amount >= 1:
            self.tradePairs(pair, act, price, amount)
        else:
            print('Do not Trade. Checking active orders...')

    # JPY->BTC->ETH
    def order_BTC_ETH(self, T_aveEthBtc):
        print('BTC->ETH: ', end='', flush=True)
        while 1:
            try:
                myBTC = self.getFunds()['btc']
                # 手数料分を残して取引
                tradeBTC = (100 * myBTC) / (100 + self.fee_ETH_BTC)
                pair = 'eth_btc'  # trade pair
                act = 'bid'  # ask ( sell order ) or bid ( buy order )
                price = T_aveEthBtc
                amount = Decimal(tradeBTC / float(price)).quantize(
                    Decimal('0.0000'), rounding=ROUND_DOWN)
                print(price, end=' amount: ', flush=True)
                print(amount)
                break
            except:
                traceback.print_exc()
                self.createErrorLog('BTC->ETH')
            time.sleep(1)
        time.sleep(1)
        if amount >= 0.0001:
            self.tradePairs(pair, act, price, amount)
        else:
            print('Do not Trade. Checking active orders...')

    def order_ETH_JPY(self, T_aveEthJpy):
        print('ETH->JPY: ', end='', flush=True)
        while 1:
            try:
                myETH = self.getFunds()['ETH']
                # 手数料分を残して取引
                tradeETH = (100 * myETH) / (100 + self.fee_ETH_JPY)
                pair = 'eth_jpy'  # trade pair
                act = 'ask'  # ask ( sell order ) or bid ( buy order )
                price = T_aveEthJpy
                amount = Decimal(tradeETH).quantize(Decimal('0.0000'),
                                                    rounding=ROUND_DOWN)
                print(price, end=' amount: ', flush=True)
                print(amount)
                break
            except:
                traceback.print_exc()
                self.createErrorLog('ETH->JPY')
            time.sleep(1)
        time.sleep(1)
        if amount >= 0.0001:
            self.tradePairs(pair, act, price, amount)
        else:
            print('Do not Trade. Checking active orders...')
        return price * amount

    # JPY->ETH->BTC
    def order_JPY_ETH(self, prevFund, T_aveEthJpy):
        print('JPY->ETH: ', end='', flush=True)
        # 手数料分を残して取引
        tradeJPY = (100 * prevFund) / (100 + self.fee_ETH_JPY)
        pair = 'eth_jpy'  # trade pair
        act = 'bid'  # ask ( sell order ) or bid ( buy order )
        price = T_aveEthJpy
        amount = Decimal(tradeJPY / float(price)).quantize(Decimal('0.0000'),
                                                           rounding=ROUND_DOWN)
        print(price, end=' amount: ', flush=True)
        print(amount)
        if amount >= 0.0001:
            self.tradePairs(pair, act, price, amount)
        else:
            print('Do not Trade. Checking active orders...')

    def order_ETH_BTC(self, T_aveEthBtc):
        print('ETH->BTC: ', end='', flush=True)
        while 1:
            try:
                myETH = self.getFunds()['ETH']
                # 手数料分を残して取引
                tradeETH = (100 * myETH) / (100 + self.fee_ETH_BTC)
                pair = 'eth_btc'  # trade pair
                act = 'ask'  # ask ( sell order ) or bid ( buy order )
                price = T_aveEthBtc
                amount = Decimal(tradeETH).quantize(Decimal('0.0000'),
                                                    rounding=ROUND_DOWN)
                print(price, end=' amount: ', flush=True)
                print(amount)
                break
            except:
                traceback.print_exc()
                self.createErrorLog('ETH->BTC')
            time.sleep(1)
        time.sleep(1)
        if amount >= 0.0001:
            self.tradePairs(pair, act, price, amount)
        else:
            print('Do not Trade. Checking active orders...')
예제 #4
0
def main():
    zaif_public = ZaifPublicApi()
    zaif_trade = ZaifTradeApi(KEY, SECRET)
    last_price = 0
    open_orders = 0
#    position_status = OPEN
    position_status = BOUGHT
    buy_count = 0
    sell_count = 0
    macd_trend = ACCEND
    buy_order_price = 0

    while True:
        start_time = time.time()
        order_status = EXCEPTION
        try:
            macd = MACD(currency_pair='btc_jpy', period='1h', short=10, long=21, signal=9)
            response = macd.request_data(count=1)
            action_signal = response[0]['macdhist']
            '''
            macd = MACD(currency_pair='btc_jpy', period='1m', short=10, long=21, signal=9)
            response = macd.request_data(count=4)
            a = response[1]['macd']-response[0]['macd']+MACD_THREHOLD
            b = response[2]['macd']-response[1]['macd']+MACD_THREHOLD
            
            if a < 0 and b < 0: macd_trend = DECEND
            else: macd_trend = ACCEND
            '''
            account_info = zaif_trade.get_info2()
            funds_jpy = account_info['funds']['jpy']
            funds_btc = account_info['funds']['btc']
            open_orders = account_info['open_orders']
            
            last_price = zaif_public.last_price('btc_jpy')['last_price']

        except Exception as ex:
            print(f"[info_exception]{ex}")
            time.sleep(0.2)
            continue

        if open_orders == 0 and position_status == OPEN and action_signal > SIGNAL_THREHOLD:
            print('[info]buy_btc...')
            ask_amount = float(int((funds_jpy/last_price)*10000.0)/10000.0)
            while order_status == EXCEPTION:
                try:
                    buy_order_price = int(last_price)
                    trade_result = zaif_trade.trade(currency_pair="btc_jpy",action="bid",price=buy_order_price,amount=ask_amount)
                    buy_count += 1
                    order_status = NORMAL
                    position_status = BOUGHT
                    print(f"[buy_ok]#{buy_count},signal:{action_signal:.2f},buy_price:{buy_order_price},amount:{ask_amount},time:{datetime.datetime.today()}")
                    break
                    
                except Exception as ex:
                    print(f"[buy_exception]{ex}")
                    order_status = EXCEPTION
                    time.sleep(0.15)
          
        elif open_orders == 0 and position_status == BOUGHT and action_signal < (-1.0*SIGNAL_THREHOLD):
            print('[info]sell_btc...')
            bid_amount = float(int(funds_btc*10000.0)/10000.0)
            if bid_amount > 0.01 and last_price > (buy_order_price-LOSSCUT):
                while order_status == EXCEPTION:
                    try:
                        trade_result = zaif_trade.trade(currency_pair="btc_jpy",action="ask",price=int(last_price),amount=bid_amount)
                        sell_count += 1
                        order_status = NORMAL
                        position_status = OPEN
                        print(f"[sell_ok]#{sell_count},signal:{action_signal:.2f},sell_price:{last_price},amount:{bid_amount},time:{datetime.datetime.today()}")
                        break
                        
                    except Exception as ex:
                        print(f"[sell_exception]{ex}")
                        order_status = EXCEPTION
                        time.sleep(0.15)
            else:
                position_status = OPEN
                print(f"[info]position_status:OPEN")
        '''
        elif open_orders == 0 and position_status == BOUGHT and macd_trend == DECEND:
            bid_amount = float(int(funds_btc*10000.0)/10000.0)
            if bid_amount > 0.01 and last_price > (buy_order_price-LOSSCUT):
                print('[info]sell_btc as 1m macd decent...')
                while order_status == EXCEPTION:
                    try:
                        trade_result = zaif_trade.trade(currency_pair="btc_jpy",action="ask",price=int(last_price),amount=bid_amount)
                        sell_count += 1
                        order_status = NORMAL
                        position_status = BOUGHT
                        print(f"[sell_ok]#{sell_count},signal:{action_signal:.2f},sell_price:{last_price},amount:{bid_amount},time:{datetime.datetime.today()}")
                        break
                        
                    except Exception as ex:
                        print(f"[sell_exception]{ex}")
                        order_status = EXCEPTION
                        time.sleep(0.15)
        '''
        elpsed_time = time.time()-start_time
        if (SLEEP_TIME-elpsed_time) > 0:
            time.sleep(SLEEP_TIME-elpsed_time)
예제 #5
0
     
 except:
     print("Error:Can't get data")
 finally:
     print("市場取引価格:"+str(last_price))
     print("btc資産:"+str(funds_btc))
     print("jpy資産:"+str(funds_jpy))
     print("最終取引価格:"+str(last_trade_price))
 
 
 #btcを持っていて0.25%値上がり
 if(funds_btc >= 0.001 and int(last_trade_price*1.0025)< last_price):
     #売却
     ask_amount = Decimal(funds_btc).quantize(Decimal('0.0001'))
     try:
         trade_result = zaif_trade.trade(currency_pair="btc_jpy", action="ask", price=last_price, amount=ask_amount)
         last_trade_price_pre = last_trade_price
         last_trade_price = last_price
         
         print('■ Bitcoinの売却申請を行いました。')
         pprint.pprint(trade_result)
         print("売却注文価格:"+str(last_price))
         print("売却注文量 :"+str(ask_amount))
     except:
         print("Error:cant trade[ask_up]")
     
     if(trade_result["order_id"] != 0):
         CANCEL_FLUG = True
         order_id = trade_result["order_id"]
     else:
         print("■ 取引が完了しました。")