From adca64721fe68dba944b976de65ec4e19e662262 Mon Sep 17 00:00:00 2001 From: ened Date: Wed, 7 Jun 2023 01:42:07 +0900 Subject: [PATCH] Check if today is holiday for stock business date --- .../Domestic/DomesticStockSearch.swift | 6 ++--- .../Domestic/DomesticStockSearchResult.swift | 8 +++++++ .../Sources/Foundation+Extensions.swift | 1 + .../Sources/KissConsole+Candle.swift | 9 ++++++++ KissMeConsole/Sources/KissConsole.swift | 18 +++++++++++++++ KissMeConsole/Sources/KissContext.swift | 23 +++++++++++++++++++ bin/data | 2 +- .../KissMeConsole.xcodeproj/project.pbxproj | 4 ++++ 8 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 KissMeConsole/Sources/KissContext.swift diff --git a/KissMe/Sources/Domestic/DomesticStockSearch.swift b/KissMe/Sources/Domestic/DomesticStockSearch.swift index 58a2469..e511a75 100644 --- a/KissMe/Sources/Domestic/DomesticStockSearch.swift +++ b/KissMe/Sources/Domestic/DomesticStockSearch.swift @@ -128,7 +128,7 @@ extension Domestic { public typealias KResult = HolidyResult public var url: String { "/uapi/domestic-stock/v1/quotations/chk-holiday" } - public var method: Method { .post } + public var method: Method { .get } public var header: [String: String?] { [ @@ -142,8 +142,8 @@ extension Domestic { public var body: [String: Any] { [ "BASS_DT": baseDate, - "CTX_AREA_NK": String(repeating: " ", count: 20), - "CTX_AREA_FK": String(repeating: " ", count: 20), + "CTX_AREA_NK": " ", + "CTX_AREA_FK": " ", ] } public var result: KResult? = nil diff --git a/KissMe/Sources/Domestic/DomesticStockSearchResult.swift b/KissMe/Sources/Domestic/DomesticStockSearchResult.swift index 05a2239..fc1eca1 100644 --- a/KissMe/Sources/Domestic/DomesticStockSearchResult.swift +++ b/KissMe/Sources/Domestic/DomesticStockSearchResult.swift @@ -153,6 +153,14 @@ public struct HolidyResult: Codable { case output = "output" } + public func isHoliday(_ date: Date) -> Bool { + let dateString = Date().yyyyMMdd + guard let target = output?.first(where: { $0.baseDate == dateString }) else { + return false + } + return target.businessDayOpened != .yes + } + public struct OutputDetail: Codable { /// 기준일자 public let baseDate: String diff --git a/KissMeConsole/Sources/Foundation+Extensions.swift b/KissMeConsole/Sources/Foundation+Extensions.swift index 417b954..6d53263 100644 --- a/KissMeConsole/Sources/Foundation+Extensions.swift +++ b/KissMeConsole/Sources/Foundation+Extensions.swift @@ -68,6 +68,7 @@ extension Date { components.hour = hour components.minute = min components.second = sec + components.nanosecond = 0 return Calendar.current.date(from: components) } diff --git a/KissMeConsole/Sources/KissConsole+Candle.swift b/KissMeConsole/Sources/KissConsole+Candle.swift index c93b9cd..892fc76 100644 --- a/KissMeConsole/Sources/KissConsole+Candle.swift +++ b/KissMeConsole/Sources/KissConsole+Candle.swift @@ -158,6 +158,15 @@ extension KissConsole { return false } } + + func checkHoliday(_ date: Date) async throws -> Bool { + guard await KissContext.shared.targetDate.yyyyMMdd != date.yyyyMMdd else { + return await KissContext.shared.isHoliday + } + let isHoliday = try await account!.getHolyday(baseDate: date).isHoliday(date) + await KissContext.shared.updateHoliday(isHoliday, targetDate: date) + return isHoliday + } } diff --git a/KissMeConsole/Sources/KissConsole.swift b/KissMeConsole/Sources/KissConsole.swift index 1a854c7..b9c4294 100644 --- a/KissMeConsole/Sources/KissConsole.swift +++ b/KissMeConsole/Sources/KissConsole.swift @@ -578,6 +578,12 @@ extension KissConsole { for item in all { let semaphore = DispatchSemaphore(value: 0) Task { + let holiday = try? await checkHoliday(Date()) + if holiday == true { + print("DONE today is holiday") + return + } + let success = await getCandle(productNo: item.shortCode) print("DONE \(success) \(item.shortCode)") semaphore.signal() @@ -614,6 +620,12 @@ extension KissConsole { for item in all { let semaphore = DispatchSemaphore(value: 0) Task { + let holiday = try? await checkHoliday(Date()) + if holiday == true { + print("DONE today is holiday") + return + } + let success = await getRecentCandle(productNo: item.shortCode, period: .daily, count: 250) print("DONE \(success) \(item.shortCode)") semaphore.signal() @@ -655,6 +667,12 @@ extension KissConsole { for item in all { let semaphore = DispatchSemaphore(value: 0) Task { + let holiday = try? await checkHoliday(Date()) + if holiday == true { + print("DONE today is holiday") + return + } + let success = await getRecentCandle(productNo: item.shortCode, period: .weekly, count: 52) print("DONE \(success) \(item.shortCode)") semaphore.signal() diff --git a/KissMeConsole/Sources/KissContext.swift b/KissMeConsole/Sources/KissContext.swift new file mode 100644 index 0000000..386d246 --- /dev/null +++ b/KissMeConsole/Sources/KissContext.swift @@ -0,0 +1,23 @@ +// +// KissContext.swift +// KissMeConsole +// +// Created by ened-book-m1 on 2023/06/07. +// + +import Foundation + + +actor KissContext { + static let shared = KissContext() + + private(set) var targetDate: Date = Date(timeIntervalSince1970: 0) + private(set) var isHoliday: Bool = false + + private init() { } + + func updateHoliday(_ isHolyday: Bool, targetDate: Date) { + self.isHoliday = isHolyday + self.targetDate = targetDate + } +} diff --git a/bin/data b/bin/data index 01238b7..d58e848 160000 --- a/bin/data +++ b/bin/data @@ -1 +1 @@ -Subproject commit 01238b796d88985d872f00ab2b320ac6f1598743 +Subproject commit d58e84860b4dccc29a8784e3bf31e0ed238f190a diff --git a/projects/macos/KissMeConsole.xcodeproj/project.pbxproj b/projects/macos/KissMeConsole.xcodeproj/project.pbxproj index 244a34c..91b914d 100644 --- a/projects/macos/KissMeConsole.xcodeproj/project.pbxproj +++ b/projects/macos/KissMeConsole.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ 341F5ED42A0A8B9000962D48 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 341F5ED32A0A8B9000962D48 /* main.swift */; }; 341F5F052A13B82F00962D48 /* test.swift in Sources */ = {isa = PBXBuildFile; fileRef = 341F5F042A13B82F00962D48 /* test.swift */; }; 341F5F092A1463A100962D48 /* KissConsole.swift in Sources */ = {isa = PBXBuildFile; fileRef = 341F5F082A1463A100962D48 /* KissConsole.swift */; }; + 348168492A2F92AC00A50BD3 /* KissContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348168482A2F92AC00A50BD3 /* KissContext.swift */; }; 349327F72A20E3E300097063 /* Foundation+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349327F62A20E3E300097063 /* Foundation+Extensions.swift */; }; 349843212A242AC900E85B08 /* KissConsole+CSV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349843202A242AC900E85B08 /* KissConsole+CSV.swift */; }; 34D3680D2A280801005E6756 /* KissConsole+Candle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D3680C2A280801005E6756 /* KissConsole+Candle.swift */; }; @@ -46,6 +47,7 @@ 341F5EDB2A0A8C4600962D48 /* KissMe.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = KissMe.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 341F5F042A13B82F00962D48 /* test.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = test.swift; sourceTree = ""; }; 341F5F082A1463A100962D48 /* KissConsole.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KissConsole.swift; sourceTree = ""; }; + 348168482A2F92AC00A50BD3 /* KissContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KissContext.swift; sourceTree = ""; }; 349327F62A20E3E300097063 /* Foundation+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Foundation+Extensions.swift"; sourceTree = ""; }; 3498431E2A24287600E85B08 /* KissMeConsoleTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KissMeConsoleTests.swift; sourceTree = ""; }; 349843202A242AC900E85B08 /* KissConsole+CSV.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KissConsole+CSV.swift"; sourceTree = ""; }; @@ -87,6 +89,7 @@ children = ( 341F5ED32A0A8B9000962D48 /* main.swift */, 341F5F042A13B82F00962D48 /* test.swift */, + 348168482A2F92AC00A50BD3 /* KissContext.swift */, 341F5F082A1463A100962D48 /* KissConsole.swift */, 34D3680C2A280801005E6756 /* KissConsole+Candle.swift */, 349843202A242AC900E85B08 /* KissConsole+CSV.swift */, @@ -178,6 +181,7 @@ 341F5F092A1463A100962D48 /* KissConsole.swift in Sources */, 341F5F052A13B82F00962D48 /* test.swift in Sources */, 349843212A242AC900E85B08 /* KissConsole+CSV.swift in Sources */, + 348168492A2F92AC00A50BD3 /* KissContext.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; };