Production hardening: kill switch, circuit breaker, trailing stops, log level, holiday calendar
Some checks failed
Build and Test / build (push) Has been cancelled
Some checks failed
Build and Test / build (push) Has been cancelled
This commit is contained in:
207
deployment/Deploy-To-NT8.ps1
Normal file
207
deployment/Deploy-To-NT8.ps1
Normal file
@@ -0,0 +1,207 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Automates deployment of NT8 SDK to NinjaTrader 8.
|
||||
|
||||
.DESCRIPTION
|
||||
Builds, tests, copies DLLs/strategy source files, and verifies deployment.
|
||||
#>
|
||||
|
||||
param(
|
||||
[switch]$BuildFirst = $true,
|
||||
[switch]$RunTests = $true,
|
||||
[switch]$CopyStrategies = $true,
|
||||
[switch]$SkipVerification = $false,
|
||||
[string]$Configuration = "Release"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$sdkRoot = "C:\dev\nt8-sdk"
|
||||
$nt8Custom = "$env:USERPROFILE\Documents\NinjaTrader 8\bin\Custom"
|
||||
$nt8Strategies = "$nt8Custom\Strategies"
|
||||
|
||||
$coreDllPath = "$sdkRoot\src\NT8.Core\bin\$Configuration\net48"
|
||||
$adaptersDllPath = "$sdkRoot\src\NT8.Adapters\bin\$Configuration\net48"
|
||||
$strategiesPath = "$sdkRoot\src\NT8.Adapters\Strategies"
|
||||
|
||||
function Write-Header {
|
||||
param([string]$Message)
|
||||
Write-Host ""
|
||||
Write-Host ("=" * 70) -ForegroundColor Cyan
|
||||
Write-Host $Message -ForegroundColor Cyan
|
||||
Write-Host ("=" * 70) -ForegroundColor Cyan
|
||||
}
|
||||
|
||||
function Write-Step {
|
||||
param([string]$Step, [string]$Message)
|
||||
Write-Host "`n[$Step] $Message" -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
function Write-Success {
|
||||
param([string]$Message)
|
||||
Write-Host " [OK] $Message" -ForegroundColor Green
|
||||
}
|
||||
|
||||
function Write-Warn {
|
||||
param([string]$Message)
|
||||
Write-Host " [WARN] $Message" -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
if (-not (Test-Path $sdkRoot)) {
|
||||
throw "SDK root not found: $sdkRoot"
|
||||
}
|
||||
|
||||
if (-not (Test-Path $nt8Custom)) {
|
||||
throw "NinjaTrader 8 Custom directory not found: $nt8Custom"
|
||||
}
|
||||
|
||||
$strategyFiles = @(
|
||||
"NT8StrategyBase.cs",
|
||||
"SimpleORBNT8.cs",
|
||||
"MinimalTestStrategy.cs"
|
||||
)
|
||||
|
||||
Write-Header "NT8 SDK Deployment Script"
|
||||
Write-Host "Configuration: $Configuration"
|
||||
Write-Host "SDK Root: $sdkRoot"
|
||||
Write-Host "NT8 Custom: $nt8Custom"
|
||||
|
||||
$startTime = Get-Date
|
||||
|
||||
if ($BuildFirst) {
|
||||
Write-Step "1/6" "Building SDK"
|
||||
Push-Location $sdkRoot
|
||||
try {
|
||||
& dotnet clean --configuration $Configuration --verbosity quiet
|
||||
if ($LASTEXITCODE -ne 0) { throw "Clean failed" }
|
||||
|
||||
& dotnet build --configuration $Configuration --verbosity quiet
|
||||
if ($LASTEXITCODE -ne 0) { throw "Build failed" }
|
||||
|
||||
Write-Success "Build succeeded"
|
||||
}
|
||||
finally {
|
||||
Pop-Location
|
||||
}
|
||||
}
|
||||
else {
|
||||
Write-Step "1/6" "Skipping build"
|
||||
}
|
||||
|
||||
if ($RunTests) {
|
||||
Write-Step "2/6" "Running tests"
|
||||
Push-Location $sdkRoot
|
||||
try {
|
||||
& dotnet test --configuration $Configuration --no-build --verbosity quiet
|
||||
if ($LASTEXITCODE -ne 0) { throw "Tests failed" }
|
||||
Write-Success "Tests passed"
|
||||
}
|
||||
finally {
|
||||
Pop-Location
|
||||
}
|
||||
}
|
||||
else {
|
||||
Write-Step "2/6" "Skipping tests"
|
||||
}
|
||||
|
||||
Write-Step "3/6" "Copying SDK DLLs"
|
||||
if (Test-Path "$coreDllPath\NT8.Core.dll") {
|
||||
Copy-Item "$coreDllPath\NT8.Core.dll" $nt8Custom -Force
|
||||
Write-Success "Copied NT8.Core.dll"
|
||||
}
|
||||
else {
|
||||
throw "NT8.Core.dll not found at $coreDllPath"
|
||||
}
|
||||
|
||||
if (Test-Path "$adaptersDllPath\NT8.Adapters.dll") {
|
||||
Copy-Item "$adaptersDllPath\NT8.Adapters.dll" $nt8Custom -Force
|
||||
Write-Success "Copied NT8.Adapters.dll"
|
||||
}
|
||||
else {
|
||||
Write-Warn "NT8.Adapters.dll not found (may be expected)"
|
||||
}
|
||||
|
||||
Write-Step "4/6" "Copying dependencies"
|
||||
$dependencies = @(
|
||||
"Microsoft.Extensions.*.dll",
|
||||
"System.Memory.dll",
|
||||
"System.Buffers.dll",
|
||||
"System.Runtime.CompilerServices.Unsafe.dll"
|
||||
)
|
||||
|
||||
$depCopied = 0
|
||||
foreach ($pattern in $dependencies) {
|
||||
$files = Get-ChildItem "$coreDllPath\$pattern" -ErrorAction SilentlyContinue
|
||||
foreach ($f in $files) {
|
||||
Copy-Item $f.FullName $nt8Custom -Force
|
||||
$depCopied++
|
||||
}
|
||||
}
|
||||
|
||||
if ($depCopied -gt 0) {
|
||||
Write-Success ("Copied {0} dependencies" -f $depCopied)
|
||||
}
|
||||
else {
|
||||
Write-Warn "No dependency files copied"
|
||||
}
|
||||
|
||||
if ($CopyStrategies) {
|
||||
Write-Step "5/6" "Copying strategy files"
|
||||
if (-not (Test-Path $nt8Strategies)) {
|
||||
New-Item -ItemType Directory -Path $nt8Strategies -Force | Out-Null
|
||||
}
|
||||
|
||||
$copied = 0
|
||||
foreach ($file in $strategyFiles) {
|
||||
$sourcePath = Join-Path $strategiesPath $file
|
||||
if (Test-Path $sourcePath) {
|
||||
Copy-Item $sourcePath $nt8Strategies -Force
|
||||
Write-Success ("Copied {0}" -f $file)
|
||||
$copied++
|
||||
}
|
||||
else {
|
||||
Write-Warn ("Missing {0}" -f $file)
|
||||
}
|
||||
}
|
||||
|
||||
if ($copied -eq 0) {
|
||||
throw "No strategy files copied"
|
||||
}
|
||||
}
|
||||
else {
|
||||
Write-Step "5/6" "Skipping strategy copy"
|
||||
}
|
||||
|
||||
if (-not $SkipVerification) {
|
||||
Write-Step "6/6" "Verifying deployment"
|
||||
$ok = $true
|
||||
|
||||
if (-not (Test-Path "$nt8Custom\NT8.Core.dll")) {
|
||||
$ok = $false
|
||||
Write-Warn "NT8.Core.dll missing after copy"
|
||||
}
|
||||
|
||||
foreach ($file in $strategyFiles) {
|
||||
if (-not (Test-Path (Join-Path $nt8Strategies $file))) {
|
||||
$ok = $false
|
||||
Write-Warn ("{0} missing after copy" -f $file)
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $ok) {
|
||||
throw "Deployment verification failed"
|
||||
}
|
||||
|
||||
Write-Success "Deployment verification passed"
|
||||
}
|
||||
else {
|
||||
Write-Step "6/6" "Skipping verification"
|
||||
}
|
||||
|
||||
$duration = (Get-Date) - $startTime
|
||||
Write-Header "Deployment Complete"
|
||||
Write-Host ("Duration: {0:F1} seconds" -f $duration.TotalSeconds)
|
||||
Write-Host "Next: Open NinjaTrader 8 -> NinjaScript Editor -> Compile All"
|
||||
|
||||
exit 0
|
||||
|
||||
Reference in New Issue
Block a user