diff --git a/Common/Market.cs b/Common/Market.cs
index e4745023ce2f..4b6c2107a57f 100644
--- a/Common/Market.cs
+++ b/Common/Market.cs
@@ -71,7 +71,8 @@ public static class Market
Tuple.Create(InteractiveBrokers, 39),
Tuple.Create(EUREX, 40),
Tuple.Create(OSE, 41),
- Tuple.Create(DYDX, 42)
+ Tuple.Create(DYDX, 42),
+ Tuple.Create(KRX, 43)
};
static Market()
@@ -267,6 +268,11 @@ static Market()
///
public const string DYDX = "dydx";
+ ///
+ /// Korea Exchange
+ ///
+ public const string KRX = "krx";
+
///
/// Adds the specified market to the map of available markets with the specified identifier.
///
diff --git a/Common/Securities/Future/Futures.cs b/Common/Securities/Future/Futures.cs
index 2c228068d1a4..3e666d5be006 100644
--- a/Common/Securities/Future/Futures.cs
+++ b/Common/Securities/Future/Futures.cs
@@ -1555,6 +1555,12 @@ public static class Indices
/// The symbol
public const string HangSeng = "HSI";
+ ///
+ /// KOSPI 200 Index Futures
+ ///
+ /// The symbol
+ public const string Kospi200 = "KM";
+
///
/// Micro E-mini S&P 500 Index Futures
///
diff --git a/Common/Securities/Future/FuturesExpiryFunctions.cs b/Common/Securities/Future/FuturesExpiryFunctions.cs
index 30d93fc2e437..b63fb8d0a4fc 100644
--- a/Common/Securities/Future/FuturesExpiryFunctions.cs
+++ b/Common/Securities/Future/FuturesExpiryFunctions.cs
@@ -793,6 +793,25 @@ public static Func FuturesExpiryFunction(Symbol symbol)
})
},
+ // KOSPI 200 Index Futures (KM): http://global.krx.co.kr/contents/GLB/05/0503/0503010102/GLB0503010102.jsp
+ {Symbol.Create(Futures.Indices.Kospi200, SecurityType.Future, Market.KRX), (time =>
+ {
+ // Contract months: the four nearest months of the quarterly cycle (March, June, September, December)
+ // Last trading day: the second Thursday of the contract month. Trading terminates at 15:20 KST on that day.
+ // If the second Thursday is a holiday, the last trading day is the preceding business day.
+ var market = Market.KRX;
+ var symbol = Futures.Indices.Kospi200;
+ var holidays = FuturesExpiryUtilityFunctions.GetExpirationHolidays(market, symbol);
+
+ var lastTradingDay = FuturesExpiryUtilityFunctions.NthWeekday(time, 2, DayOfWeek.Thursday);
+ while (holidays.Contains(lastTradingDay) || !lastTradingDay.IsCommonBusinessDay())
+ {
+ lastTradingDay = lastTradingDay.AddDays(-1);
+ }
+ return lastTradingDay.Add(new TimeSpan(15, 20, 0));
+ })
+ },
+
// MSCI Europe Net Total Return (USD) Futures: https://www.theice.com/products/71512951/MSCI-Europe-NTR-Index-Future-USD & https://www.theice.com/publicdocs/futures_us/exchange_notices/ICE_Futures_US_2022_TRADING_HOLIDAY_CALENDAR_20211118.pdf
{Symbol.Create(Futures.Indices.MSCIEuropeNTR, SecurityType.Future, Market.NYSELIFFE), (time =>
{
diff --git a/Data/future/krx/margins/KM.csv b/Data/future/krx/margins/KM.csv
new file mode 100644
index 000000000000..b7e72721e38e
--- /dev/null
+++ b/Data/future/krx/margins/KM.csv
@@ -0,0 +1,3 @@
+# we don't have historical information for this symbol
+date,initial,maintenance
+19900101,7087500,4725000
diff --git a/Data/market-hours/market-hours-database.json b/Data/market-hours/market-hours-database.json
index 0aced1b51097..778c6b2a13b4 100644
--- a/Data/market-hours/market-hours-database.json
+++ b/Data/market-hours/market-hours-database.json
@@ -123301,6 +123301,144 @@
"earlyCloses": {},
"lateOpens": {}
},
+ "Future-krx-[*]": {
+ "dataTimeZone": "Asia/Seoul",
+ "exchangeTimeZone": "Asia/Seoul",
+ "sunday": [],
+ "monday": [
+ {
+ "start": "08:00:00",
+ "end": "09:00:00",
+ "state": "premarket"
+ },
+ {
+ "start": "09:00:00",
+ "end": "15:45:00",
+ "state": "market"
+ }
+ ],
+ "tuesday": [
+ {
+ "start": "08:00:00",
+ "end": "09:00:00",
+ "state": "premarket"
+ },
+ {
+ "start": "09:00:00",
+ "end": "15:45:00",
+ "state": "market"
+ }
+ ],
+ "wednesday": [
+ {
+ "start": "08:00:00",
+ "end": "09:00:00",
+ "state": "premarket"
+ },
+ {
+ "start": "09:00:00",
+ "end": "15:45:00",
+ "state": "market"
+ }
+ ],
+ "thursday": [
+ {
+ "start": "08:00:00",
+ "end": "09:00:00",
+ "state": "premarket"
+ },
+ {
+ "start": "09:00:00",
+ "end": "15:45:00",
+ "state": "market"
+ }
+ ],
+ "friday": [
+ {
+ "start": "08:00:00",
+ "end": "09:00:00",
+ "state": "premarket"
+ },
+ {
+ "start": "09:00:00",
+ "end": "15:45:00",
+ "state": "market"
+ }
+ ],
+ "saturday": [],
+ "holidays": [],
+ "earlyCloses": {},
+ "lateOpens": {}
+ },
+ "Future-krx-KM": {
+ "dataTimeZone": "Asia/Seoul",
+ "exchangeTimeZone": "Asia/Seoul",
+ "sunday": [],
+ "monday": [
+ {
+ "start": "08:00:00",
+ "end": "09:00:00",
+ "state": "premarket"
+ },
+ {
+ "start": "09:00:00",
+ "end": "15:45:00",
+ "state": "market"
+ }
+ ],
+ "tuesday": [
+ {
+ "start": "08:00:00",
+ "end": "09:00:00",
+ "state": "premarket"
+ },
+ {
+ "start": "09:00:00",
+ "end": "15:45:00",
+ "state": "market"
+ }
+ ],
+ "wednesday": [
+ {
+ "start": "08:00:00",
+ "end": "09:00:00",
+ "state": "premarket"
+ },
+ {
+ "start": "09:00:00",
+ "end": "15:45:00",
+ "state": "market"
+ }
+ ],
+ "thursday": [
+ {
+ "start": "08:00:00",
+ "end": "09:00:00",
+ "state": "premarket"
+ },
+ {
+ "start": "09:00:00",
+ "end": "15:45:00",
+ "state": "market"
+ }
+ ],
+ "friday": [
+ {
+ "start": "08:00:00",
+ "end": "09:00:00",
+ "state": "premarket"
+ },
+ {
+ "start": "09:00:00",
+ "end": "15:45:00",
+ "state": "market"
+ }
+ ],
+ "saturday": [],
+ "holidays": [],
+ "earlyCloses": {},
+ "lateOpens": {}
+ },
"Index-ose-[*]": {
"dataTimeZone": "Asia/Tokyo",
"exchangeTimeZone": "Asia/Tokyo",
diff --git a/Data/symbol-properties/symbol-properties-database.csv b/Data/symbol-properties/symbol-properties-database.csv
index d0abbf743488..1b923b30fa02 100644
--- a/Data/symbol-properties/symbol-properties-database.csv
+++ b/Data/symbol-properties/symbol-properties-database.csv
@@ -415,6 +415,9 @@ hkfe,[*],index,,HKD,1,0.01,1
ose,[*],index,,JPY,1,0.01,1
+krx,KM,future,KOSPI 200 Index Futures,KRW,250000,0.05,1.0
+krx,[*],index,,KRW,1,0.01,1
+
# Futures options -- will default to Futures contract specs in case no entry exists
cbot,OZB,futureoption,U.S. Treasury Bond American Futures Options,USD,1000.0,0.015625,1.0
cbot,OZC,futureoption,Corn American Futures Options,USD,5000.0,0.00125,1.0,,,100
diff --git a/Tests/Common/Securities/Futures/FuturesExpiryFunctionsTests.cs b/Tests/Common/Securities/Futures/FuturesExpiryFunctionsTests.cs
index 4bf4d3959d91..4c37b061ace5 100644
--- a/Tests/Common/Securities/Futures/FuturesExpiryFunctionsTests.cs
+++ b/Tests/Common/Securities/Futures/FuturesExpiryFunctionsTests.cs
@@ -56,6 +56,7 @@ public class FuturesExpiryFunctionsTests
private const string OneFortyFivePM = "13:45:00";
private const string ThreeThirtyPM = "15:30:00";
private const string FourFifteenPM = "16:15:00";
+ private const string ThreeTwentyPMKoreaTime = "15:20:00";
private readonly SymbolPropertiesDatabase _symbolPropertiesDatabase = SymbolPropertiesDatabase.FromDataFolder();
[OneTimeSetUp]
@@ -396,6 +397,7 @@ public void FinancialsExpiryDateFunction_WithDifferentDates_ShouldFollowContract
[TestCase(QuantConnect.Securities.Futures.Indices.VIX, EightOClockChicagoTime)]
[TestCase(QuantConnect.Securities.Futures.Indices.VIXMini, EightOClockChicagoTime)]
[TestCase(QuantConnect.Securities.Futures.Indices.Nikkei225Yen, TwoThirtyPM)]
+ [TestCase(QuantConnect.Securities.Futures.Indices.Kospi200, ThreeTwentyPMKoreaTime)]
[TestCase(QuantConnect.Securities.Futures.Indices.MSCITaiwanIndex, OneFortyFivePM)]
[TestCase(QuantConnect.Securities.Futures.Indices.Nifty50, ThreeThirtyPM)]
[TestCase(QuantConnect.Securities.Futures.Indices.BankNifty, ThreeThirtyPM)]
diff --git a/Tests/TestData/FuturesExpiryFunctionsTestData.xml b/Tests/TestData/FuturesExpiryFunctionsTestData.xml
index eeac9d8ec128..24e92306d4fd 100644
Binary files a/Tests/TestData/FuturesExpiryFunctionsTestData.xml and b/Tests/TestData/FuturesExpiryFunctionsTestData.xml differ