Skip to content

Commit f7a4339

Browse files
committed
feat: fill-time slippage/commission, partial fills, volume impact model
- Move slippage/commission from order creation to fill time in SimulationBlotter, eliminating double-counting - Add VolumeImpactSlippage model (power-law market impact) - Add FillModel ABC with FullFill and VolumeBasedFill for partial fill simulation - Refactor BacktestTradeOrderEvaluator to delegate to blotter methods (get_fill_price, get_fill_commission, get_fill_amount, on_fill) with TradingCost fallback - Record transactions at fill time via blotter.on_fill() - Clean test_eventloop.py: remove ~500 lines of commented-out code - Update test_blotter.py for new fill-time architecture
1 parent 44fd90a commit f7a4339

11 files changed

Lines changed: 568 additions & 729 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,3 +161,4 @@ venv
161161
examples/tutorial/data
162162
examples/tutorial/backtest_results
163163
examples/tutorial/resources
164+
.data_cache/

docusaurus/docs/Advanced Concepts/blotter.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ class SmartOrderRouter(Blotter):
261261
order1 = context.order_service.create(order_data)
262262
order2 = context.order_service.create(order_data)
263263
return order1 # Return the first order
264-
264+
265265
return context.order_service.create(order_data)
266266

267267
def cancel_order(self, order_id, context):
@@ -271,7 +271,7 @@ class SmartOrderRouter(Blotter):
271271
order = context.order_service.get(order_id)
272272
if order is None:
273273
raise Exception(f"Order {order_id} not found")
274-
274+
275275
context.order_service.update(
276276
order_id, {"status": "CANCELED"}
277277
)

investing_algorithm_framework/__init__.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727
retag_backtests, \
2828
Blotter, DefaultBlotter, SimulationBlotter, Transaction, \
2929
SlippageModel, NoSlippage, PercentageSlippage, FixedSlippage, \
30-
CommissionModel, NoCommission, PercentageCommission, FixedCommission
30+
VolumeImpactSlippage, \
31+
CommissionModel, NoCommission, PercentageCommission, FixedCommission, \
32+
FillModel, FullFill, VolumeBasedFill
3133
from .infrastructure import AzureBlobStorageStateHandler, \
3234
CSVOHLCVDataProvider, CSVTickerDataProvider, CSVURLDataProvider, \
3335
JSONURLDataProvider, ParquetURLDataProvider, \
@@ -241,8 +243,12 @@
241243
"NoSlippage",
242244
"PercentageSlippage",
243245
"FixedSlippage",
246+
"VolumeImpactSlippage",
244247
"CommissionModel",
245248
"NoCommission",
246249
"PercentageCommission",
247250
"FixedCommission",
251+
"FillModel",
252+
"FullFill",
253+
"VolumeBasedFill",
248254
]

investing_algorithm_framework/domain/__init__.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727
from .portfolio_provider import PortfolioProvider
2828
from .blotter import Blotter, DefaultBlotter, SimulationBlotter, Transaction, \
2929
SlippageModel, NoSlippage, PercentageSlippage, FixedSlippage, \
30-
CommissionModel, NoCommission, PercentageCommission, FixedCommission
30+
VolumeImpactSlippage, \
31+
CommissionModel, NoCommission, PercentageCommission, FixedCommission, \
32+
FillModel, FullFill, VolumeBasedFill
3133
from .services import MarketCredentialService, AbstractPortfolioSyncService, \
3234
RoundingService, StateHandler
3335
from .stateless_actions import StatelessActions
@@ -163,8 +165,12 @@
163165
"NoSlippage",
164166
"PercentageSlippage",
165167
"FixedSlippage",
168+
"VolumeImpactSlippage",
166169
"CommissionModel",
167170
"NoCommission",
168171
"PercentageCommission",
169172
"FixedCommission",
173+
"FillModel",
174+
"FullFill",
175+
"VolumeBasedFill",
170176
]

0 commit comments

Comments
 (0)