Two bugs found:
1. FIX UI client was publishing orders to Kafka directly AND via FIX
protocol to OEG (which also publishes to Kafka) = duplicate orders.
Removed the direct Kafka publish from FIX UI client.
2. FIX OEG used "type": "buy"/"sell" instead of "side": "BUY"/"SELL",
inconsistent with the rest of the system.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add new securities and use real prices in FIX UI order entryβ
- securities.txt: add EUROB, AEG, INTKA, AAAK, ATTIK to existing symbols
- fix-ui-client: load securities as {symbol: price} dict so prices flow through
- index.html: auto-populate price field from current security price on symbol change
- oeg_simulator: read symbols and prices from securities.txt instead of hardcoded FOO/AAA/BBB at ~100
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- frontend.py: /book was calling /book on matcher (404); fixed to
/orderbook/<symbol> with ?symbol= query param
- Order Entry: pass selected symbol to /book, reload on symbol change
- Order Entry: add β Dashboard link via onclick (not href)
- FIX UI: β Dashboard href="/" was rewritten by nginx sub_filter to
/fix/; fixed by switching to onclick so sub_filter can't touch it
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
FIX UI: convert to AJAX - fix connect/disconnect/order broken under nginxβ
Replace <a href> and <form action> with fetch() calls so nginx proxy
rewrites don't interfere. Add BASE path detection, status polling every
2s, messages polling every 2s, and order feedback without page reload.
Remove unused redirect/url_for imports from backend.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Frontend (disconnected root cause):
- All fetch('/endpoint') calls were hitting nginx '/' (dashboard) instead
of '/frontend/endpoint'. Added BASE detection at page load:
const BASE = window.location.pathname === '/' ? '' : pathname.replace(/\/$/, '');
Applied to /securities, /order, /book, /trades
FIX UI (session disrupted by reloader):
- debug=True caused Flask reloader to spawn a child process and restart
the app, breaking the QuickFIX session on startup
- Changed to debug=False, use_reloader=False
Entrypoint timing:
- FIX OEG sleep increased from 3s β 6s (allow full socket bind)
- FIX UI sleep increased from 2s β 3s (allow QuickFIX initiator to start)
Dashboard:
- Local clock added to header bar (updates every second, browser timezone)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Price chart:
- Volume bars narrowed to 25% slot width, capped at 5px
- Close-price overlay replaced with orange dots per candle (not a line)
- Legend updated to dot symbol instead of line
Multi-symbol chart:
- Volume data now passed from loadAllHistory (live + candle modes)
- drawMultiChart splits into 70% price / 30% volume when volumes present
- Aggregated volume bars (sum across symbols per 60s bucket) shown below
- Volume Y-axis labels on right side (0, 50%, max)
FIX UI:
- Added "β Dashboard" back button in header (links to /)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add mobile-responsive layout to dashboard and FIX UI clientβ
- Add viewport meta tag (critical: prevents mobile browsers from zooming out)
- Stack panels to single column on screens <= 768px
- Allow tables to scroll horizontally inside panels on mobile
- Wrap h1 header buttons on small screens
- Reduce panel height, font size, and padding on mobile
- Full-width modal on small screens
- Same responsive treatment applied to fix-ui-client template
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add NBG security and restrict symbol entry to known securitiesβ
Kafka-based stock exchange simulation with:
- Order matcher engine with SQLite persistence
- FIX protocol OEG server and UI clients
- Frontend order entry with real-time book/trades
- Trading dashboard with SSE streaming and charts
- Market data feeder, consumer, and snapshot viewer
- Docker Compose orchestration for all services
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>