Используя 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) Когда оно выполнит свою работу, как я могу остановить его?

Спасибо!

0 ответов

Другие вопросы по тегам