Skip to content

Commit a66f279

Browse files
Fix some incorrect future expirations (#9184)
- Some future expiry functions were missing to account for holidays, adding unit test reproducing issue
1 parent 6575b57 commit a66f279

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

Common/Securities/Future/FuturesExpiryFunctions.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public static Func<DateTime, DateTime> FuturesExpiryFunction(Symbol symbol)
158158
}
159159

160160
// Trading can occur up to 9:30 a.m. Eastern Time (ET) on the 3rd Friday of the contract month
161-
var thirdFriday = FuturesExpiryUtilityFunctions.ThirdFriday(time);
161+
var thirdFriday = FuturesExpiryUtilityFunctions.ThirdFriday(time, Symbol.Create(Futures.Indices.SP500EMini, SecurityType.Future, Market.CME));
162162
return thirdFriday.Add(new TimeSpan(13,30,0));
163163
})
164164
},
@@ -217,7 +217,7 @@ public static Func<DateTime, DateTime> FuturesExpiryFunction(Symbol symbol)
217217
}
218218

219219
// Trading can occur up to 9:30 a.m. Eastern Time (ET) on the 3rd Friday of the contract month
220-
var thirdFriday = FuturesExpiryUtilityFunctions.ThirdFriday(time);
220+
var thirdFriday = FuturesExpiryUtilityFunctions.ThirdFriday(time, Symbol.Create(Futures.Indices.NASDAQ100EMini, SecurityType.Future, Market.CME));
221221
return thirdFriday.Add(new TimeSpan(13,30,0));
222222
})
223223
},
@@ -231,7 +231,7 @@ public static Func<DateTime, DateTime> FuturesExpiryFunction(Symbol symbol)
231231
}
232232

233233
// Trading can occur up to 9:30 a.m. Eastern Time (ET) on the 3rd Friday of the contract month
234-
var thirdFriday = FuturesExpiryUtilityFunctions.ThirdFriday(time);
234+
var thirdFriday = FuturesExpiryUtilityFunctions.ThirdFriday(time, Symbol.Create(Futures.Indices.Dow30EMini, SecurityType.Future, Market.CBOT));
235235
return thirdFriday.Add(new TimeSpan(13,30,0));
236236
})
237237
},
@@ -245,7 +245,7 @@ public static Func<DateTime, DateTime> FuturesExpiryFunction(Symbol symbol)
245245
}
246246

247247
// Trading can occur up to 9:30 a.m. Eastern Time (ET) on the 3rd Friday of the contract month
248-
var thirdFriday = FuturesExpiryUtilityFunctions.ThirdFriday(time);
248+
var thirdFriday = FuturesExpiryUtilityFunctions.ThirdFriday(time, Symbol.Create(Futures.Indices.Russell2000EMini, SecurityType.Future, Market.CME));
249249
return thirdFriday.Add(new TimeSpan (13,30,0));
250250
})
251251
},
@@ -3208,7 +3208,7 @@ Dec listed in June
32083208
}
32093209

32103210
// Trading terminates at 9:30 a.m. ET on the 3rd Friday of the contract month.
3211-
var thirdFriday = FuturesExpiryUtilityFunctions.ThirdFriday(time);
3211+
var thirdFriday = FuturesExpiryUtilityFunctions.ThirdFriday(time, Symbol.Create(Futures.Indices.MicroSP500EMini, SecurityType.Future, Market.CME));
32123212
return thirdFriday.Add(new TimeSpan(13,30,0));
32133213
})
32143214
},
@@ -3222,7 +3222,7 @@ Dec listed in June
32223222
}
32233223

32243224
// Trading terminates at 9:30 a.m. ET on the 3rd Friday of the contract month.
3225-
var thirdFriday = FuturesExpiryUtilityFunctions.ThirdFriday(time);
3225+
var thirdFriday = FuturesExpiryUtilityFunctions.ThirdFriday(time, Symbol.Create(Futures.Indices.MicroNASDAQ100EMini, SecurityType.Future, Market.CME));
32263226
return thirdFriday.Add(new TimeSpan(13,30,0));
32273227
})
32283228
},
@@ -3236,7 +3236,7 @@ Dec listed in June
32363236
}
32373237

32383238
// Trading terminates at 9:30 a.m. ET on the 3rd Friday of the contract month.
3239-
var thirdFriday = FuturesExpiryUtilityFunctions.ThirdFriday(time);
3239+
var thirdFriday = FuturesExpiryUtilityFunctions.ThirdFriday(time, Symbol.Create(Futures.Indices.MicroRussell2000EMini, SecurityType.Future, Market.CME));
32403240
return thirdFriday.Add(new TimeSpan(13,30,0));
32413241
})
32423242
},
@@ -3250,7 +3250,7 @@ Dec listed in June
32503250
}
32513251

32523252
// Trading can occur up to 9:30 a.m. Eastern Time (ET) on the 3rd Friday of the contract month
3253-
var thirdFriday = FuturesExpiryUtilityFunctions.ThirdFriday(time);
3253+
var thirdFriday = FuturesExpiryUtilityFunctions.ThirdFriday(time, Symbol.Create(Futures.Indices.MicroDow30EMini, SecurityType.Future, Market.CBOT));
32543254
return thirdFriday.Add(new TimeSpan(13,30,0));
32553255
})
32563256
},

Tests/Common/Securities/Futures/FuturesExpiryFunctionsTests.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,20 @@ public void BankHolidaysAreRespected()
319319
Assert.AreEqual(new DateTime(2025, 2, 14), expiryDate.Date);
320320
}
321321

322+
[TestCase(QuantConnect.Securities.Futures.Indices.NASDAQ100EMini, "20260302", "20260320")]
323+
[TestCase(QuantConnect.Securities.Futures.Indices.NASDAQ100EMini, "20260602", "20260618")]
324+
public void ExpirationUsesHolidays(string symbol, string dateStr, string expectedDate)
325+
{
326+
var date = Time.ParseDate(dateStr);
327+
var expected = Time.ParseDate(expectedDate);
328+
329+
var futureSymbol = GetFutureSymbol(symbol, date);
330+
var func = FuturesExpiryFunctions.FuturesExpiryFunction(GetFutureSymbol(symbol));
331+
332+
var actual = func(futureSymbol.ID.Date);
333+
Assert.AreEqual(expected, actual.Date, $"Failed for symbol: {symbol}. Date {dateStr}");
334+
}
335+
322336
// 25th is a sunday
323337
[TestCase(QuantConnect.Securities.Futures.Energy.MicroCrudeOilWTI, "20221001", "20220919")]
324338
[TestCase(QuantConnect.Securities.Futures.Energy.CrudeOilWTI, "20221001", "20220920")]

0 commit comments

Comments
 (0)