Функция, возвращающая другой результат, несмотря на одинаковые входные данные в Python

#python #poloniex

Вопрос:

Вот моя функция, которая использует API обмена Poloniex. Он получает dict запросы (кортежи цены и суммы), а затем вычисляет общую сумму BTC, которая была бы получена с использованием заданных затрат.

Но запуск функции несколько раз возвращает разные суммы, несмотря на то, что количество запросов и расходов остается неизменным. Эту проблему следует устранить, напечатав «запрашивает» (определено ниже) и результат функции несколько раз.

 def findBuyAmount(spend):
    #getOrderBook
    URL = "https://poloniex.com/public?command=returnOrderBookamp;currencyPair=USDT_BTCamp;depth=20"
    #request the bids and asks (returns nested dict)
    r_ab = requests.get(url = URL) 
    # extracting data in json format -> returns a dict in this case! 
    ab_data = r_ab.json() 
    asks = ab_data.get('asks',[])
    #convert strings into decimals
    asks=[[float(elem[0]), elem[1]] for elem in asks]
    amount=0
    for elem in asks: #each elem is a tuple of price and amount
        if spend > 0:
            if elem[1]*elem[0] > spend: #check if the ask exceeds volume of our spend
                amount = amount ((elem[1]/elem[0])*spend) #BTC that would be obtained using our spend at this price
                spend = 0 #spend has been used entirely, leading to a loop break

            if elem[1]*elem[0] < spend: #check if the spend exceeds the current ask
                amount = amount   elem[1] #BTC that would be obtained using some of our spend at this price
                spend = spend - elem[1]*elem[0] #remainder

        else:
            break
    return amount
 

Если бы первый запрос в диктанте «Спрашивает» был [51508.93591717, 0.62723766] и был потрачен 1000 , я ожидал бы, что сумма будет равной (0.62723766/51508.93591717) * 1000 , но вместо этого я получаю всевозможные различные результаты. Как я могу это исправить?

Ответ №1:

Вы получаете всевозможные разнообразные результаты, потому что вы получаете новые данные каждый раз, когда запускаете функцию. Разделите выборку и расчет на отдельные функции, чтобы вы могли тестировать их независимо. Вы также можете сделать логику намного понятнее, правильно назвав свои переменные:

 import requests

def get_asks(url="https://poloniex.com/public?command=returnOrderBookamp;currencyPair=USDT_BTCamp;depth=20"):
    response = requests.get(url=url)
    ab_data = response.json()
    asks = ab_data.get('asks', [])
    #convert strings into decimals
    return [(float(price), qty) for price, qty in asks]

def find_buy_amount(spend, asks):
    amount = 0
    for price, qty in asks:
        if spend > 0:
            ask_value = price * qty
            if ask_value >= spend:
                amount  = spend / price 
                spend = 0
            else:
                amount  = qty
                spend -= ask_value    
        else:
            break
    return amount

asks = get_asks()
print("Asks:", asks)
print("Buy: ", find_buy_amount(1000, asks))
 

Ваша математика была неправильной, когда значение запроса превышает оставшиеся расходы; количество в книге заказов в этот момент не имеет значения, поэтому сумма, которую вы можете купить, справедлива spend / price .

Разделив функции, вы также можете запускать find_buy_amount любое количество раз с одной и той же книгой заказов и видеть, что результат на самом деле всегда один и тот же.

Комментарии:

1. Отличное спасибо! Я допустил ошибку выше по течению этого кода, чтобы ошибочно поверить, что мои данные запроса не меняются.

Ответ №2:

Проблема в вашем пути «у нас недостаточно денег». В этом случае сумма, которую вы можете купить, не зависит от суммы, которая была предложена.

             if elem[1]*elem[0] > spend:
                amount  = spend/elem[0]