Files
nt8-sdk/COMPILE_FIX_SPECIFICATION.md
2026-02-24 15:00:41 -05:00

8.9 KiB

NT8 Compile Fix Specification

For: Kilocode AI Agent
Priority: URGENT
Mode: Code Mode
Estimated Time: 30-45 minutes
Files to Edit: 2 files
New Files: 0


🎯 Objective

Fix 9 NT8 NinjaScript compilation errors in two strategy files. These are mechanical fixes - naming conflicts, type conversions, and a missing reference. Do NOT redesign logic. Surgical edits only.


📋 Error Summary

# File Error Line Fix Type
1 SimpleORBNT8.cs NT8.Strategies namespace not found 15 Add using alias
2 NT8StrategyBase.cs Position ambiguous reference 49 Qualify type
3 NT8StrategyBase.cs Position ambiguous reference 300 Qualify type
4 SimpleORBNT8.cs SimpleORBStrategy not found 72 Add using alias
5 NT8StrategyBase.cs double cannot convert to long 273 Cast to long
6 NT8StrategyBase.cs double cannot convert to int 364 Cast to int
7 NT8StrategyBase.cs double cannot convert to int 366 Cast to int
8 NT8StrategyBase.cs double cannot convert to int 373 Cast to int
9 NT8StrategyBase.cs double cannot convert to int 375 Cast to int

🔧 Fix 1: NT8StrategyBase.cs - Ambiguous Position reference (Errors 2 & 3)

Problem

NT8's NinjaTrader.Cbi.Position and our NT8.Core.Common.Models.Position both exist in scope. C# cannot resolve which one to use on lines 49 and 300.

Solution

Add a using alias at the top of the file to disambiguate, then use the alias wherever SDK Position is intended.

Change 1a: Add alias to using block (top of file, after existing using aliases)

Find this block (lines 19-25):

using SdkOrderSide = NT8.Core.Common.Models.OrderSide;
using SdkOrderType = NT8.Core.Common.Models.OrderType;
using OmsOrderRequest = NT8.Core.OMS.OrderRequest;
using OmsOrderSide = NT8.Core.OMS.OrderSide;
using OmsOrderType = NT8.Core.OMS.OrderType;
using OmsOrderState = NT8.Core.OMS.OrderState;
using OmsOrderStatus = NT8.Core.OMS.OrderStatus;

Replace with (add one line at top):

using SdkPosition = NT8.Core.Common.Models.Position;
using SdkOrderSide = NT8.Core.Common.Models.OrderSide;
using SdkOrderType = NT8.Core.Common.Models.OrderType;
using OmsOrderRequest = NT8.Core.OMS.OrderRequest;
using OmsOrderSide = NT8.Core.OMS.OrderSide;
using OmsOrderType = NT8.Core.OMS.OrderType;
using OmsOrderState = NT8.Core.OMS.OrderState;
using OmsOrderStatus = NT8.Core.OMS.OrderStatus;

Change 1b: Fix field declaration (line 49)

Find:

        private Position _lastPosition;

Replace with:

        private SdkPosition _lastPosition;

Change 1c: Fix return type in BuildPositionInfo() (line 300 area)

Find:

        private Position BuildPositionInfo()
        {
            var p = NT8DataConverter.ConvertPosition(
                Instrument.MasterInstrument.Name,
                Position.Quantity,
                Position.AveragePrice,
                0.0,
                0.0,
                DateTime.UtcNow);

            _lastPosition = p;
            return p;
        }

Replace with:

        private SdkPosition BuildPositionInfo()
        {
            var p = NT8DataConverter.ConvertPosition(
                Instrument.MasterInstrument.Name,
                Position.Quantity,
                Position.AveragePrice,
                0.0,
                0.0,
                DateTime.UtcNow);

            _lastPosition = p;
            return p;
        }

NOTE: Position.Quantity and Position.AveragePrice (without qualifier) correctly refer to NinjaTrader.Cbi.Position (NT8's built-in position property on the Strategy class). Only the return type and field type need the alias. Do NOT change the Position.Quantity / Position.AveragePrice references.


🔧 Fix 2: NT8StrategyBase.cs - Volume double to long (Error 5)

Problem

NT8DataConverter.ConvertBar() expects volume as long, but NT8's Volume[0] returns double.

Location

Inside ConvertCurrentBar() method (line 273 area).

Change: Cast Volume[0] to long

Find:

        private BarData ConvertCurrentBar()
        {
            return NT8DataConverter.ConvertBar(
                Instrument.MasterInstrument.Name,
                Time[0],
                Open[0],
                High[0],
                Low[0],
                Close[0],
                Volume[0],
                (int)BarsPeriod.Value);
        }

Replace with:

        private BarData ConvertCurrentBar()
        {
            return NT8DataConverter.ConvertBar(
                Instrument.MasterInstrument.Name,
                Time[0],
                Open[0],
                High[0],
                Low[0],
                Close[0],
                (long)Volume[0],
                (int)BarsPeriod.Value);
        }

🔧 Fix 3: NT8StrategyBase.cs - StopTicks/TargetTicks double to int (Errors 6-9)

Problem

SetStopLoss() and SetProfitTarget() NT8 methods expect int for tick counts, but intent.StopTicks and intent.TargetTicks are double.

Location

Inside SubmitOrderToNT8() method (lines 364-375 area).

Change: Cast tick values to int

Find:

            if (intent.StopTicks > 0)
                SetStopLoss(orderName, CalculationMode.Ticks, intent.StopTicks, false);

            if (intent.TargetTicks.HasValue && intent.TargetTicks.Value > 0)
                SetProfitTarget(orderName, CalculationMode.Ticks, intent.TargetTicks.Value);

Replace with:

            if (intent.StopTicks > 0)
                SetStopLoss(orderName, CalculationMode.Ticks, (int)intent.StopTicks, false);

            if (intent.TargetTicks.HasValue && intent.TargetTicks.Value > 0)
                SetProfitTarget(orderName, CalculationMode.Ticks, (int)intent.TargetTicks.Value);

🔧 Fix 4: SimpleORBNT8.cs - Missing NT8.Strategies reference (Errors 1 & 4)

Problem

SimpleORBStrategy lives in the NT8.Strategies.Examples namespace. The using directive references NT8.Strategies.Examples but NT8.Strategies.dll must also be deployed to NT8 Custom folder AND added as a reference in the NinjaScript Editor.

Change: Add using alias at top of SimpleORBNT8.cs

Find (line 15):

using NT8.Strategies.Examples;

Replace with:

using NT8.Strategies.Examples;
using SdkSimpleORB = NT8.Strategies.Examples.SimpleORBStrategy;

AND update the usage inside CreateSdkStrategy():

Find:

        protected override IStrategy CreateSdkStrategy()
        {
            return new SimpleORBStrategy(OpeningRangeMinutes, StdDevMultiplier);
        }

Replace with:

        protected override IStrategy CreateSdkStrategy()
        {
            return new SdkSimpleORB(OpeningRangeMinutes, StdDevMultiplier);
        }

📦 Deployment Step (Manual - Not Kilocode)

After code fixes are committed, Mo needs to:

# Build NT8.Strategies project
cd C:\dev\nt8-sdk
dotnet build src\NT8.Strategies\NT8.Strategies.csproj --configuration Release

# Copy DLL to NT8 Custom folder (NT8 must be closed)
Copy-Item "src\NT8.Strategies\bin\Release\net48\NT8.Strategies.dll" `
    "$env:USERPROFILE\Documents\NinjaTrader 8\bin\Custom\" -Force

Then in NT8 NinjaScript Editor:

  • Right-click → References → Add → NT8.Strategies.dll

Verification Steps

After Code Changes:

# Build must succeed with zero errors
dotnet build src\NT8.Adapters\NT8.Adapters.csproj --configuration Release

# All tests must still pass
dotnet test NT8-SDK.sln --configuration Release --no-build

After NT8 Recompile:

  • Zero compilation errors in NinjaScript Editor
  • MinimalTestStrategy visible in strategy list
  • SimpleORBNT8 visible in strategy list
  • NT8StrategyBase not directly visible (abstract)

🚨 Constraints

  • C# 5.0 syntax only - no modern features
  • Surgical edits ONLY - do not refactor or redesign
  • Do NOT change any logic, only fix the type issues
  • Preserve all XML documentation comments
  • All 319 existing tests must still pass after changes

📋 Git Commit

git add src/NT8.Adapters/Strategies/NT8StrategyBase.cs
git add src/NT8.Adapters/Strategies/SimpleORBNT8.cs
git commit -m "fix: Resolve NT8 NinjaScript compilation errors

- Add SdkPosition alias to disambiguate from NinjaTrader.Cbi.Position
- Cast Volume[0] from double to long for ConvertBar()
- Cast StopTicks/TargetTicks from double to int for SetStopLoss/SetProfitTarget
- Add SdkSimpleORB alias for SimpleORBStrategy in SimpleORBNT8.cs

All 9 NT8 compile errors resolved. Zero logic changes."

🎯 Success Criteria

  • Zero compilation errors in NT8 NinjaScript Editor
  • All 319 existing tests still passing
  • Zero new build warnings
  • Code committed to Git

READY FOR KILOCODE - CODE MODE