This commit is contained in:
Geoff Taylor 2021-08-25 17:09:03 +01:00
commit 8c8ebdc7ae
3 changed files with 28 additions and 12 deletions

View File

@ -76,16 +76,27 @@ class ModelState:
return self.asks_watcher.latest return self.asks_watcher.latest
@property @property
def top_bid(self) -> mango.Order: def top_bid(self) -> typing.Union[mango.Order, None]:
return self.bids_watcher.latest[0] if self.bids_watcher.latest:
return self.bids_watcher.latest[0]
else:
return None
@property @property
def top_ask(self) -> mango.Order: def top_ask(self) -> typing.Union[mango.Order, None]:
return self.asks_watcher.latest[0] if self.asks_watcher.latest:
return self.asks_watcher.latest[0]
else:
return None
@property @property
def spread(self) -> Decimal: def spread(self) -> Decimal:
return self.top_ask.price - self.top_bid.price top_ask = self.top_ask
top_bid = self.top_bid
if top_ask is None or top_bid is None:
return Decimal(0)
else:
return self.top_ask.price - self.top_bid.price
@property @property
def existing_orders(self) -> typing.Sequence[mango.PlacedOrder]: def existing_orders(self) -> typing.Sequence[mango.PlacedOrder]:

View File

@ -62,7 +62,10 @@ class ConfidenceIntervalSpreadElement(Element):
new_orders.sort(key=lambda ord: ord.price, reverse=True) new_orders.sort(key=lambda ord: ord.price, reverse=True)
order_text = "\n ".join([f"{order}" for order in new_orders]) order_text = "\n ".join([f"{order}" for order in new_orders])
self.logger.debug(f"""Initial desired orders - spread {model_state.spread} ({model_state.top_bid.price} / {model_state.top_ask.price}):
top_bid = model_state.top_bid
top_ask = model_state.top_ask
self.logger.debug(f"""Initial desired orders - spread {model_state.spread} ({top_bid.price if top_bid else None} / {top_ask.price if top_ask else None}):
{order_text}""") {order_text}""")
return new_orders return new_orders

View File

@ -33,17 +33,19 @@ class PreventPostOnlyCrossingBookElement(Element):
new_orders: typing.List[mango.Order] = [] new_orders: typing.List[mango.Order] = []
for order in orders: for order in orders:
if order.order_type == mango.OrderType.POST_ONLY: if order.order_type == mango.OrderType.POST_ONLY:
if order.side == mango.Side.BUY and order.price >= model_state.top_bid.price: top_bid = model_state.top_bid
new_buy_price: Decimal = model_state.top_bid.price - model_state.market.lot_size_converter.tick_size top_ask = model_state.top_ask
if order.side == mango.Side.BUY and top_bid is not None and order.price >= top_bid.price:
new_buy_price: Decimal = top_bid.price - model_state.market.lot_size_converter.tick_size
new_buy: mango.Order = order.with_price(new_buy_price) new_buy: mango.Order = order.with_price(new_buy_price)
self.logger.debug(f"""Order change - would cross the orderbook {model_state.top_bid.price} / {model_state.top_ask.price}: self.logger.debug(f"""Order change - would cross the orderbook {top_bid.price} / {top_ask.price if top_ask else None}:
Old: {order} Old: {order}
New: {new_buy}""") New: {new_buy}""")
new_orders += [new_buy] new_orders += [new_buy]
elif order.side == mango.Side.SELL and order.price <= model_state.top_ask.price: elif order.side == mango.Side.SELL and top_ask is not None and order.price <= top_ask.price:
new_sell_price: Decimal = model_state.top_ask.price + model_state.market.lot_size_converter.tick_size new_sell_price: Decimal = top_ask.price + model_state.market.lot_size_converter.tick_size
new_sell: mango.Order = order.with_price(new_sell_price) new_sell: mango.Order = order.with_price(new_sell_price)
self.logger.debug(f"""Order change - would cross the orderbook {model_state.top_bid.price} / {model_state.top_ask.price}: self.logger.debug(f"""Order change - would cross the orderbook {top_bid.price if top_bid else None} / {top_ask.price}:
Old: {order} Old: {order}
New: {new_sell}""") New: {new_sell}""")
new_orders += [new_sell] new_orders += [new_sell]