Mark As Completed Discussion

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 in C++ 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 to C++ using pybind11.
  • 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) and C++ 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 MarketMessageStrategyInputOrder.
  • Later labs reuse earlier outputs: backtesting uses the same MarketMessage format you implement in Lab 1; the Execution Gateway reuses Order 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 via pybind11 when you want to orchestrate in Python.
  • If you come from Java: think of C++ 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.

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?

CPP
OUTPUT
:001 > Cmd/Ctrl-Enter to run, Cmd/Ctrl-/ to comment