#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]