fix kraken bug, allow for live order edits

no_orderid_in_error
Konstantine Tsafatinos 2022-04-10 20:03:47 -04:00
parent 3ac9c55535
commit 250d9cbc03
1 changed files with 44 additions and 36 deletions

View File

@ -33,7 +33,6 @@ import tractor
from pydantic.dataclasses import dataclass from pydantic.dataclasses import dataclass
from pydantic import BaseModel from pydantic import BaseModel
import wsproto import wsproto
import itertools
import urllib.parse import urllib.parse
import hashlib import hashlib
import hmac import hmac
@ -161,13 +160,6 @@ def get_config() -> dict[str, Any]:
conf, path = config.load() conf, path = config.load()
section = conf.get('kraken') section = conf.get('kraken')
if section:
log.warning(
'Kraken order mode is currently disabled due to bug!\n'
'See https://github.com/pikers/piker/issues/299'
)
return {}
if section is None: if section is None:
log.warning(f'No config section found for kraken in {path}') log.warning(f'No config section found for kraken in {path}')
return {} return {}
@ -313,29 +305,41 @@ class Client:
price: float, price: float,
action: str, action: str,
size: float, size: float,
reqid: int = None, reqid: str = None,
) -> int: ) -> dict:
''' '''
Place an order and return integer request id provided by client. Place an order and return integer request id provided by client.
''' '''
# Build order data for kraken api if reqid is None:
data = { # Build order data for kraken api
"userref": reqid, data = {
"ordertype": "limit", "ordertype": "limit",
"type": action, "type": action,
"volume": str(size), "volume": str(size),
"pair": symbol, "pair": symbol,
"price": str(price), "price": str(price),
# set to True test AddOrder call without a real submission # set to True test AddOrder call without a real submission
"validate": False "validate": False
} }
return await self.endpoint('AddOrder', data) return await self.endpoint('AddOrder', data)
else:
# Edit order data for kraken api
data = {
"txid": reqid,
"pair": symbol,
"price": str(price),
# set to True test EditOrder call without a real submission
"validate": False
}
return await self.endpoint('EditOrder', data)
async def submit_cancel( async def submit_cancel(
self, self,
reqid: str, reqid: str,
) -> None: ) -> dict:
''' '''
Send cancel request for order id ``reqid``. Send cancel request for order id ``reqid``.
@ -546,7 +550,6 @@ async def handle_order_requests(
request_msg: dict request_msg: dict
order: BrokerdOrder order: BrokerdOrder
userref_counter = itertools.count()
async for request_msg in ems_order_stream: async for request_msg in ems_order_stream:
log.info(f'Received order request {request_msg}') log.info(f'Received order request {request_msg}')
@ -575,9 +578,7 @@ async def handle_order_requests(
continue continue
# validate # validate
temp_id = next(userref_counter)
order = BrokerdOrder(**request_msg) order = BrokerdOrder(**request_msg)
# call our client api to submit the order # call our client api to submit the order
resp = await client.submit_limit( resp = await client.submit_limit(
oid=order.oid, oid=order.oid,
@ -585,7 +586,7 @@ async def handle_order_requests(
price=order.price, price=order.price,
action=order.action, action=order.action,
size=order.size, size=order.size,
reqid=temp_id, reqid=order.reqid,
) )
err = resp['error'] err = resp['error']
@ -596,16 +597,21 @@ async def handle_order_requests(
await ems_order_stream.send( await ems_order_stream.send(
BrokerdError( BrokerdError(
oid=order.oid, oid=order.oid,
reqid=temp_id, reqid=order.reqid,
symbol=order.symbol, symbol=order.symbol,
reason="Failed order submission", reason="Failed order submission",
broker_details=resp broker_details=resp
).dict() ).dict()
) )
else: else:
# TODO: handle multiple cancels # TODO: handle multiple orders (cancels?)
# txid is an array of strings # txid is an array of strings
reqid = resp['result']['txid'][0] if order.reqid is None:
reqid = resp['result']['txid'][0]
else:
# update the internal pairing of oid to krakens
# txid with the new txid that is returned on edit
reqid = resp['result']['txid']
# deliver ack that order has been submitted to broker routing # deliver ack that order has been submitted to broker routing
await ems_order_stream.send( await ems_order_stream.send(
BrokerdOrderAck( BrokerdOrderAck(
@ -642,9 +648,9 @@ async def handle_order_requests(
await ems_order_stream.send( await ems_order_stream.send(
BrokerdError( BrokerdError(
oid=order.oid, oid=msg.oid,
reqid=temp_id, reqid=msg.reqid,
symbol=order.symbol, symbol=msg.symbol,
reason="Failed order cancel", reason="Failed order cancel",
broker_details=resp broker_details=resp
).dict() ).dict()
@ -668,9 +674,11 @@ async def handle_order_requests(
await ems_order_stream.send( await ems_order_stream.send(
BrokerdError( BrokerdError(
oid=order.oid, oid=msg.oid,
reqid=temp_id, reqid=msg.reqid,
symbol=order.symbol, symbol=msg.symbol,
# TODO: maybe figure out if pending cancels will
# eventually get cancelled
reason="Order cancel is still pending?", reason="Order cancel is still pending?",
broker_details=resp broker_details=resp
).dict() ).dict()