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