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)
order_reconciler: mango.marketmaking.OrderReconciler
if args.existing_order_tolerance < 0:
order_reconciler = mango.marketmaking.AlwaysReplaceOrderReconciler()
else:
order_reconciler = mango.marketmaking.ToleranceOrderReconciler(
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 .modelstatebuilderfactory import ModelUpdateMode as ModelUpdateMode
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 OrderReconciler as OrderReconciler
from .reconciledorders import ReconciledOrders as ReconciledOrders

View File

@ -58,3 +58,21 @@ class NullOrderReconciler(OrderReconciler):
def __str__(self) -> str:
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 mango.marketmaking.orderreconciler import NullOrderReconciler
from mango.marketmaking.orderreconciler import NullOrderReconciler, AlwaysReplaceOrderReconciler
from ..fakes import fake_model_state
@ -23,3 +23,25 @@ def test_nulloperation() -> None:
assert result.to_keep == existing
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