binance: dynamically choose the rest method
Instead of having a buncha logic branches for 'get', 'post', etc. just pass the `method: str` and do a attr lookup on the `asks` sesh. Also, adjust the `trades_dialogue()` ep to switch to paper mode when no client API key is detected/loaded.basic_buy_bot
parent
bc4ded2662
commit
f99e8fe7eb
|
@ -21,6 +21,7 @@
|
||||||
Binance backend
|
Binance backend
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from contextlib import (
|
from contextlib import (
|
||||||
asynccontextmanager as acm,
|
asynccontextmanager as acm,
|
||||||
|
@ -40,6 +41,8 @@ import hmac
|
||||||
import time
|
import time
|
||||||
import decimal
|
import decimal
|
||||||
import hashlib
|
import hashlib
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
import trio
|
import trio
|
||||||
from trio_typing import TaskStatus
|
from trio_typing import TaskStatus
|
||||||
import pendulum
|
import pendulum
|
||||||
|
@ -87,13 +90,16 @@ log = get_logger('piker.brokers.binance')
|
||||||
|
|
||||||
|
|
||||||
def get_config() -> dict:
|
def get_config() -> dict:
|
||||||
|
|
||||||
|
conf: dict
|
||||||
|
path: Path
|
||||||
conf, path = config.load()
|
conf, path = config.load()
|
||||||
|
|
||||||
section = conf.get('binance')
|
section = conf.get('binance')
|
||||||
|
|
||||||
if not section:
|
if not section:
|
||||||
log.warning(f'No config section found for binance in {path}')
|
log.warning(f'No config section found for binance in {path}')
|
||||||
return dict()
|
return {}
|
||||||
|
|
||||||
return section
|
return section
|
||||||
|
|
||||||
|
@ -225,12 +231,12 @@ class Client:
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
self._sesh = asks.Session(connections=4)
|
self._sesh = asks.Session(connections=4)
|
||||||
self._sesh.base_location = _url
|
self._sesh.base_location: str = _url
|
||||||
self._pairs: dict[str, Pair] = {}
|
self._pairs: dict[str, Pair] = {} # mkt info table
|
||||||
|
|
||||||
conf = get_config()
|
conf = get_config()
|
||||||
self.api_key = conf.get('api', {}).get('key')
|
self.api_key: str = conf.get('api_key', '')
|
||||||
self.api_secret = conf.get('api', {}).get('secret')
|
self.api_secret: str = conf.get('api_secret', '')
|
||||||
|
|
||||||
if self.api_key:
|
if self.api_key:
|
||||||
self._sesh.headers.update({'X-MBX-APIKEY': self.api_key})
|
self._sesh.headers.update({'X-MBX-APIKEY': self.api_key})
|
||||||
|
@ -255,7 +261,7 @@ class Client:
|
||||||
async def _api(
|
async def _api(
|
||||||
self,
|
self,
|
||||||
method: str,
|
method: str,
|
||||||
params: Union[dict, OrderedDict],
|
params: dict | OrderedDict,
|
||||||
signed: bool = False,
|
signed: bool = False,
|
||||||
action: str = 'get'
|
action: str = 'get'
|
||||||
) -> dict[str, Any]:
|
) -> dict[str, Any]:
|
||||||
|
@ -263,15 +269,7 @@ class Client:
|
||||||
if signed:
|
if signed:
|
||||||
params['signature'] = self._get_signature(params)
|
params['signature'] = self._get_signature(params)
|
||||||
|
|
||||||
if action == 'get':
|
resp = await getattr(self._sesh, action)(
|
||||||
resp = await self._sesh.get(
|
|
||||||
path=f'/api/v3/{method}',
|
|
||||||
params=params,
|
|
||||||
timeout=float('inf')
|
|
||||||
)
|
|
||||||
|
|
||||||
elif action == 'post':
|
|
||||||
resp = await self._sesh.post(
|
|
||||||
path=f'/api/v3/{method}',
|
path=f'/api/v3/{method}',
|
||||||
params=params,
|
params=params,
|
||||||
timeout=float('inf')
|
timeout=float('inf')
|
||||||
|
@ -830,21 +828,28 @@ async def handle_order_requests(
|
||||||
async def trades_dialogue(
|
async def trades_dialogue(
|
||||||
ctx: tractor.Context,
|
ctx: tractor.Context,
|
||||||
loglevel: str = None
|
loglevel: str = None
|
||||||
|
|
||||||
) -> AsyncIterator[dict[str, Any]]:
|
) -> AsyncIterator[dict[str, Any]]:
|
||||||
|
|
||||||
# XXX: required to propagate ``tractor`` loglevel to piker logging
|
async with open_cached_client('binance') as client:
|
||||||
get_console_log(loglevel or tractor.current_actor().loglevel)
|
if not client.api_key:
|
||||||
|
await ctx.started('paper')
|
||||||
|
return
|
||||||
|
|
||||||
positions = {} # TODO: get already open pos
|
# table: PpTable
|
||||||
|
# ledger: TransactionLedger
|
||||||
|
|
||||||
await ctx.started(positions, {})
|
# TODO: load pps and accounts using accounting apis!
|
||||||
|
# positions: dict = {}
|
||||||
|
# accounts: set[str] = set()
|
||||||
|
# await ctx.started((positions, {}))
|
||||||
|
|
||||||
async with (
|
# async with (
|
||||||
ctx.open_stream() as ems_stream,
|
# ctx.open_stream() as ems_stream,
|
||||||
trio.open_nursery() as n
|
# trio.open_nursery() as n
|
||||||
):
|
# ):
|
||||||
n.start_soon(handle_order_requests, ems_stream)
|
# n.start_soon(handle_order_requests, ems_stream)
|
||||||
await trio.sleep_forever()
|
# await trio.sleep_forever()
|
||||||
|
|
||||||
|
|
||||||
@tractor.context
|
@tractor.context
|
||||||
|
|
Loading…
Reference in New Issue