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 ✅