Exemple #1
0
 def __check_bid_ask_diff(side, ori_bidask, diff_kijun):
     if side == 'buy':
         ask = TickData.get_ask_price()
         return False if ask - ori_bidask >= diff_kijun else True
     else:
         bid = TickData.get_bid_price()
         return False if ori_bidask - bid >= diff_kijun else True
Exemple #2
0
    def market_order_wait_till_execution3(cls, side, total_size):
        size = []
        price = []
        max_wait = 10
        num = 0
        bid = TickData.get_bid_price()
        ask = TickData.get_ask_price()
        try:
            cls.num_private_access += 1
            order_id = cls.bf.create_order(
                symbol='BTC/JPY',
                type='market',
                side=side,
                amount=total_size,
                params={'product_code': 'FX_BTC_JPY'})
        except Exception as e:
            print('market order failed! ' + str(e))
            LogMaster.add_log('market order failed! ' + str(e), None)
            LineNotification.send_error('market order failed! ' + str(e))
            cls.check_exception(e)
            return -1, 0, 0, ''

        order_id = order_id['info']['child_order_acceptance_id']
        print('waiting for market order execution...')
        start = time.time()
        while sum(size) < total_size:
            exe_data = TickData.get_exe_data()[-100:]
            if time.time() - start > max_wait:
                exe_data = cls.get_executions()
            exe_data = TickData.get_exe_data()[-100:]
            for exec in exe_data:
                if exec[side + "_child_order_acceptance_id"] == order_id:
                    size.append(exec["size"])
                    price.append(exec["price"])
            if time.time() - start > max_wait:
                print(
                    'can not complete Trade - check_and_wait_till_all_execution!'
                )
                LogMaster.add_log(
                    'can not complete Trade - check_and_wait_till_all_execution!',
                    None)
                LineNotification.send_error(
                    'can not complete Trade - check_and_wait_till_all_execution!'
                )
                return -1, sum(size), round(
                    sum(price[i] * size[i]
                        for i in range(len(price))) / sum(size)), order_id
            num += 1
        ave_p = round(
            sum(price[i] * size[i] for i in range(len(price))) / sum(size))
        print('market order has been successfully executed.' + 'side=' + side +
              ', ave price=' + str(ave_p) + ', size=' +
              str(round(sum(size), 2)))
        sp = ask - ave_p if side == 'buy' else ave_p - bid
        print('market order spread loss/profit = ' + str(sp))
        cls.spread_loss_profit += sp
        cls.spread_loss_profit_log.append(sp)
        return 0, round(sum(size), 2), ave_p, order_id
Exemple #3
0
 def opt_price_wait_till_execution(cls, side, total_size):
     exec_size = []
     exec_price = []
     max_wait = 2.1
     loop_sec = 0.01
     bid = TickData.get_bid_price()
     ask = TickData.get_ask_price()
     try:
         price = TickData.get_bid_price() if side =='buy' else TickData.get_ask_price()
         cls.num_private_access += 1
         order_id = cls.bf.create_order(
             symbol='BTC/JPY',
             type='limit',
             side=side,
             price=price,
             amount=total_size,
             params={'product_code': 'FX_BTC_JPY', 'minute_to_expire': 1}  # 期限切れまでの時間(分)(省略した場合は30日)
         )
     except Exception as e:
         print('opt price order failed! ' + str(e))
         LogMaster.add_log('opt price order failed! ' + str(e), 0, None)
         LineNotification.send_error('opt price order failed! ' + str(e))
         cls.check_exception(e)
         return -1, 0, 0, ''
     order_id = order_id['info']['child_order_acceptance_id']
     print('waiting for opt price order execution...')
     num = 0
     ave_p = 0
     while sum(exec_size) < total_size:
         executions = cls.get_executions()
         for exec in executions:
             if exec["child_order_acceptance_id"] == order_id:
                 exec_size.append(exec["size"])
                 exec_price.append(exec["price"])
         time.sleep(loop_sec)
         num += 1
         if max_wait < loop_sec * num:
             cls.cancel_order(order_id)
             if sum(exec_size) > 0:
                 ave_p = round(sum(exec_price[i] * exec_size[i] for i in range(len(exec_price))) / sum(exec_size))
             print('opt price order has been failed.' + 'side=' + side + ', ave price=' + str(ave_p) + ', size=' + str(round(sum(exec_size), 2)))
             return -1, round(sum(exec_size), 2), ave_p, order_id
     ave_p = round(sum(exec_price[i] * exec_size[i] for i in range(len(exec_price))) / sum(exec_size))
     print('opt price order has been successfully executed.' + 'side=' + side + ', ave price=' + str(ave_p) + ', size=' + str(round(sum(exec_size), 2)))
     return 0, round(sum(exec_size), 2), ave_p, order_id
Exemple #4
0
 def __check_bid_ask_diff(
     side, ori_bidask, diff_kijun
 ):  #True:diff is within diff_kijun, False:diff is larger than diff_kijun
     if side == 'buy':
         ask = TickData.get_ask_price()
         return False if ask - ori_bidask >= diff_kijun else True
     else:
         bid = TickData.get_bid_price()
         return False if ori_bidask - bid >= diff_kijun else True
Exemple #5
0
    def price_tracing_order(cls, side, total_size):
        def __check_bid_ask_diff(
            side, ori_bidask, diff_kijun
        ):  #True:diff is within diff_kijun, False:diff is larger than diff_kijun
            if side == 'buy':
                ask = TickData.get_ask_price()
                return False if ask - ori_bidask >= diff_kijun else True
            else:
                bid = TickData.get_bid_price()
                return False if ori_bidask - bid >= diff_kijun else True

        checked_exec_id = []

        def __check_execution_ws(order_id):
            exec_size = []
            exec_price = []
            exe_data = TickData.get_exe_data()[-30:]
            for exec in exe_data:
                if exec[side +
                        '_child_order_acceptance_id'] == order_id and exec[
                            'id'] not in checked_exec_id:
                    exec_size.append(exec['size'])
                    exec_price.append(exec['price'])
                    checked_exec_id.append(exec['id'])
            return exec_size, exec_price

        exec_size = []
        exec_price = []
        order_ids = []
        order_sizes = []
        outstanding_size = total_size
        while sum(exec_size) < total_size and outstanding_size >= 0.01:
            try:
                entry_price = TickData.get_bid_price(
                ) + 1 if side == 'buy' else TickData.get_ask_price() - 1
                cls.num_private_access += 1
                order_id = cls.bf.create_order(
                    symbol='BTC/JPY',
                    type='limit',
                    side=side,
                    price=entry_price,
                    amount=outstanding_size,
                    params={
                        'product_code': 'FX_BTC_JPY',
                        'minute_to_expire': 1
                    }  # 期限切れまでの時間(分)(省略した場合は30日)
                )['info']['child_order_acceptance_id']
                order_ids.append(order_id)
                order_sizes.append(outstanding_size)
            except Exception as e:
                print('price tracing order failed! ' + str(e))
                LogMaster.add_log('price tracing order failed! ' + str(e), 0,
                                  None)
                LineNotification.send_error('price tracing order failed! ' +
                                            str(e))
                cls.check_exception(e)
                ave_p = round(
                    sum(exec_price[i] * exec_size[i]
                        for i in range(len(exec_price))) / sum(exec_size))
                return -1, order_sizes, ave_p, order_ids, sum(exec_size)
            while __check_bid_ask_diff(side, entry_price,
                                       300) and sum(exec_size) < total_size:
                es, ep = __check_execution_ws(order_id)
                if sum(es) > 0:
                    exec_size.extend(es)
                    exec_price.extend(ep)
                    outstanding_size = round(total_size - sum(exec_size), 2)
                time.sleep(0.1)
            cls.cancel_order(order_id)
        ave_p = round(
            sum(exec_price[i] * exec_size[i]
                for i in range(len(exec_price))) / sum(exec_size))
        print('price tracing order has been successfully executed.' + 'side=' +
              side + ', ave price=' + str(ave_p) + ', size=' +
              str(round(sum(exec_size), 2)))
        return 0, order_sizes, ave_p, order_ids, sum(exec_size)
Exemple #6
0
    def opt_entry_limit_order(cls, side, total_size):
        def __check_execution(order_id):
            exec_size = []
            exec_price = []
            executions = cls.get_executions()
            for exec in executions:
                if exec['child_order_acceptance_id'] in order_id:
                    exec_size.append(exec['size'])
                    exec_price.append(exec['price'])
            return exec_size, exec_price

        checked_exec_id = []

        def __check_execution_ws(order_id):
            exec_size = []
            exec_price = []
            exe_data = TickData.get_exe_data()[-30:]
            for exec in exe_data:
                if exec[side +
                        '_child_order_acceptance_id'] == order_id and exec[
                            'id'] not in checked_exec_id:
                    exec_size.append(exec['size'])
                    exec_price.append(exec['price'])
                    checked_exec_id.append(exec['id'])
            return exec_size, exec_price

        order_id = ''
        try:
            entry_price = TickData.get_bid_price(
            ) + 1 if side == 'buy' else TickData.get_ask_price() - 1
            cls.num_private_access += 1
            order_id = cls.bf.create_order(
                symbol='BTC/JPY',
                type='limit',
                side=side,
                price=entry_price,
                amount=total_size,
                params={
                    'product_code': 'FX_BTC_JPY',
                    'minute_to_expire': 1
                }  # 期限切れまでの時間(分)(省略した場合は30日)
            )['info']['child_order_acceptance_id']
        except Exception as e:
            print('opt entry limit order failed! ' + str(e))
            LogMaster.add_log('opt entry limit order failed! ' + str(e), 0,
                              None)
            LineNotification.send_error('opt entry limit order failed! ' +
                                        str(e))
            cls.check_exception(e)
            return -1, 0, 0, ''

        exec_size = []
        exec_price = []
        print('oid=', order_id)
        while datetime.now().second <= 56 and sum(exec_size) < total_size:
            es, ep = __check_execution_ws(order_id)
            exec_size.extend(es)
            exec_price.extend(ep)
            time.sleep(0.5)
        cls.cancel_order(order_id)
        if sum(exec_size
               ) < total_size:  #final check using execution history from API
            es, ep = __check_execution(order_id)
            if sum(es) > sum(exec_size):
                exec_size = es
                exec_price = ep
        if sum(exec_size) > 0:
            ave_p = round(
                sum(exec_price[i] * exec_size[i]
                    for i in range(len(exec_price))) / sum(exec_size))
            print('opt entry limit order has been successfully executed.' +
                  'side=' + side + ', ave price=' + str(ave_p) + ', size=' +
                  str(round(sum(exec_size), 2)))
            return 0, round(sum(exec_size), 2), ave_p, order_id
        else:
            ave_p = 0
            print('opt entry limit order timed out.' + 'side=' + side +
                  ', ave price=0' + ', size=0')
            return -1, 0, 0, order_id
Exemple #7
0
    def opt_price_wait_till_execution2(cls, side, total_size):
        def __check_execution(
            order_id
        ):  #should use only 1 time for final check to avoid double count of same exec data
            exec_size = []
            exec_price = []
            executions = cls.get_executions()
            for exec in executions:
                if exec['child_order_acceptance_id'] in order_id:
                    exec_size.append(exec['size'])
                    exec_price.append(exec['price'])
            return exec_size, exec_price

        checked_exec_id = []

        def __check_execution_ws(order_id):
            exec_size = []
            exec_price = []
            exe_data = TickData.get_exe_data()[-30:]
            for exec in exe_data:
                if exec[side +
                        '_child_order_acceptance_id'] == order_id and exec[
                            'id'] not in checked_exec_id:
                    exec_size.append(exec['size'])
                    exec_price.append(exec['price'])
                    checked_exec_id.append(exec['id'])
            return exec_size, exec_price

        def __calc_price_move():
            executions = TickData.get_exe_data()[-3:]
            change = executions[-1]['price'] - executions[0]['price']
            return change

        def __check_bid_ask_diff(
            side, ori_bidask, diff_kijun
        ):  #True:diff is within diff_kijun, False:diff is larger than diff_kijun
            if side == 'buy':
                ask = TickData.get_ask_price()
                return False if ask - ori_bidask >= diff_kijun else True
            else:
                bid = TickData.get_bid_price()
                return False if ori_bidask - bid >= diff_kijun else True

        remaining_size = total_size
        order_id = ''
        exec_size = []
        exec_price = []
        s = time.time()
        while total_size > sum(exec_size) and remaining_size >= 0.01:
            exec_size = []
            exec_price = []
            change = __calc_price_move()
            entry_price = 0
            if side == 'buy':
                if change > 0:
                    entry_price = TickData.get_ask_price()
                else:
                    entry_price = TickData.get_bid_price() + 1
            if side == 'sell':
                if change > 0:
                    entry_price = TickData.get_ask_price() - 1
                else:
                    entry_price = TickData.get_bid_price()
            try:
                cls.num_private_access += 1
                order_id = cls.bf.create_order(
                    symbol='BTC/JPY',
                    type='limit',
                    side=side,
                    price=entry_price,
                    amount=remaining_size,
                    params={'product_code': 'FX_BTC_JPY'})
            except Exception as e:
                print('market order failed! ' + str(e))
                LogMaster.add_log('market order failed! ' + str(e), None)
                LineNotification.send_error('market order failed! ' + str(e))
                cls.check_exception(e)
                return -1, 0, 0, ''

            time.sleep(1)
            while __check_bid_ask_diff(side, entry_price,
                                       300) == True and remaining_size >= 0.01:
                esize, eprice = __check_execution_ws(order_id)
                exec_size.extend(esize)
                exec_price.extend(eprice)
                remaining_size = round(total_size - sum(exec_size), 2)
                time.sleep(1)
            completion_status = cls.cancel_and_wait_completion(
                order_id)  #cancel order if price diff > 300
            if len(completion_status) > 0:
                s, p = __check_execution(order_id)
                remaining_size -= s

            remaining_size = round(total_size - sum(exec_size), 2)
        ave_p = round(
            sum(exec_price[i] * exec_size[i]
                for i in range(len(exec_price))) / sum(exec_size))
        print('opt price order has been successfully executed.' +
              'time elapsed=' + str(time.time() - s) + 'side=' + side +
              ', ave price=' + str(ave_p) + ', size=' +
              str(round(sum(exec_size), 2)))
        return 0, round(sum(exec_size), 2), ave_p, order_id