Fill clearable prices asap
parent
d8b157d209
commit
38b2e99002
|
@ -163,18 +163,6 @@ class PaperBoi:
|
|||
# {'local_trades': (event_name, msg)}
|
||||
reqid = str(uuid.uuid4())
|
||||
|
||||
# register this submissions as a paper live order
|
||||
if action == 'buy':
|
||||
orders = self._buys
|
||||
|
||||
elif action == 'sell':
|
||||
orders = self._sells
|
||||
|
||||
# buys/sells: (symbol -> (price -> order))
|
||||
orders.setdefault(symbol, {})[price] = (size, oid, reqid, action)
|
||||
|
||||
self._reqids[reqid] = (oid, symbol, action, price)
|
||||
|
||||
# TODO: net latency model
|
||||
# we checkpoint here quickly particulalry
|
||||
# for dark orders since we want the dark_executed
|
||||
|
@ -198,6 +186,30 @@ class PaperBoi:
|
|||
},
|
||||
}),
|
||||
})
|
||||
|
||||
# register order internally
|
||||
self._reqids[reqid] = (oid, symbol, action, price)
|
||||
|
||||
# if we're already a clearing price simulate an immediate fill
|
||||
if (
|
||||
action == 'buy' and (clear_price := self.last_ask[0]) <= price
|
||||
) or (
|
||||
action == 'sell' and (clear_price := self.last_bid[0]) >= price
|
||||
):
|
||||
await self.fake_fill(clear_price, size, action, reqid, oid)
|
||||
|
||||
else: # register this submissions as a paper live order
|
||||
|
||||
# submit order to book simulation fill loop
|
||||
if action == 'buy':
|
||||
orders = self._buys
|
||||
|
||||
elif action == 'sell':
|
||||
orders = self._sells
|
||||
|
||||
# buys/sells: (symbol -> (price -> order))
|
||||
orders.setdefault(symbol, {})[price] = (size, oid, reqid, action)
|
||||
|
||||
return reqid
|
||||
|
||||
async def submit_cancel(
|
||||
|
@ -327,30 +339,26 @@ async def simulate_fills(
|
|||
async for quotes in quote_stream:
|
||||
for sym, quote in quotes.items():
|
||||
|
||||
buys, sells = client._buys.get(sym), client._sells.get(sym)
|
||||
|
||||
if not (buys or sells):
|
||||
continue
|
||||
|
||||
for tick in iterticks(
|
||||
quote,
|
||||
# dark order price filter(s)
|
||||
types=('ask', 'bid', 'trade', 'last')
|
||||
):
|
||||
print(tick)
|
||||
# print(tick)
|
||||
tick_price = tick.get('price')
|
||||
ttype = tick['type']
|
||||
|
||||
if ttype in ('ask',) and buys:
|
||||
if ttype in ('ask',):
|
||||
|
||||
client.last_ask = (
|
||||
tick_price,
|
||||
tick.get('size', client.last_ask[1]),
|
||||
)
|
||||
|
||||
buys = client._buys.get(sym, {})
|
||||
|
||||
# iterate book prices descending
|
||||
for our_bid in reversed(sorted(buys.keys())):
|
||||
|
||||
if tick_price < our_bid:
|
||||
|
||||
# retreive order info
|
||||
|
@ -370,16 +378,17 @@ async def simulate_fills(
|
|||
# we're done
|
||||
break
|
||||
|
||||
if ttype in ('bid',) and sells:
|
||||
if ttype in ('bid',):
|
||||
|
||||
client.last_bid = (
|
||||
tick_price,
|
||||
tick.get('size', client.last_bid[1]),
|
||||
)
|
||||
|
||||
sells = client._sells.get(sym, {})
|
||||
|
||||
# iterate book prices ascending
|
||||
for our_ask in sorted(sells.keys()):
|
||||
|
||||
client.last_bid = (
|
||||
tick_price,
|
||||
tick.get('bid', client.last_bid[1]),
|
||||
)
|
||||
|
||||
if tick_price > our_ask:
|
||||
|
||||
# retreive order info
|
||||
|
|
Loading…
Reference in New Issue