Production hardening: kill switch, circuit breaker, trailing stops, log level, holiday calendar
Some checks failed
Build and Test / build (push) Has been cancelled

This commit is contained in:
2026-02-24 15:00:41 -05:00
parent 0e36fe5d23
commit a87152effb
50 changed files with 12849 additions and 752 deletions

105
TASK-05-session-holidays.md Normal file
View File

@@ -0,0 +1,105 @@
# TASK-05: Add CME Holiday Awareness to SessionManager
**File:** `src/NT8.Core/MarketData/SessionManager.cs`
**Priority:** MEDIUM
**No dependencies**
**Estimated time:** 30 min
---
## Background
`IsRegularTradingHours()` currently only checks session time windows. It has no awareness of CME holidays, so the system would attempt to trade on Christmas, Thanksgiving, etc. when markets are closed.
---
## Exact Changes Required
### 1. Add a static holiday set as a private field on `SessionManager`
Add this inside the class (near the other private fields):
```csharp
// CME US Futures holidays — markets closed all day on these dates.
// Update annually. Dates are in the format new DateTime(year, month, day).
private static readonly System.Collections.Generic.HashSet<DateTime> _cmeHolidays =
new System.Collections.Generic.HashSet<DateTime>
{
// 2025 holidays
new DateTime(2025, 1, 1), // New Year's Day
new DateTime(2025, 1, 20), // Martin Luther King Jr. Day
new DateTime(2025, 2, 17), // Presidents' Day
new DateTime(2025, 4, 18), // Good Friday
new DateTime(2025, 5, 26), // Memorial Day
new DateTime(2025, 6, 19), // Juneteenth
new DateTime(2025, 7, 4), // Independence Day
new DateTime(2025, 9, 1), // Labor Day
new DateTime(2025, 11, 27), // Thanksgiving
new DateTime(2025, 12, 25), // Christmas Day
// 2026 holidays
new DateTime(2026, 1, 1), // New Year's Day
new DateTime(2026, 1, 19), // Martin Luther King Jr. Day
new DateTime(2026, 2, 16), // Presidents' Day
new DateTime(2026, 4, 3), // Good Friday
new DateTime(2026, 5, 25), // Memorial Day
new DateTime(2026, 6, 19), // Juneteenth
new DateTime(2026, 7, 4), // Independence Day (observed Mon 7/3 if falls on Sat — keep both just in case)
new DateTime(2026, 9, 7), // Labor Day
new DateTime(2026, 11, 26), // Thanksgiving
new DateTime(2026, 12, 25), // Christmas Day
};
```
### 2. Add a helper method
```csharp
/// <summary>
/// Returns true if the given UTC date is a CME holiday (market closed all day).
/// </summary>
private static bool IsCmeHoliday(DateTime utcTime)
{
// Convert to ET for holiday date comparison
try
{
var estTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime,
TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"));
return _cmeHolidays.Contains(estTime.Date);
}
catch (Exception)
{
return false;
}
}
```
### 3. Update `IsRegularTradingHours()` to check holidays first
The existing method body is:
```csharp
var sessionInfo = GetCurrentSession(symbol, time);
return sessionInfo.IsRegularHours;
```
Replace with:
```csharp
// Markets are fully closed on CME holidays
if (IsCmeHoliday(time))
{
_logger.LogInformation("Holiday detected for {0} on {1} — market closed.", symbol, time.Date);
return false;
}
var sessionInfo = GetCurrentSession(symbol, time);
return sessionInfo.IsRegularHours;
```
---
## Acceptance Criteria
- [ ] `IsRegularTradingHours("ES", new DateTime(2025, 12, 25, 14, 0, 0, DateTimeKind.Utc))` returns `false`
- [ ] `IsRegularTradingHours("ES", new DateTime(2025, 12, 26, 14, 0, 0, DateTimeKind.Utc))` returns `true` (normal day)
- [ ] `IsRegularTradingHours("ES", new DateTime(2025, 11, 27, 14, 0, 0, DateTimeKind.Utc))` returns `false` (Thanksgiving)
- [ ] `verify-build.bat` passes
- [ ] All existing tests pass