from binance_api import Binance bot = Binance(API_KEY='****', API_SECRET='****') get_json = bot.futuresExchangeInfo() key_sym = get_json['symbols'] symb_list = [] for i in key_sym: symb_list.append(i['symbol']) # c = b[0]['symbol']\ symb_list.sort() # список по буквам def alphab_lists(letter): alph_list = [] for i in symb_list: if i.startswith(letter): alph_list.append(i) return alph_list # ticker list def tickers_list(symb_list): get_json = bot.futuresExchangeInfo() key_sym = get_json['symbols'] # symb_list = [] for i in key_sym: symb_list.append(i['symbol']) symb_list.sort() return symb_list
def trade(init_settings: dict, file: str, bot: Binance, number: int): """Запускаем процесс трейлинга (по сути торгов) с заданными параметрами""" multiplier = -1 if init_settings['strategy'] == "Long" else 1 # Получаем настройки пар с биржи symbols = bot.futuresExchangeInfo()['symbols'] step_sizes = {symbol['symbol']: symbol for symbol in symbols} for symbol in symbols: for f in symbol['filters']: if f['filterType'] == 'LOT_SIZE': step_sizes[symbol['symbol']] = float(f['stepSize']) start_rate_bid, start_rate_ask = rates_market_info(init_settings, bot) timer = set_timer(init_settings['working_time']) while timer > datetime.now(): try: bid, ask = rates_market_info(init_settings, bot) # Если играем на повышение, то ориентируемся на цены, по которым продают, иначе на цены, по которым покупают curr_rate = bid if init_settings['strategy'] == "Long" else ask # Если цена больше или равна установленному шагу и обратная сделка в процессе, доливаем с указанным # коэффициентом if init_settings['refund_flag'] and curr_rate >= init_settings['start_rate'] + \ (init_settings['start_rate'] * init_settings['grid_step'] / 100): init_settings['amount'], init_settings['start_rate'] = \ grid_step_set(init_settings['amount'], init_settings['coefficient'], init_settings['start_rate'], init_settings['grid_step']) if init_settings['stop_loss_fixed'] == 0: init_settings['stop_loss_fixed'] = (curr_rate / 100) * ( init_settings['stop_loss_perc'] * multiplier + 100) logging.info( f"Bot#{number}: Текущие курсы {init_settings['symbol']} bid {bid:0.8f}, ask {ask:0.8f}, выбрана {curr_rate:0.8f} " f"stop_loss {init_settings['stop_loss_fixed']:0.8f}") # Считаем, каким был бы stop-loss, если применить к нему % curr_rate_applied = (curr_rate / 100) * ( init_settings['stop_loss_perc'] * multiplier + 100) if init_settings['strategy'] == "Long": # Выбрана стратегия Long, пытаемся продать монеты как можно выгоднее write_to_file(file, f"{curr_rate:0.8f}", f"{init_settings['stop_loss_fixed']:0.8f}") if curr_rate > init_settings['stop_loss_fixed']: logging.info( f"Bot#{number}: Текущая цена выше цены Stop-Loss") if curr_rate_applied > init_settings['stop_loss_fixed']: logging.info( f"Bot#{number}: Пора изменять stop-loss, новое значение {curr_rate_applied:0.8f}" ) init_settings['stop_loss_fixed'] = curr_rate_applied else: # Текущая цена ниже или равна stop loss, продажа по рынку profit_check = start_rate_bid - curr_rate - (curr_rate * 0.0002) if profit_check > 0 or (profit_check <= 0 and init_settings['no_profit_flag']): res = create_order("SELL", init_settings, bot) logging.info( f'Bot#{number}: Результат создания ордера', res) if 'orderId' in res: # Создание ордера прошло успешно, выход logging.info( f"Bot#{number}: Сделка по паре {res['symbol']} {init_settings['strategy']} " f"успешно закрыта по цене {res['price']}") init_settings['count_fails'] = 0 break else: # Запускаем сделку в обратную сторону, согласно стратегии init_settings, timer = refunding_try( init_settings, curr_rate) else: write_to_file(file, f"{curr_rate:0.8f}", f"{init_settings['stop_loss_fixed']:0.8f}") # Выбрана стратегия Short, пытаемся купить монеты как можно выгоднее if curr_rate < init_settings['stop_loss_fixed']: logging.info(f"Bot#{number}: Текущая цена ниже stop-loss") if curr_rate_applied < init_settings['stop_loss_fixed']: logging.info( f"Bot#{number}: Пора изменять stop-loss, новое значение {curr_rate_applied:0.8f}" ) init_settings['stop_loss_fixed'] = curr_rate_applied else: # Цена поднялась выше Stop-Loss, Покупка по рынку quantity = math.floor( (init_settings['amount'] / curr_rate) * (1 / step_sizes[init_settings['symbol']])) / ( 1 / step_sizes[init_settings['symbol']]) logging.info( f"Bot#{number}: Цена поднялась выше Stop-Loss, Покупка по рынку, " f"кол-во монет {quantity:0.8f}") profit_check = start_rate_ask - curr_rate - (curr_rate * 0.0002) if profit_check > 0 or (profit_check <= 0 and init_settings['no_profit_flag']): res = create_order("BUY", init_settings, bot) logging.info( f"Bot#{number}: Результат создания ордера", res) if 'orderId' in res: # Создание ордера прошло успешно, выход logging.info( f"Bot#{number}: Сделка по паре {res['symbol']} {init_settings['strategy']} " f"успешно закрыта по цене {res['price']}") init_settings['count_fails'] = 0 break else: # Запускаем сделку в обратную сторону, согласно стратегии init_settings, timer = refunding_try( init_settings, curr_rate) except Exception as e: logging.error(e) time.sleep(0.5)