Используя Python, как правильно использовать asyncio с ccxt для постоянного мониторинга статуса заказа?
Я программно отправляю заказы в Bitmex и хочу использовать asyncio, чтобы отслеживать и постоянно проверять, был ли выполнен любой из этих заказов. После того, как ордер заполнен, мне нужно вернуть детали завершенной сделки в мой скрипт и затем разместить другой ордер.
Я не уверен, даже если это правильный подход, но, выбрав этот маршрут, я сталкиваюсь с 2 ошибками:
1) Я не могу остановить цикл, что привело к сбою сервера и
2) когда он не произошел сбой, я получил сообщение об ошибке, в котором говорится, что идентификатор, который мне нужен для передачи из одной функции в другую, не может быть подписан.
Заказ успешно оформлен так:
import ccxt
import asyncio
import ccxt.async_support as ccxt
def place_order():
bitmex = ccxt.bitmex ({
'apiKey' : 'my_key',
'secret' : 'my_secret'
})
if 'test' in bitmex.urls:
bitmex.urls['api'] = bitmex.urls['test']
data = request.args.get("payload")
result = data.split(",")
symbol = result[0]
type = 'limit'
side = result[1]
amount = result[2]
price = result[3]
offset = result[4]
params = {'execInst': 'ParticipateDoNotInitiate'}
order = bitmex.create_order(symbol, type, side, amount, price, params)
id = order["info"]["orderID"]
symbol = order["info"]["symbol"]
fetch_order(id, offset)
return id
Теперь проблема в том, что я получаю сообщение об ошибке, в котором говорится, что "id" не является подписным, что препятствует нормальной работе функции fetch_order(). Я должен передать идентификатор, иначе функция fetch_order() не сможет получить данные из Bitmex без него.
Функция fetch_order() выглядит следующим образом:
async def fetch_order(id, offset):
bitmex = ccxt.bitmex ({
'apiKey' : 'SaZhyZ9U9qqKxJ-3rUewDgGS',
'secret' : 'W3xvrTs45RIWOTgzAJjATEUQa4wgTv0_4GbZK3MGBy7IQJdk'
})
if 'test' in bitmex.urls:
bitmex.urls['api'] = bitmex.urls['test']
if bitmex.has['fetchOrder']:
bitmex.fetch_order(id)
asyncio.get_event_loop().run_until_complete(bimex.fetch_order(id))
status = order["info"]["status"]
amount = order["info"]["orderQty"]
remaining = order["info"]["remaining"]
if status == 'closed':
symbol = order["info"]["symbol"]
side = order["info"]["side"]
price = order["info"]["price"]
if side == 'buy':
type = 'limit'
side = 'sell'
price = price + offset
params = {'execInst': 'ParticipateDoNotInitiate'}
order = bitmex.create_order(symbol, type, side, amount, price, params)
else:
type = 'limit'
side = 'buy'
price = price + offset
params = {'execInst': 'ParticipateDoNotInitiate'}
order = bitmex.create_order(symbol, type, side, amount, price, params)
return 'OK'
Я попытался поместить await перед строкой bitmex.fetch_order(id), но это тоже выдает сообщение об ошибке.
Итак, вопросы: 1) используя asyncio, как я могу сделать эту работу? Где я это неправильно структурировал?
2) при условии, что это правильный подход, как я могу передать параметр id?
3) Когда оно выполнит свою работу, как я могу остановить его?
Спасибо!