Files
nt8-sdk/.kilocode/rules/project_context.md

6.9 KiB

Project Context — NT8 SDK (Sprint 2: SIM Validation)

Last Updated: 2026-03-27

You are working on the NT8 SDK — an institutional-grade algorithmic futures trading system for NinjaTrader 8. This is production trading software. Bugs cause real financial losses. Never take shortcuts.


Onboarding / First Read (Canonical Order)

For every new Kilo session, start with docs/00-governance/ as the primary source of truth:

  1. docs/00-governance/executive_summary.md
  2. docs/00-governance/current_status.md
  3. docs/00-governance/active_work.md
  4. docs/00-governance/architecture.md
  5. docs/00-governance/roadmap.md

PROJECT_HANDOVER.md and DESIGNED_VS_IMPLEMENTED_GAP_ANALYSIS.md are historical/contextual references only. Use them for background, not for authoritative current direction.


Critical Rules for Kilocode

  1. Only modify files listed in the task spec. Never touch adjacent code.
  2. C# 5.0 only. No $"", no ?., no => bodies, no nameof(), no async/await.
  3. Never remove XML documentation or comments.
  4. Never change interface signatures — IStrategy, IRiskManager, IPositionSizer, INT8ExecutionBridge are frozen.
  5. Always build before deploying: dotnet build NT8-SDK.sln --configuration Release
  6. Always deploy to BOTH paths after every code change:
    • Repo: C:\dev\nt8-sdk\src\NT8.Adapters\Strategies\
    • NT8: C:\Users\billy\Documents\NinjaTrader 8\bin\Custom\Strategies\
  7. Never guess NT8 API signatures. Verify at https://developer.ninjatrader.com/docs/desktop.

Current State (2026-03-27)

What works end-to-end:

  • SimpleORBStrategy with 10-factor confluence scoring
  • NT8StrategyBase with session management, kill switch, connection recovery
  • Dual-leg scaler + runner architecture (EntriesPerDirection=2 restored)
  • PortfolioRiskManager singleton (kill switch, daily loss, contract cap)
  • File logging (session log + settings export)
  • Historical replay guard (_realtimeBarSeen)
  • Execution confirmed in SIM on 2026-03-27

Pending validation:

  • Runner leg dual-fill (Qty=2) — run backtest to confirm
  • Breakeven + trail in live multi-bar scenario

Architecture

SimpleORBNT8.cs          NT8 entry point
      ↓
NT8StrategyBase.cs       Abstract base: bar routing, kill switch, breakeven, runner trail
      ↓
SimpleORBStrategy.cs     Signal: ORB detection, 10-factor confluence, _tradeTaken lock
      ↓
NT8OrderAdapter.cs       INT8ExecutionBridge: EnterLong/EnterShort/SetStopLoss
      ↓
PortfolioRiskManager.cs  Singleton: cross-strategy risk
      ↓
NinjaTrader 8

Key Files

File Path
NT8StrategyBase.cs src\NT8.Adapters\Strategies\
SimpleORBNT8.cs src\NT8.Adapters\Strategies\
SimpleORBStrategy.cs src\NT8.Strategies\Examples\
NT8OrderAdapter.cs src\NT8.Adapters\NinjaTrader\
PortfolioRiskManager.cs src\NT8.Core\Risk\
deploy-to-nt8.bat deployment\

Active Sprint Tasks

See SPRINT_BOARD.md (at docs\architecture\phase1_sprint_plan.md) for full task list.

Immediate next action: Run Strategy Analyzer backtest (NQ JUN26, Jan 1 2026 → Mar 27 2026) and confirm PNL_UPDATE Position=Short Qty=2 in session log to validate runner leg.


What Is Already Built (Do Not Touch)

All core trading logic is complete and has 240+ passing tests:

Layer Status Key Files
Risk (Tier 1-3) Complete src/NT8.Core/Risk/
Position Sizing Complete src/NT8.Core/Sizing/
OMS / Order Lifecycle Complete src/NT8.Core/OMS/
Intelligence Complete src/NT8.Core/Intelligence/
Analytics Complete src/NT8.Core/Analytics/
Execution Utilities Complete src/NT8.Core/Execution/
Market Data Complete src/NT8.Core/MarketData/

NT8 Order Execution is ALREADY WIRED. NT8StrategyBase.SubmitOrderToNT8() calls EnterLong, EnterShort, SetStopLoss, and SetProfitTarget directly. The execution path works end-to-end. Do not re-implement it.


What You Are Fixing (The Active Task List)

CRITICAL — NT8StrategyBase.cs

Gap 1 — No kill switch NT8StrategyBase has no EnableKillSwitch NinjaScript parameter and no early-exit in OnBarUpdate(). A runaway strategy cannot be stopped without killing NinjaTrader. Fix: Add EnableKillSwitch (bool NinjaScript property) and EnableVerboseLogging property. Add kill switch check as the FIRST thing in OnBarUpdate(). → See TASK-01-kill-switch.md

Gap 2 — ExecutionCircuitBreaker not wired src/NT8.Core/Execution/ExecutionCircuitBreaker.cs is complete and tested. It is never instantiated. Orders submit regardless of latency or rejection conditions. Fix: Instantiate in InitializeSdkComponents(), gate orders in SubmitOrderToNT8(), wire rejections in OnOrderUpdate(). → See TASK-02-circuit-breaker.md

HIGH — TrailingStopManager.cs

Gap 3 — Placeholder stop math returns zero CalculateNewStopPrice() FixedTrailing branch: marketPrice - (x - x) = always zero movement. ATRTrailing and Chandelier also have meaningless placeholder formulas. Fix: Replace with real calculations using TrailingStopConfig.TrailingAmountTicks and AtrMultiplier. → See TASK-03-trailing-stop.md

HIGH — BasicLogger.cs

Gap 4 — No log-level filter Every log statement writes to console unconditionally. Cannot suppress debug noise in production. Fix: Add MinimumLevel property (defaults to Information). Suppress messages below threshold. → See TASK-04-log-level.md

MEDIUM — SessionManager.cs

Gap 5 — No holiday awareness IsRegularTradingHours() checks session times only. Will attempt to trade on Christmas, Thanksgiving, etc. Fix: Add static CME holiday set for 2025/2026. Return false on those dates. → See TASK-05-session-holidays.md


Architecture (Read Before Touching Anything)

SimpleORBStrategy.OnBar()
    ↓ returns StrategyIntent
NT8StrategyBase.OnBarUpdate()
    ↓ [TASK-01: kill switch check here, first]
    ↓ calls ProcessStrategyIntent()
    ↓ calls _riskManager.ValidateOrder()
    ↓ calls _positionSizer.CalculateSize()
    ↓ calls SubmitOrderToNT8()
    ↓ [TASK-02: circuit breaker gate here]
    ↓ calls EnterLong/EnterShort/SetStopLoss/SetProfitTarget (already works)
NT8 callbacks → OnOrderUpdate / OnExecutionUpdate
    ↓ [TASK-02: record rejections in circuit breaker here]

Technology Constraints

  • C# 5.0 only — no $"", no ?., no => on methods/properties, no nameof(), no out var
  • .NET Framework 4.8 — not .NET Core/5+/6+
  • NinjaScript managed ordersEnterLong, EnterShort, SetStopLoss, SetProfitTarget
  • string.Format() everywhere, never string interpolation
  • All Dictionary, HashSet access inside lock (_lock) blocks
  • XML doc comments on all public members
  • try/catch on all public methods with LogError in the catch