A simplified end-to-end electronic trading system used to demonstrate core concepts in order handling, FIX parsing, risk checks, state machines, and logging.
This project contains 4 main components:
FIX → Parser → Order → RiskEngine → Logger → events.json
Modules included:
| Module | Description |
|---|---|
fix_parser.py |
Converts FIX messages into Python dictionaries with validation. |
order.py |
Implements order state machine (NEW → ACKED → FILLED, etc.). |
risk_engine.py |
Performs max order size & position limit checks. |
logger.py |
Singleton logger that records events to JSON. |
main.py |
Integrates all modules to process trading messages. |
- Parses raw FIX strings such as:
8=FIX.4.2|35=D|55=AAPL|54=1|38=100|40=2 - Converts into a Python dictionary
- Validates required tags:
35(MsgType)55(Symbol)54(Side: 1=Buy, 2=Sell)38(Quantity)
from fix_parser import FixParser
msg = FixParser().parse("8=FIX.4.2|35=D|55=AAPL|54=1|38=100|40=2")
print(msg)Valid state transitions:
NEW → ACKED → FILLED
NEW → REJECTED
ACKED → CANCELED
from order import Order, OrderState
order = Order("AAPL", 100, "1")
order.transition(OrderState.ACKED)
order.transition(OrderState.FILLED)Invalid transitions print warnings, but do not terminate the program.
- Maximum Order Size (default: 1000 shares)
- Maximum Position Limit per Symbol (default: ±2000 shares)
- Long orders (
side="1") increase position; short orders (side="2") decrease position
risk = RiskEngine()
risk.check(order)
risk.update_position(order)The check() method raises ValueError if limits are violated.
- Implemented as a singleton, ensuring only one logger exists
- Logs all events in the system:
- Order creation
- Risk check failures
- State transitions
- Fills
- Rejections
- Saves event history to
events.json
log = Logger()
log.log("OrderCreated", {"symbol": "AAPL"})
log.save()- Receive raw FIX message
- Parse FIX
- Create Order object
- Perform risk checks
- Acknowledge order
- Update position on fill
- Log all events
- Save to JSON
python main.py[LOG] OrderCreated → {...}
Order AAPL is now ACKED
Order AAPL is now FILLED
[LOG] OrderFilled → {'symbol': 'AAPL', 'qty': 500}
[LOG] Saved to events.json
Tests included in:
tests/
test_fix_parser.py
test_order.py
test_risk_engine.py
test_logger.py
test_main_flow.py
Run all tests:
pytest -qGenerate coverage report:
pytest --cov=. --cov-report=term-missingA sample coverage_report.md is provided in the project.
mini-trading-system/
├── fix_parser.py
├── order.py
├── risk_engine.py
├── logger.py
├── main.py
├── tests/
│ ├── test_fix_parser.py
│ ├── test_order.py
│ ├── test_risk_engine.py
│ ├── test_logger.py
│ └── test_main_flow.py
├── coverage_report.md
├── events.json
└── README.md