используя Python, как правильно использовать asyncio с ccxt для постоянного мониторинга статуса заказа? - PullRequest
0 голосов
/ 19 февраля 2019

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

Спасибо!

...