Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

GetMarketHours: a late open after the day's last segment keeps the whole day open

Abierto Apto para principiantes
#9,889 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
72/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
csharp

Línea de trabajo

Empieza en Common/Securities/SecurityExchangeHours.cs, en el bucle de aperturas tardías de GetMarketHours, y compara la inicialización de su índice con la del bucle de cierres anticipados anterior. Reproduce el caso con el ejemplo de Thanksgiving proporcionado o con una prueba específica para una apertura tardía después del último segmento. Se considera terminado cuando GetMarketHours no devuelve segmentos para ese día y conserva el comportamiento descrito para los cierres anticipados.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Expected Behavior

When a date's late open falls after every segment of that day, SecurityExchangeHours.GetMarketHours should return no segments for the day (nothing trades before the late open, and the day's sessions have all ended by then).

Actual Behavior

It returns the day's full regular schedule. In the late-open loop (Common/Securities/SecurityExchangeHours.cs, master):

var index = 0;
segmentsLateOpen = new List<MarketHoursSegment>();
for (var i = 0; i < marketHoursSegments.Count; i++)
{
    var segment = marketHoursSegments[i];
    if (segment.Start <= lateOpenTime && lateOpenTime <= segment.End) { ...; index = i + 1; break; }
    else if (lateOpenTime < segment.Start) { index = i; break; }
}
segmentsLateOpen.AddRange(marketHoursSegments.TakeLast(marketHoursSegments.Count - index));

If lateOpenTime is after the last segment's end, neither branch runs, index stays 0, and TakeLast(Count - 0) keeps every segment. So the late open has the opposite of its intended effect.

In the current master market-hours-database.json this happens on 11 entry-dates:

  • Future-cme-LE, Future-cme-GF, Future-cme-HE: 2011-11-24 and 2012-11-22 (Thanksgiving). Each has lateOpens 17:00 and a Thursday regular segment of 08:30-13:05 CT, which is therefore reported open on Thanksgiving.
  • Future-cme-LBR: the same two dates (09:00-15:05 segment).
  • Future-cme-ETH, Future-cme-MET, Future-cme-MBT: 2020-07-03 (lateOpen 17:00 after an 08:30-16:00 segment). These dates are before those contracts listed, so this case is harmless in practice.

None of these dates is in the entry's own holidays list, so the holiday short-circuit does not apply.

Potential Solution

Initialise the late-open index the way the early-close loop just above initialises its own:

var index = marketHoursSegments.Count;   // a late open after every segment leaves nothing to trade

Then TakeLast(0) returns no segments. When an early close precedes such a late open on the same day, the existing segmentsEarlyClose.AddRange(segmentsLateOpen) step still keeps the pre-early-close segments.

(A sibling defect in the early-close loop, index = i - 1 when the early close falls in a gap between segments, was already fixed in #9869. I found it in the same check, then saw the fix on master.)

Reproducing the Problem

Untested sketch. I have not run C# here: the behaviour comes from reading GetMarketHours on master, cross-checked with a line-by-line Python port of it run against master's market-hours-database.json.

var mhdb = MarketHoursDatabase.FromDataFolder();
var hours = mhdb.GetExchangeHours(Market.CME, Symbol.Create("LE", SecurityType.Future, Market.CME), SecurityType.Future);
var thanksgiving = new DateTime(2011, 11, 24, 10, 0, 0);   // exchange-local (America/Chicago), inside 08:30-13:05
Assert.IsFalse(hours.IsOpen(thanksgiving, extendedMarketHours: false));   // expected to fail today: returns true
Assert.IsEmpty(hours.GetMarketHours(thanksgiving).Segments);              // expected to fail today: 1 segment
System Information

Code: master, SecurityExchangeHours.cs as of 82810ea63d55 (2026-10-05, its latest commit). Data: master Data/market-hours/market-hours-database.json, fetched 2026-10-11. OS-independent; this is a logic issue.

Checklist
  • I have completely filled out this template
  • I have confirmed that this issue exists on the current master branch (by code reading and a port run against master data; not by running LEAN)
  • I have confirmed that this is not a duplicate issue by searching issues
  • I have provided detailed steps to reproduce the issue (the test above is a sketch, not run)
Lenguaje dominante
C#
Estrellas
21.9k
Forks
5.3k
Merge medio
19 h 31 min
PR fusionados (30 d)
44

Preparar el entorno

Abrir en Codespaces

Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de QuantConnect/Lean

Todos los issues de QuantConnect/Lean

Issues similares

Más issues de C#

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.