Delegate paper engine pp tracking to new type

lifo_pps_ib
Tyler Goodlet 2022-06-08 12:37:44 -04:00
parent add0e92335
commit f768576060
1 changed files with 12 additions and 25 deletions

View File

@ -31,6 +31,8 @@ import tractor
from dataclasses import dataclass from dataclasses import dataclass
from .. import data from .. import data
from ..data._source import Symbol
from ..pp import Position
from ..data._normalize import iterticks from ..data._normalize import iterticks
from ..data._source import unpack_fqsn from ..data._source import unpack_fqsn
from ..log import get_logger from ..log import get_logger
@ -257,29 +259,13 @@ class PaperBoi:
) )
) )
# "avg position price" calcs # delegate update to `.pp.Position.lifo_update()`
# TODO: eventually it'd be nice to have a small set of routines pp = Position(
# to do this stuff from a sequence of cleared orders to enable Symbol(key=symbol),
# so called "contextual positions". size=pp_msg.size,
new_size = size + pp_msg.size avg_price=pp_msg.avg_price,
)
# old size minus the new size gives us size differential with pp_msg.size, pp_msg.avg_price = pp.lifo_update(size, price)
# +ve -> increase in pp size
# -ve -> decrease in pp size
size_diff = abs(new_size) - abs(pp_msg.size)
if new_size == 0:
pp_msg.avg_price = 0
elif size_diff > 0:
# only update the "average position price" when the position
# size increases not when it decreases (i.e. the position is
# being made smaller)
pp_msg.avg_price = (
abs(size) * price + pp_msg.avg_price * abs(pp_msg.size)
) / abs(new_size)
pp_msg.size = new_size
await self.ems_trades_stream.send(pp_msg.dict()) await self.ems_trades_stream.send(pp_msg.dict())
@ -390,7 +376,8 @@ async def handle_order_requests(
account = request_msg['account'] account = request_msg['account']
if account != 'paper': if account != 'paper':
log.error( log.error(
'This is a paper account, only a `paper` selection is valid' 'This is a paper account,'
' only a `paper` selection is valid'
) )
await ems_order_stream.send(BrokerdError( await ems_order_stream.send(BrokerdError(
oid=request_msg['oid'], oid=request_msg['oid'],
@ -464,7 +451,7 @@ async def trades_dialogue(
# TODO: load paper positions per broker from .toml config file # TODO: load paper positions per broker from .toml config file
# and pass as symbol to position data mapping: ``dict[str, dict]`` # and pass as symbol to position data mapping: ``dict[str, dict]``
# await ctx.started(all_positions) # await ctx.started(all_positions)
await ctx.started(({}, {'paper',})) await ctx.started(({}, ['paper']))
async with ( async with (
ctx.open_stream() as ems_stream, ctx.open_stream() as ems_stream,