Pre-cleanup baseline snapshot
Some checks failed
Build and Test / build (push) Has been cancelled

This commit is contained in:
2026-04-05 16:50:18 -04:00
parent d856f3949d
commit 9a28a49292
12 changed files with 695 additions and 30 deletions

View File

@@ -182,6 +182,16 @@ namespace NinjaTrader.NinjaScript.Strategies
ExitShort("EmergencyFlatten");
}
/// <summary>
/// Returns true if the concrete strategy has ForceSessionReset enabled.
/// Override in subclass to expose the NinjaScript parameter value.
/// Default returns false so base class never forces a reset unless overridden.
/// </summary>
protected virtual bool GetForceSessionReset()
{
return false;
}
/// <summary>
/// Create the SDK strategy instance.
/// </summary>
@@ -207,7 +217,7 @@ namespace NinjaTrader.NinjaScript.Strategies
MaximumBarsLookBack = MaximumBarsLookBack.TwoHundredFiftySix;
OrderFillResolution = OrderFillResolution.Standard;
Slippage = 0;
StartBehavior = StartBehavior.WaitUntilFlat;
StartBehavior = StartBehavior.AdoptAccountPosition;
TimeInForce = TimeInForce.Gtc;
TraceOrders = false;
RealtimeErrorHandling = RealtimeErrorHandling.StopCancelClose;
@@ -220,7 +230,7 @@ namespace NinjaTrader.NinjaScript.Strategies
MaxOpenPositions = 3;
RiskPerTrade = 100.0;
MinContracts = 1;
MaxContracts = 10;
MaxContracts = 3;
EnableKillSwitch = false;
EnableVerboseLogging = false;
MinTradeGrade = 4;
@@ -229,10 +239,10 @@ namespace NinjaTrader.NinjaScript.Strategies
EnableLongTrades = true;
EnableShortTrades = true;
EnableAutoBreakeven = true;
BreakevenTriggerTicks = 12;
BreakevenTriggerTicks = 20;
BreakevenOffsetTicks = 1;
EnableRunner = true;
RunnerTrailTicks = 12;
RunnerTrailTicks = 20;
_killSwitchTriggered = false;
_connectionLost = false;
}
@@ -242,6 +252,14 @@ namespace NinjaTrader.NinjaScript.Strategies
{
try
{
// DIAGNOSTIC: Print actual runtime property values to confirm
// what NT8 loaded vs what SetDefaults specified.
Print(string.Format("[SDK-DIAG] SetDefaults check: BE={0} Trail={1} MaxC={2} SB={3} EPD={4}",
BreakevenTriggerTicks,
RunnerTrailTicks,
MaxContracts,
StartBehavior,
EntriesPerDirection));
InitFileLog();
InitializeSdkComponents();
_sdkInitialized = true;
@@ -260,6 +278,18 @@ namespace NinjaTrader.NinjaScript.Strategies
else if (State == State.Realtime)
{
_realtimeBarSeen = false;
// If ForceSessionReset is enabled, push a reset signal into the SDK strategy
// so _tradeTaken is cleared before any live bar is processed.
// This recovers from replay-burst scenarios where historical bars set _tradeTaken.
if (_sdkStrategy != null && GetForceSessionReset())
{
var resetParams = new Dictionary<string, object>();
resetParams.Add("force_session_reset", true);
_sdkStrategy.SetParameters(resetParams);
Print(string.Format("[SDK] ForceSessionReset: _tradeTaken cleared on live start at {0}", DateTime.Now.ToString("HH:mm:ss")));
}
WriteSettingsFile();
}
else if (State == State.Terminated)
@@ -748,9 +778,24 @@ namespace NinjaTrader.NinjaScript.Strategies
private BarData ConvertCurrentBar()
{
DateTime barTimeEt;
try
{
var centralZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
var easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime utcTime = TimeZoneInfo.ConvertTimeToUtc(
DateTime.SpecifyKind(Time[0], DateTimeKind.Unspecified),
centralZone);
barTimeEt = TimeZoneInfo.ConvertTimeFromUtc(utcTime, easternZone);
}
catch
{
barTimeEt = Time[0];
}
return NT8DataConverter.ConvertBar(
Instrument.MasterInstrument.Name,
Time[0],
barTimeEt,
Open[0],
High[0],
Low[0],