Требуется исправить код, python.

rosvo

Новичок
Пользователь
Дек 29, 2021
10
0
1
Уважаемые форумчане, требуется исправить часть кода, язык python. Оплата в USDT ( TRC 20 ), сумма обговаривается перед выполнением.

Описание процесса : торговый бот совершает ордер на покупку, после этого включается функция trailing stop ( процесс подтягивания стоп-лосса к растущему тренду ), часть кода, отвечающая за отслеживание trailing stop, прилагается. После того, как срабатывает стоп-лосс, начинается новый цикл, а именно: сначала ордер на покупку, затем снова функция trailing stop и т.д.

Суть проблемы : после срабатывания стоп-лосса и последующей покупки по рынку новый цикл с trailing stop начинает отслеживать цену выбранной пары со стоп-лоссом, оставшимся от предыдущего цикла, т.е. новое значение стоп-лосса не высчитывается на основе новых данных.

Задание: требуется исправить код, отвечающий за функцию trailing stop, таким образом, чтобы при начале нового торгового цикла стоп-лосс высчитывался заново , использую актуальные на данный момент данные.
Это код, отвечающий за функцию trailing stop:

Python:
# Если ордер уже исполнен
                        if order_status == 'FILLED':
                            got_qty = float(stock_order_data['executedQty'])
                            log.info("""
                                Ордер {order} выполнен, получено {exec_qty:0.8f}.
                                Проверяем, не стоит ли создать ордер на продажу
                            """.format(
                                order=order, exec_qty=got_qty
                            ))

                            multiplier = -1 if settings['strategy'] == "Long" else 1

                            log.debug("Получаем настройки пар с биржи")
                            symbols = bot.exchangeInfo()['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'])

                            log.debug('Проверяю пару {pair}, стратегия {strategy}'.format(pair=settings['symbol'], strategy=settings['strategy']))
                            # Получаем текущие курсы по паре
                            current_rates = bot.depth(symbol=settings['symbol'], limit=5)

                            bid=float(current_rates['bids'][0][0])
                            ask=float(current_rates['asks'][0][0])

                            # Если играем на повышение, то ориентируемся на цены, по которым продают, иначе на цены, по которым покупают
                            curr_rate = bid if settings['strategy'] == "Long" else ask
       
                            if settings['stop_loss_fixed'] == 0:
                               settings['stop_loss_fixed'] = (curr_rate/100) * (settings['stop_loss_perc']*multiplier+100)
 
                            log.debug("Текущие курсы bid {bid:0.8f}, ask {ask:0.8f}, выбрана {cr:0.8f} stop_loss {sl:0.8f}".format(
                                    bid=bid, ask=ask, cr=curr_rate, sl=settings['stop_loss_fixed']
                            ))

                            # Считаем, каким был бы stop-loss, если применить к нему %
                            curr_rate_applied = (curr_rate/100) * (settings['stop_loss_perc']*multiplier+100)

                            if settings['strategy'] == "Long":
            # Выбрана стратегия Long, пытаемся продать монеты как можно выгоднее
                                if curr_rate > settings['stop_loss_fixed']:
                                    log.debug("Текущая цена выше цены Stop-Loss")
                                    if curr_rate_applied > settings['stop_loss_fixed']:
                                        log.debug("Пора изменять stop-loss, новое значение {sl:0.8f}".format(sl=curr_rate_applied))                  
                                        settings['stop_loss_fixed'] = curr_rate_applied
                                else:
                                   # Текущая цена ниже или равна stop loss, продажа по рынку
                                          res = bot.createOrder(
                                              symbol=settings['symbol'],
                                              recvWindow=15000,
                                              side='SELL',
                                              type='MARKET',
                                              quantity=settings['amount']
                                          )
                                          log.debug('Текущая цена ниже или равна stop loss, Ордер на продажу по рынку исполнен', res)
                                          if 'orderId' in res:
                                              log.info("Сработал Стоп-Лосс. Создан ордер на продажу по рынку {res}".format(res=res))
                                              store_sell_order(cursor, conn, order, res['orderId'], got_qty, 0)

                                              order_trades = get_order_trades(
                                               order_id=res['orderId'],
                                               pair=orders_info[order]['order_pair'], bot=bot
                                              )

                                              avg_rate = calc_sell_avg_rate(order_trades, log)
                                              if avg_rate > 0:
                                                  update_sell_rate(cursor, conn, res['orderId'], avg_rate)
                                                                                   
            # Получаем из базы все ордера, по которым есть торги, и исключаем их из списка, по которому будем создавать новые ордера
            for row in get_db_running_pairs(cursor):
                del all_pairs[row]

            # Если остались пары, по которым нет текущих торгов
            if all_pairs:
                log.debug('Найдены пары, по которым нет неисполненных ордеров: {pairs}'.format(pairs=list(all_pairs.keys())))
                for pair_name, pair_obj in all_pairs.items():
                    try:
                        log.debug("Работаем с парой {pair}".format(pair=pair_name))

                        # Получаем лимиты пары с биржи
                        for elem in limits['symbols']:
                            if elem['symbol'] == pair_name:
                                CURR_LIMITS = elem
                                break
                        else:
                            raise Exception("Не удалось найти настройки выбранной пары " + pair_name)
 
Последнее редактирование:

Форум IT Специалистов