Learning Path and Hands-on Labs
A clear roadmap helps you go from small, safe experiments to a full HFT microservice. Think of the labs like basketball drills: start with dribbling (market data ingestion
), add shooting form (simple strategy
), then play scrimmages (execution
+ backtesting
) — every exercise builds toward game-ready performance.
ASCII roadmap (left → right):
[Lab 1] Market Data Ingestion | v [Lab 2] ---> [Lab 3] Simple Strategy Execution Gateway | | v v [Lab 4] ------> [Lab 5] Backtesting Integration & Microservice
Key modules and practical labs (what you'll actually code):
Lab 1: Market Data Ingestion
(UDP multicast / binary parsing)- Goal: receive, parse, and sequence-recover simple mock messages.
- Languages: prototype in
Python
to parse, implement production parser inC++
for low-latency.
Lab 2: Simple Strategy
(stateless decision)- Goal: implement a moving-average crossover or RSI rule.
- Languages: fast prototyping in
Python
(numpy
), then optionally port hot function toC++
usingpybind11
.
Lab 3: Execution Gateway
(order serialization + TCP/UDP sends)- Goal: build a robust order sender with resend/ack tracking.
- Languages:
C++
recommended for socket control and minimal syscalls.
Lab 4: Backtesting & Replay Engine
- Goal: deterministic market replay and strategy validation with offline metrics.
- Languages:
Python
for analysis (pandas
) andC++
for heavy replay if needed.
Lab 5: Integration — Build Your First Microservice
- Goal: combine ingestion, strategy, and gateway into a runnable microservice with logging and simple risk checks.
- Languages: mixed—
C++
for hot path,Python
for orchestration or analytics.
How labs build on each other (dependency rules):
- Each lab produces a contract (simple API): parsed
MarketMessage
→StrategyInput
→Order
. - Later labs reuse earlier outputs: backtesting uses the same
MarketMessage
format you implement in Lab 1; the Execution Gateway reusesOrder
serialization from your strategy. - This incremental approach makes debugging and evaluation tractable.
Evaluation criteria (how you'll be graded / measure success):
- Correctness: unit tests for parsing and serialization (
pytest
for Python,Catch2
/googletest
for C++). - Determinism & Reproducibility: replay outputs must match between runs.
- Performance targets: micro-benchmarks for hot-paths (latency budgets per stage). Start with coarse goals (e.g., <1ms per stage) and tighten.
- Code hygiene: clear interfaces, CI build with
CMake
, and reproducible dependency management (conan
/pip
/venv
). - Observability: logs non-blocking, simple metrics (events/sec, avg latency).
Tailored notes for you (beginner in C++ & Python, familiar with Java, C, JS):
- Prototype quickly in
Python
(like playing 3-on-3 pickup) — iterate rules. - Move hot inner-loops to
C++
(the pro league): small functions, well-tested, and expose viapybind11
when you want to orchestrate in Python. - If you come from
Java
: think ofC++
as Java without a GC — you will manage memory and must watch allocations on the hot path. - If you come from
JS
: event-driven logic maps well to feed handlers; translate callbacks into lock-free queues for low-latency C++ flows.
Practical timeline (recommended pacing):
- Lab 1: 6–10 hours
- Lab 2: 4–8 hours
- Lab 3: 6–10 hours
- Lab 4: 6–12 hours
- Lab 5: 8–16 hours
(Do these part-time over several weeks — adjust per prior experience.)
Hands-on challenge (run the C++ helper below):
- The C++ program prints a suggested lab sequence, per-lab estimated hours, and the total. It's a tiny planner you can edit. Try these experiments:
- Shorten
Market Data
hours to simulate moving faster from Python -> C++. - Add a new lab
Hardware Timestamping
and set its hours. - Change
favorite_player
to your favorite athlete or coder to personalize output.
- Shorten
Small tips while coding labs:
- Keep
MarketMessage
layouts explicit and test bit-exact parsing. - Avoid dynamic allocation on the hot path — prefer pre-allocated buffers.
- Write small, focused unit tests for each lab before integration.
Now open the C++ file below (main.cpp), run it, and try the small edits above. When you're done, reflect: which lab took longest? Which one forced you to rewrite code in C++
instead of Python
?
xxxxxxxxxx
}
using namespace std;
struct Lab {
string name;
int hours;
string recommended_language;
};
int main() {
// Personalize this!
string favorite_player = "Kobe Bryant"; // change to your favorite coder or athlete
vector<Lab> roadmap = {
{"Market Data Ingestion", 8, "Prototype: Python -> Prod: C++"},
{"Simple Strategy", 6, "Python (fast iterate), move hot parts to C++"},
{"Execution Gateway", 8, "C++ (low-level sockets)"},
{"Backtesting & Replay", 10, "Python for analysis, C++ for fast replay"},
{"Integration: Microservice", 12, "C++ with thin Python orchestration"}
};
cout << "Learning Path Planner — Algorithmic Trading (HFT)\n";
cout << "Hi " << favorite_player << "! Here's a suggested sequence of hands-on labs:\n\n";
int total = 0;
for (size_t i = 0; i < roadmap.size(); ++i) {