Exchange Execution Simulator - stock exchange single bar execution simulator
Project description
XXSim
Exchange Execution Simulator, development package. This package simulates order(s) execution based on provided market OHLCV data. This is not an independent package, but its the core logic required to implement backtesting when it comes on running on candlebar data.
This is the first drop and wasn't tested out in the wild yet, more functionality and capabilities to come
disclaimer
Own risk warning - Execution prices are best estimations base on worst case scenarios and statistics, there will be price differences between simulations and real-world execution, using this package the user acknowledges his consent and takes full responsibility on the implications caused due to any error or misinterpetation of this package and it's results.
Trailing commands warning - Trailing commands are currently roughly estimated and carry high deviation from the real world
The challenge
Core Problem: Reconstructing intra-bar price movement to determine order execution.
The golden standard of market data comes in chunks of Candle-bars providing Open, High, Low, Close and Volume of predefined time range ie. 1-minute, 5-minutes, an hour, a day, a week, a month, etc... Within each such data-unit there is a gap of the inner price motions, unless you work with tick-by-tick data which is expensive, noisy and resource intense. On top of that, fill prices are results of a consiquent rules and formations that are hard to simulate.
The solution
Output: Realistic execution fills within statistical uncertainty. or consiquent order either original or modified.
XSim relies on OHLC Data to simulate the inner motion of prices within single data-unit, and attempt to perform a set of decision to execute orders in the most authentic way.
Supported order types
- MarketOrder
- LimitOrder
- StopOrder
- StopLimitOrder
- TrailingStopMarket
Not supported order types (at the moment)
- Trailing Stop Limit Orders
- Market-on-Close (MOC) / Limit-on-Close (LOC)
- Market-if-Touched (MIT)
- Others...
Current Execution algorithm assumptions
- Optional slippage model — volatility-based normal distribution slippage, configurable via
ExecutionConfigslippage_model="none"(default): deterministic fills at exact priceslippage_model="normal": slippage drawn fromN(0, bar_range / std_divider)- Direction-aware: slippage magnitude scales with bar direction (adverse = full, favorable = 25%)
- Trail orders use next price fragment for direction instead of overall bar direction
- Result always clamped to
[bar.low, bar.high] - Seeded RNG via
random_seedfor reproducible backtests
- No partial fills
- Aggressive approach - Order will be filled if there's a possible path between order's formation and the candlebar.
- Trail orders assume the following order of the candles: On Bullish bar: prev_extremePrice [optional] -> open -> low -> high -> close On Bearish bar: prev_extremePrice [optional] -> open -> high -> low -> close
Installation
pip install XXSim
Usage
Single-Bar Execution
For direct single-bar execution using the low-level engine:
from XXSim import ExecutionEngine, MarketOrder, BarData
from datetime import datetime
engine = ExecutionEngine()
bar = BarData(
date=datetime(2025, 1, 1, 9, 30),
open=100.00,
high=105.00,
low=95.00,
close=102.00,
volume=1000000,
)
order = MarketOrder(action='BUY', totalQuantity=100)
fills = engine.execute(order, bar)
print(fills)
Multi-Bar Simulation
For backtesting across multiple bars with order lifecycle management:
from XXSim import Simulator, MarketOrder, LimitOrder, BarData
sim = Simulator()
# Register callbacks
sim.on_fill(lambda trade, fill: print(f"Filled: {fill.execution.price}"))
sim.on_cancel(lambda trade: print(f"Cancelled: {trade.log[-1].message}"))
# Submit orders
sim.submit_order(MarketOrder(action='BUY', totalQuantity=100))
sim.submit_order(LimitOrder(action='SELL', totalQuantity=100, price=110.0))
# Process bars
for bar in historical_bars:
fills = sim.process_bar(bar)
# Or use ib_insync-style event loop
def strategy(bar, fills):
if should_buy(bar):
sim.submit_order(MarketOrder(action='BUY', totalQuantity=100))
sim.on_bar(strategy)
sim.run(historical_bars)
The Simulator supports:
- Order management: submit, cancel, update, query orders
- TIF (Time-In-Force): GTC, DAY (expires on date change), GTD (expires after date)
- GAT (Good After Time): Orders with
goodAfterTimeare not active until that time - OCO (One-Cancels-Other): Link orders via
ocaGroup- when one fills, siblings are cancelled - Callbacks: on_fill, on_cancel, on_update, on_bar
Development
Running Tests
pytest tests/ -v
Visualizations
Stop-limit and Trailing test cases can be visualized For stop-limit visualization run:
python docs/stop-limit-chart-generator.py test-data/stop-limit/<filename.csv>
For trailing visualization run:
python docs/trailing-stop-chart-generator.py test-data/trailing-stop/<filename.csv>
TODO: Trailing cases are not organized systemactically enough
Contributing
Contributions are welcome! Please see the documentation in the docs folder for more details and test specifications.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file xxsim-0.10.0.tar.gz.
File metadata
- Download URL: xxsim-0.10.0.tar.gz
- Upload date:
- Size: 30.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6fae13ff69e4f60e3eed5432907eb7bbd527614ed726917ac3b761507832aa18
|
|
| MD5 |
7403e1e5d74c2b0ad7f52448834f3de7
|
|
| BLAKE2b-256 |
54eb3fe398a969699030094023147bc898d24d64f313ba5e8c75928a3fa97854
|
File details
Details for the file xxsim-0.10.0-py3-none-any.whl.
File metadata
- Download URL: xxsim-0.10.0-py3-none-any.whl
- Upload date:
- Size: 14.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e896384a6113f27561f0640f3d635a03acfe8c914a3b31f2df8edee64c0fe09b
|
|
| MD5 |
36fe5cb0c822814556c997d84c830887
|
|
| BLAKE2b-256 |
022521222cc2f59382b37fdfeb22d3212b9c5c68ea119aa25cf37b434036b01b
|