Th0rgal / binance.py

A python3 binance API (v3) wrapper powered by modern technologies such as asyncio. The project aims to rival python-binance.
https://th0rgal.gitbook.io/binance-py/
MIT License
59 stars 19 forks source link

Try to start user_event_listener #23

Closed DogsTailFarmer closed 3 years ago

DogsTailFarmer commented 3 years ago

HI!

I'm trying to start user event listener and can't get any result. Can you help me for some example, please? My code below. Whats wrong? For public events all work - on_price_change(event) for example.

Thank's, Jerry.

# v 0.1a

import setup
import asyncio
# import json
import binance
from datetime import datetime
import time
import functools
import math
import signal
import martin_scale as ms
# from margin_strategy_sdk import *

SYMBOL = 'BTCUSDT'

def heartbeat():
    while True:
        # last_state = _strategy.save_strategy_state()
        # print(last_state)
        print('tik-tak ', datetime.utcnow())
        time.sleep(2)

async def on_price_change(event):
    await asyncio.sleep(5)
    print(
        f"symbol: {event.symbol},"
        f" best bid: {event.best_bid_quantity}×{event.best_bid_price},"
        f" best ask: {event.best_ask_quantity}×{event.best_ask_price}"
    )
    asyncio.create_task(foo())

async def foo() -> None:
    # await asyncio.sleep(5)
    print(datetime.utcnow())
    print("this can contain await instructions without blocking the code")

async def on_funds_update(wrapped_event):
    print(wrapped_event)

def ask_exit(sig_name, _loop):
    print(f"Got signal {sig_name}: exit")
    _loop.stop()

async def refresh(_client, _base_asset, _quote_asset):
    while True:
        print('Time to refresh')
        await asyncio.sleep(3)

async def main():
    client = binance.Client(setup.api_key, setup.api_secret, endpoint='https://testnet.binance.vision')
    # we load the client (this is not mandatory but it allows binance.py
    # to prevent you if you entered a wrong token name for example)
    await client.load()

    # Init section
    # account_info = await client.fetch_account_information(receive_window=None)
    # print(account_info)

    exchange_info = await client.fetch_exchange_info()
    exchange_info_symbol = next(item for item in exchange_info.get('symbols') if item["symbol"] == SYMBOL)
    # print(exchange_info_symbol)
    base_asset = exchange_info_symbol.get('baseAsset')
    quote_asset = exchange_info_symbol.get('quoteAsset')

    # loop.create_task(refresh(client, base_asset, quote_asset))

    # we register the events client.events.register_event(on_price_update, "ethbtc@bookTicker")
    # client.events.register_event(on_price_change, SYMBOL.lower()+"@bookTicker")

    client.events.register_user_event(on_funds_update, "outboundAccountPosition")

    # Start section
    # Start the data stream
    # loop.create_task(client.start_market_events_listener())
    loop.create_task(client.start_user_events_listener())

    for sig_name in {'SIGINT', 'SIGTERM'}:
        loop.add_signal_handler(getattr(signal, sig_name), functools.partial(ask_exit, sig_name, loop))

    print('End main')

if __name__ == "__main__":

    loop = asyncio.get_event_loop()
    loop.create_task(main())
    # loop.run_in_executor(None, functools.partial(heartbeat, m_strategy))
    loop.run_in_executor(None, heartbeat)
    # because we don't want to exit but wait for events
    loop.run_forever()
    loop.close()
    print('End __main__')
Th0rgal commented 3 years ago

Hey there!

So you currently do no see the print from on_funds_update?

Thomas

DogsTailFarmer commented 3 years ago

Yes, not see. May be it because I'm use account on endpoint='https://testnet.binance.vision' ?

Jerry.

Th0rgal commented 3 years ago

Hmmm it might be related. It was working fine when I tried to use the test endpoints. Can you try the examples?

DogsTailFarmer commented 3 years ago

OK I'm just find, for test net it's necessary use endpoint parameter:

loop.create_task(client.start_user_events_listener(endpoint='wss://testnet.binance.vision/ws'))
DogsTailFarmer commented 3 years ago

Thank's for reaction! Jerry.