Skip to content

Commit 7b2b2e7

Browse files
committed
Disable extended market hours for chain universes
1 parent 3e9e550 commit 7b2b2e7

5 files changed

Lines changed: 48 additions & 27 deletions

File tree

Algorithm/QCAlgorithm.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2017,7 +2017,8 @@ public Security AddSecurity(Symbol symbol, Resolution? resolution = null, bool f
20172017
continuousContractSymbol.ID.Symbol,
20182018
continuousContractSymbol.ID.SecurityType,
20192019
security.Exchange.Hours);
2020-
AddUniverse(new ContinuousContractUniverse(security, continuousUniverseSettings, LiveMode, new SubscriptionDataConfig(canonicalConfig, symbol: continuousContractSymbol)));
2020+
AddUniverse(new ContinuousContractUniverse(security, continuousUniverseSettings, LiveMode,
2021+
new SubscriptionDataConfig(canonicalConfig, symbol: continuousContractSymbol, extendedHours: extendedMarketHours)));
20212022

20222023
universe = new FuturesChainUniverse((Future)security, settings);
20232024
}
@@ -2372,7 +2373,7 @@ public Option AddOptionContract(Symbol symbol, Resolution? resolution = null, bo
23722373
Resolution = underlyingConfigs.GetHighestResolution(),
23732374
ExtendedMarketHours = extendedMarketHours
23742375
};
2375-
universe = AddUniverse(new OptionContractUniverse(new SubscriptionDataConfig(configs.First(), symbol: universeSymbol), settings));
2376+
universe = AddUniverse(new OptionContractUniverse(new SubscriptionDataConfig(configs.First(), symbol: universeSymbol, extendedHours: extendedMarketHours), settings));
23762377
}
23772378

23782379
// update the universe

Common/Data/HistoryRequest.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
using NodaTime;
1919
using QuantConnect.Securities;
2020
using System.Collections.Generic;
21-
using QuantConnect.Data.UniverseSelection;
21+
using QuantConnect.Util;
2222

2323
namespace QuantConnect.Data
2424
{
@@ -67,8 +67,7 @@ public bool IncludeExtendedMarketHours
6767
}
6868
set
6969
{
70-
// We don't have universe files for extended market hours dates only (like Sundays for some futures)
71-
_includeExtendedMarketHours = value && !DataType.IsAssignableTo(typeof(BaseChainUniverseData));
70+
_includeExtendedMarketHours = value && LeanData.SupportsExtendedMarketHours(DataType);
7271
}
7372
}
7473

Common/Data/SubscriptionDataConfig.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ public SubscriptionDataConfig(Type objectType,
222222
Resolution = resolution;
223223
_sid = symbol.ID;
224224
Symbol = symbol;
225-
ExtendedMarketHours = extendedHours;
225+
ExtendedMarketHours = extendedHours && LeanData.SupportsExtendedMarketHours(Type);
226226
PriceScaleFactor = 1;
227227
IsInternalFeed = isInternalFeed;
228228
IsCustomData = isCustom;
@@ -302,6 +302,7 @@ public SubscriptionDataConfig(SubscriptionDataConfig config,
302302
PriceScaleFactor = config.PriceScaleFactor;
303303
SumOfDividends = config.SumOfDividends;
304304
Consolidators = config.Consolidators;
305+
ExtendedMarketHours = extendedHours ?? config.ExtendedMarketHours;
305306
}
306307

307308
/// <summary>

Common/Util/LeanData.cs

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -872,7 +872,8 @@ public static string GenerateZipFileName(string symbol, SecurityType securityTyp
872872

873873
if (tickType == null)
874874
{
875-
if (securityType == SecurityType.Forex || securityType == SecurityType.Cfd) {
875+
if (securityType == SecurityType.Forex || securityType == SecurityType.Cfd)
876+
{
876877
tickType = TickType.Quote;
877878
}
878879
else
@@ -1589,24 +1590,34 @@ public static bool SetStrictEndTimes(IBaseData baseData, SecurityExchangeHours e
15891590
/// <param name="fileName">File name extracted</param>
15901591
/// <param name="entryName">Entry name extracted</param>
15911592
public static void ParseKey(string key, out string fileName, out string entryName)
1592-
{
1593-
// Default scenario, no entryName included in key
1594-
entryName = null; // default to all entries
1595-
fileName = key;
1596-
1597-
if (key == null)
1598-
{
1599-
return;
1600-
}
1601-
1602-
// Try extracting an entry name; Anything after a # sign
1603-
var hashIndex = key.LastIndexOf("#", StringComparison.Ordinal);
1604-
if (hashIndex != -1)
1605-
{
1606-
entryName = key.Substring(hashIndex + 1);
1607-
fileName = key.Substring(0, hashIndex);
1608-
}
1609-
}
1593+
{
1594+
// Default scenario, no entryName included in key
1595+
entryName = null; // default to all entries
1596+
fileName = key;
1597+
1598+
if (key == null)
1599+
{
1600+
return;
1601+
}
1602+
1603+
// Try extracting an entry name; Anything after a # sign
1604+
var hashIndex = key.LastIndexOf("#", StringComparison.Ordinal);
1605+
if (hashIndex != -1)
1606+
{
1607+
entryName = key.Substring(hashIndex + 1);
1608+
fileName = key.Substring(0, hashIndex);
1609+
}
1610+
}
1611+
1612+
/// <summary>
1613+
/// Helper method to determine if the specified data type supports extended market hours
1614+
/// </summary>
1615+
/// <param name="dataType">The data type</param>
1616+
/// <returns>Whether the specified data type supports extended market hours</returns>
1617+
public static bool SupportsExtendedMarketHours(Type dataType)
1618+
{
1619+
return !dataType.IsAssignableTo(typeof(BaseChainUniverseData));
1620+
}
16101621

16111622
/// <summary>
16121623
/// Helper method to aggregate ticks or bars into lower frequency resolutions

Tests/Algorithm/AlgorithmAddSecurityTests.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
using NUnit.Framework;
1818
using QuantConnect.Algorithm;
19+
using QuantConnect.Data.UniverseSelection;
1920
using QuantConnect.Lean.Engine.DataFeeds;
2021
using QuantConnect.Securities;
2122
using QuantConnect.Securities.Cfd;
@@ -26,7 +27,6 @@
2627
using QuantConnect.Securities.Future;
2728
using QuantConnect.Securities.IndexOption;
2829
using QuantConnect.Securities.Option;
29-
using QuantConnect.Securities.Positions;
3030
using QuantConnect.Tests.Engine.DataFeeds;
3131
using System;
3232
using System.Collections.Generic;
@@ -124,7 +124,16 @@ public void ProperlyAddsFutureWithExtendedMarketHours(
124124
[ValueSource(nameof(FuturesTestCases))] Func<QCAlgorithm, Security> getFuture)
125125
{
126126
var future = _algo.AddFuture(Futures.Indices.VIX, Resolution.Minute, extendedMarketHours: extendedMarketHours);
127-
Assert.That(_algo.SubscriptionManager.Subscriptions.Where(x => x.Symbol == future.Symbol).Select(x => x.ExtendedMarketHours),
127+
var subscriptions = _algo.SubscriptionManager.Subscriptions.Where(x => x.Symbol == future.Symbol).ToList();
128+
129+
var universeSubscriptions = subscriptions.Where(x => x.Type == typeof(FutureUniverse)).ToList();
130+
Assert.AreEqual(1, universeSubscriptions.Count);
131+
// Universe does not support extended market hours
132+
Assert.IsFalse(universeSubscriptions[0].ExtendedMarketHours);
133+
134+
var nonUniverseSubscriptions = subscriptions.Where(x => x.Type != typeof(FutureUniverse)).ToList();
135+
Assert.Greater(nonUniverseSubscriptions.Count, 0);
136+
Assert.That(nonUniverseSubscriptions.Select(x => x.ExtendedMarketHours),
128137
Has.All.EqualTo(extendedMarketHours));
129138
}
130139

0 commit comments

Comments
 (0)