Port order mode setup to new pp apis; reduces implicit update logic
parent
5333d25bf6
commit
343cb4b0ae
|
@ -32,7 +32,7 @@ from pydantic import BaseModel
|
||||||
import tractor
|
import tractor
|
||||||
import trio
|
import trio
|
||||||
|
|
||||||
from .. import brokers
|
from .. import config
|
||||||
from ..calc import pnl
|
from ..calc import pnl
|
||||||
from ..clearing._client import open_ems, OrderBook
|
from ..clearing._client import open_ems, OrderBook
|
||||||
from ..data._source import Symbol
|
from ..data._source import Symbol
|
||||||
|
@ -41,7 +41,14 @@ from ..data.feed import Feed
|
||||||
from ..log import get_logger
|
from ..log import get_logger
|
||||||
from ._editors import LineEditor, ArrowEditor
|
from ._editors import LineEditor, ArrowEditor
|
||||||
from ._lines import order_line, LevelLine
|
from ._lines import order_line, LevelLine
|
||||||
from ._position import PositionTracker, SettingsPane, Allocator, _size_units
|
from ._position import (
|
||||||
|
Position,
|
||||||
|
Allocator,
|
||||||
|
mk_allocator,
|
||||||
|
PositionTracker,
|
||||||
|
SettingsPane,
|
||||||
|
_size_units,
|
||||||
|
)
|
||||||
from ._window import MultiStatus
|
from ._window import MultiStatus
|
||||||
from ..clearing._messages import Order
|
from ..clearing._messages import Order
|
||||||
from ._forms import open_form_input_handling
|
from ._forms import open_form_input_handling
|
||||||
|
@ -511,36 +518,91 @@ async def open_order_mode(
|
||||||
lines = LineEditor(chart=chart)
|
lines = LineEditor(chart=chart)
|
||||||
arrows = ArrowEditor(chart, {})
|
arrows = ArrowEditor(chart, {})
|
||||||
|
|
||||||
# load account names from ``brokers.toml``
|
form = chart.sidepane
|
||||||
accounts = bidict(brokers.config.load_accounts())
|
|
||||||
|
|
||||||
# allocator
|
# update any from exising positions received from ``brokerd``
|
||||||
alloc = Allocator(
|
symbol = chart.linked.symbol
|
||||||
symbol=symbol,
|
symkey = chart.linked._symbol.key
|
||||||
account=None, # select paper by default
|
|
||||||
_accounts=accounts,
|
pp_msg = None
|
||||||
size_unit=_size_units['currency'],
|
for sym, msg in positions.items():
|
||||||
units_limit=400,
|
if sym.lower() in symkey:
|
||||||
currency_limit=5e3,
|
pp_msg = msg
|
||||||
slots=4,
|
break
|
||||||
|
|
||||||
|
# net-zero pp
|
||||||
|
startup_pp = Position(
|
||||||
|
symbol=chart.linked.symbol,
|
||||||
|
size=0,
|
||||||
|
avg_price=0,
|
||||||
)
|
)
|
||||||
|
|
||||||
form = chart.sidepane
|
if pp_msg:
|
||||||
|
startup_pp.update_from_msg(msg)
|
||||||
|
|
||||||
|
# load account names from ``brokers.toml``
|
||||||
|
accounts = bidict(config.load_accounts())
|
||||||
|
|
||||||
|
# allocator
|
||||||
|
limit_value, alloc = mk_allocator(
|
||||||
|
alloc=Allocator(
|
||||||
|
symbol=symbol,
|
||||||
|
account=None, # select paper by default
|
||||||
|
_accounts=accounts,
|
||||||
|
size_unit=_size_units['currency'],
|
||||||
|
units_limit=400,
|
||||||
|
currency_limit=5e3,
|
||||||
|
slots=4,
|
||||||
|
),
|
||||||
|
startup_pp=startup_pp,
|
||||||
|
)
|
||||||
form.model = alloc
|
form.model = alloc
|
||||||
|
|
||||||
pp_tracker = PositionTracker(chart, alloc)
|
pp_tracker = PositionTracker(
|
||||||
pp_tracker.hide()
|
chart,
|
||||||
|
alloc,
|
||||||
|
startup_pp
|
||||||
|
)
|
||||||
|
pp_tracker.update_from_pp(startup_pp)
|
||||||
|
|
||||||
|
if startup_pp.size == 0:
|
||||||
|
# if no position, don't show pp tracking graphics
|
||||||
|
pp_tracker.hide()
|
||||||
|
|
||||||
# order pane widgets and allocation model
|
# order pane widgets and allocation model
|
||||||
order_pane = SettingsPane(
|
order_pane = SettingsPane(
|
||||||
tracker=pp_tracker,
|
tracker=pp_tracker,
|
||||||
form=form,
|
form=form,
|
||||||
alloc=alloc,
|
alloc=alloc,
|
||||||
|
|
||||||
|
# XXX: ugh, so hideous...
|
||||||
fill_bar=form.fill_bar,
|
fill_bar=form.fill_bar,
|
||||||
pnl_label=form.left_label,
|
pnl_label=form.left_label,
|
||||||
step_label=form.bottom_label,
|
step_label=form.bottom_label,
|
||||||
limit_label=form.top_label,
|
limit_label=form.top_label,
|
||||||
)
|
)
|
||||||
|
# make fill bar and positioning snapshot
|
||||||
|
# XXX: this need to be called *before* the first
|
||||||
|
# pp tracker update(s) below to ensure the limit size unit has
|
||||||
|
# been correctly set prior to updating the line's pp size label
|
||||||
|
# (the one on the RHS).
|
||||||
|
# TODO: should probably split out the alloc config from the UI
|
||||||
|
# config startup steps..
|
||||||
|
order_pane.on_ui_settings_change('limit', limit_value)
|
||||||
|
order_pane.update_status_ui(size=startup_pp.size)
|
||||||
|
|
||||||
|
# top level abstraction which wraps all this crazyness into
|
||||||
|
# a namespace..
|
||||||
|
mode = OrderMode(
|
||||||
|
chart,
|
||||||
|
book,
|
||||||
|
lines,
|
||||||
|
arrows,
|
||||||
|
multistatus,
|
||||||
|
pp_tracker,
|
||||||
|
allocator=alloc,
|
||||||
|
pane=order_pane,
|
||||||
|
)
|
||||||
|
|
||||||
# XXX: would love to not have to do this separate from edit
|
# XXX: would love to not have to do this separate from edit
|
||||||
# fields (which are done in an async loop - see below)
|
# fields (which are done in an async loop - see below)
|
||||||
|
@ -556,51 +618,12 @@ async def open_order_mode(
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
# top level abstraction which wraps all this crazyness into
|
|
||||||
# a namespace..
|
|
||||||
mode = OrderMode(
|
|
||||||
chart,
|
|
||||||
book,
|
|
||||||
lines,
|
|
||||||
arrows,
|
|
||||||
multistatus,
|
|
||||||
pp_tracker,
|
|
||||||
allocator=alloc,
|
|
||||||
pane=order_pane,
|
|
||||||
)
|
|
||||||
|
|
||||||
# TODO: create a mode "manager" of sorts?
|
# TODO: create a mode "manager" of sorts?
|
||||||
# -> probably just call it "UxModes" err sumthin?
|
# -> probably just call it "UxModes" err sumthin?
|
||||||
# so that view handlers can access it
|
# so that view handlers can access it
|
||||||
view.order_mode = mode
|
view.order_mode = mode
|
||||||
|
|
||||||
our_sym = mode.chart.linked._symbol.key
|
# real-time pnl display task allocation
|
||||||
|
|
||||||
# update any exising position
|
|
||||||
pp_msg = None
|
|
||||||
for sym, msg in positions.items():
|
|
||||||
if sym.lower() in our_sym:
|
|
||||||
pp_msg = msg
|
|
||||||
break
|
|
||||||
|
|
||||||
# make fill bar and positioning snapshot
|
|
||||||
# XXX: this need to be called *before* the first
|
|
||||||
# pp tracker update(s) below to ensure the limit size unit has
|
|
||||||
# been correctly set prior to updating the line's pp size label
|
|
||||||
# (the one on the RHS).
|
|
||||||
# TODO: should probably split out the alloc config from the UI
|
|
||||||
# config startup steps..
|
|
||||||
order_pane.init_status_ui()
|
|
||||||
|
|
||||||
# we should probably make the allocator config
|
|
||||||
# and explitict helper func call that takes in the aloc and
|
|
||||||
# the postion / symbol info then take that alloc ref and
|
|
||||||
# update the pp_tracker and pp_pane?
|
|
||||||
if pp_msg:
|
|
||||||
pp_tracker.update_from_pp_msg(msg)
|
|
||||||
|
|
||||||
order_pane.update_status_ui()
|
|
||||||
|
|
||||||
live_pp = mode.pp.live_pp
|
live_pp = mode.pp.live_pp
|
||||||
size = live_pp.size
|
size = live_pp.size
|
||||||
if size:
|
if size:
|
||||||
|
@ -627,7 +650,6 @@ async def open_order_mode(
|
||||||
# set 0% pnl
|
# set 0% pnl
|
||||||
mode.pane.pnl_label.format(pnl=0)
|
mode.pane.pnl_label.format(pnl=0)
|
||||||
|
|
||||||
|
|
||||||
# Begin order-response streaming
|
# Begin order-response streaming
|
||||||
done()
|
done()
|
||||||
|
|
||||||
|
@ -751,7 +773,8 @@ async def process_trades_and_update_ui(
|
||||||
|
|
||||||
sym = mode.chart.linked.symbol
|
sym = mode.chart.linked.symbol
|
||||||
if msg['symbol'].lower() in sym.key:
|
if msg['symbol'].lower() in sym.key:
|
||||||
tracker.update_from_pp_msg(msg)
|
tracker.live_pp.update_from_msg(msg)
|
||||||
|
tracker.update_from_pp()
|
||||||
|
|
||||||
# update order pane widgets
|
# update order pane widgets
|
||||||
mode.pane.update_status_ui()
|
mode.pane.update_status_ui()
|
||||||
|
|
Loading…
Reference in New Issue