Added an AlwaysReplaceOrderReconciler.

This commit is contained in:
Geoff Taylor 2022-01-14 17:44:07 +00:00
parent d0d9fc45c1
commit a96099511d
4 changed files with 48 additions and 3 deletions

View File

@ -131,6 +131,10 @@ if args.hedging_market is not None:
args.hedging_max_chunk_quantity, target_balance, args.hedging_action_threshold) args.hedging_max_chunk_quantity, target_balance, args.hedging_action_threshold)
order_reconciler: mango.marketmaking.OrderReconciler
if args.existing_order_tolerance < 0:
order_reconciler = mango.marketmaking.AlwaysReplaceOrderReconciler()
else:
order_reconciler = mango.marketmaking.ToleranceOrderReconciler( order_reconciler = mango.marketmaking.ToleranceOrderReconciler(
args.existing_order_tolerance, args.existing_order_tolerance) args.existing_order_tolerance, args.existing_order_tolerance)

View File

@ -16,6 +16,7 @@ from .modelstatebuilder import SpotPollingModelStateBuilder as SpotPollingModelS
from .modelstatebuilder import WebsocketModelStateBuilder as WebsocketModelStateBuilder from .modelstatebuilder import WebsocketModelStateBuilder as WebsocketModelStateBuilder
from .modelstatebuilderfactory import ModelUpdateMode as ModelUpdateMode from .modelstatebuilderfactory import ModelUpdateMode as ModelUpdateMode
from .modelstatebuilderfactory import model_state_builder_factory as model_state_builder_factory from .modelstatebuilderfactory import model_state_builder_factory as model_state_builder_factory
from .orderreconciler import AlwaysReplaceOrderReconciler as AlwaysReplaceOrderReconciler
from .orderreconciler import NullOrderReconciler as NullOrderReconciler from .orderreconciler import NullOrderReconciler as NullOrderReconciler
from .orderreconciler import OrderReconciler as OrderReconciler from .orderreconciler import OrderReconciler as OrderReconciler
from .reconciledorders import ReconciledOrders as ReconciledOrders from .reconciledorders import ReconciledOrders as ReconciledOrders

View File

@ -58,3 +58,21 @@ class NullOrderReconciler(OrderReconciler):
def __str__(self) -> str: def __str__(self) -> str:
return """« NullOrderReconciler »""" return """« NullOrderReconciler »"""
# # 🥭 AlwaysReplaceOrderReconciler class
#
# Implementation of OrderReconciler that never keeps orders, just always cancels and replaces.
#
class AlwaysReplaceOrderReconciler(OrderReconciler):
def __init__(self) -> None:
super().__init__()
def reconcile(self, _: ModelState, existing_orders: typing.Sequence[mango.Order], desired_orders: typing.Sequence[mango.Order]) -> ReconciledOrders:
outcomes: ReconciledOrders = ReconciledOrders()
outcomes.to_cancel = list(existing_orders)
outcomes.to_place = list(desired_orders)
return outcomes
def __str__(self) -> str:
return """« AlwaysReplaceOrderReconciler »"""

View File

@ -2,7 +2,7 @@ import mango
from decimal import Decimal from decimal import Decimal
from mango.marketmaking.orderreconciler import NullOrderReconciler from mango.marketmaking.orderreconciler import NullOrderReconciler, AlwaysReplaceOrderReconciler
from ..fakes import fake_model_state from ..fakes import fake_model_state
@ -23,3 +23,25 @@ def test_nulloperation() -> None:
assert result.to_keep == existing assert result.to_keep == existing
assert result.to_ignore == desired assert result.to_ignore == desired
assert result.to_cancel == []
assert result.to_place == []
def test_alwaysreplace() -> None:
existing = [
mango.Order.from_basic_info(mango.Side.BUY, price=Decimal(1), quantity=Decimal(10)),
mango.Order.from_basic_info(mango.Side.SELL, price=Decimal(2), quantity=Decimal(20))
]
desired = [
mango.Order.from_basic_info(mango.Side.BUY, price=Decimal(3), quantity=Decimal(30)),
mango.Order.from_basic_info(mango.Side.SELL, price=Decimal(4), quantity=Decimal(40))
]
model_state = fake_model_state()
actual = AlwaysReplaceOrderReconciler()
result = actual.reconcile(model_state, existing, desired)
assert result.to_keep == []
assert result.to_ignore == []
assert result.to_cancel == existing
assert result.to_place == desired