Matchify the dark trigger loop
parent
2309e7ab05
commit
ae001c3dd7
|
@ -174,10 +174,9 @@ async def clear_dark_triggers(
|
||||||
)
|
)
|
||||||
):
|
):
|
||||||
price = tick.get('price')
|
price = tick.get('price')
|
||||||
ttype = tick['type']
|
|
||||||
|
|
||||||
# update to keep new cmds informed
|
# update to keep new cmds informed
|
||||||
book.lasts[sym] = price
|
book.lasts[sym] = price
|
||||||
|
ttype = tick['type']
|
||||||
|
|
||||||
for oid, (
|
for oid, (
|
||||||
pred,
|
pred,
|
||||||
|
@ -200,58 +199,54 @@ async def clear_dark_triggers(
|
||||||
# majority of iterations will be non-matches
|
# majority of iterations will be non-matches
|
||||||
continue
|
continue
|
||||||
|
|
||||||
action: str = cmd['action']
|
match cmd:
|
||||||
symbol: str = cmd['symbol']
|
# alert: nothing to do but relay a status
|
||||||
bfqsn: str = symbol.replace(f'.{broker}', '')
|
# back to the requesting ems client
|
||||||
|
case {
|
||||||
|
'action': 'alert',
|
||||||
|
}:
|
||||||
|
resp = 'alert_triggered'
|
||||||
|
|
||||||
if action == 'alert':
|
# executable order submission
|
||||||
# nothing to do but relay a status
|
case {
|
||||||
# message back to the requesting ems client
|
'action': action,
|
||||||
resp = 'alert_triggered'
|
'symbol': symbol,
|
||||||
|
'account': account,
|
||||||
|
'size': size,
|
||||||
|
}:
|
||||||
|
bfqsn: str = symbol.replace(f'.{broker}', '')
|
||||||
|
submit_price = price + abs_diff_away
|
||||||
|
resp = 'dark_triggered' # hidden on client-side
|
||||||
|
|
||||||
else: # executable order submission
|
log.info(
|
||||||
|
f'Dark order triggered for price {price}\n'
|
||||||
|
f'Submitting order @ price {submit_price}')
|
||||||
|
|
||||||
# submit_price = price + price*percent_away
|
live_req = BrokerdOrder(
|
||||||
submit_price = price + abs_diff_away
|
action=action,
|
||||||
|
oid=oid,
|
||||||
|
account=account,
|
||||||
|
time_ns=time.time_ns(),
|
||||||
|
symbol=bfqsn,
|
||||||
|
price=submit_price,
|
||||||
|
size=size,
|
||||||
|
)
|
||||||
|
await brokerd_orders_stream.send(live_req)
|
||||||
|
|
||||||
log.info(
|
# mark this entry as having sent an order
|
||||||
f'Dark order triggered for price {price}\n'
|
# request. the entry will be replaced once the
|
||||||
f'Submitting order @ price {submit_price}')
|
# target broker replies back with
|
||||||
|
# a ``BrokerdOrderAck`` msg including the
|
||||||
|
# allocated unique ``BrokerdOrderAck.reqid`` key
|
||||||
|
# generated by the broker's own systems.
|
||||||
|
book._ems_entries[oid] = live_req
|
||||||
|
|
||||||
msg = BrokerdOrder(
|
case _:
|
||||||
action=cmd['action'],
|
raise ValueError(f'Invalid dark book entry: {cmd}')
|
||||||
oid=oid,
|
|
||||||
account=cmd['account'],
|
|
||||||
time_ns=time.time_ns(),
|
|
||||||
|
|
||||||
# this **creates** new order request for the
|
# fallthrough logic
|
||||||
# underlying broker so we set a "broker
|
resp = Status(
|
||||||
# request id" (``reqid`` kwarg) to ``None``
|
oid=oid, # ems dialog id
|
||||||
# so that the broker client knows that we
|
|
||||||
# aren't trying to modify an existing
|
|
||||||
# order-request and instead create a new one.
|
|
||||||
reqid=None,
|
|
||||||
|
|
||||||
symbol=bfqsn,
|
|
||||||
price=submit_price,
|
|
||||||
size=cmd['size'],
|
|
||||||
)
|
|
||||||
await brokerd_orders_stream.send(msg)
|
|
||||||
|
|
||||||
# mark this entry as having sent an order
|
|
||||||
# request. the entry will be replaced once the
|
|
||||||
# target broker replies back with
|
|
||||||
# a ``BrokerdOrderAck`` msg including the
|
|
||||||
# allocated unique ``BrokerdOrderAck.reqid`` key
|
|
||||||
# generated by the broker's own systems.
|
|
||||||
book._ems_entries[oid] = msg
|
|
||||||
|
|
||||||
# our internal status value for client-side
|
|
||||||
# triggered "dark orders"
|
|
||||||
resp = 'dark_triggered'
|
|
||||||
|
|
||||||
msg = Status(
|
|
||||||
oid=oid, # ems order id
|
|
||||||
time_ns=time.time_ns(),
|
time_ns=time.time_ns(),
|
||||||
resp=resp,
|
resp=resp,
|
||||||
trigger_price=price,
|
trigger_price=price,
|
||||||
|
@ -266,13 +261,14 @@ async def clear_dark_triggers(
|
||||||
f'pred for {oid} was already removed!?'
|
f'pred for {oid} was already removed!?'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# send response to client-side
|
||||||
try:
|
try:
|
||||||
await ems_client_order_stream.send(msg)
|
await ems_client_order_stream.send(resp)
|
||||||
except (
|
except (
|
||||||
trio.ClosedResourceError,
|
trio.ClosedResourceError,
|
||||||
):
|
):
|
||||||
log.warning(
|
log.warning(
|
||||||
f'client {ems_client_order_stream} stream is broke'
|
f'{ems_client_order_stream} stream broke?'
|
||||||
)
|
)
|
||||||
break
|
break
|
||||||
|
|
||||||
|
@ -684,7 +680,6 @@ async def translate_and_relay_brokerd_events(
|
||||||
# about. In most default situations, with composed orders
|
# about. In most default situations, with composed orders
|
||||||
# (ex. brackets), most brokers seem to use a oca policy.
|
# (ex. brackets), most brokers seem to use a oca policy.
|
||||||
|
|
||||||
|
|
||||||
# BrokerdStatus
|
# BrokerdStatus
|
||||||
case {
|
case {
|
||||||
'name': 'status',
|
'name': 'status',
|
||||||
|
|
Loading…
Reference in New Issue