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
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
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
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
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)
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
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