diff --git a/KissMe/Sources/Domestic/DomesticStockPrice.swift b/KissMe/Sources/Domestic/DomesticStockPrice.swift index 241d7f5..e080ea1 100644 --- a/KissMe/Sources/Domestic/DomesticStockPrice.swift +++ b/KissMe/Sources/Domestic/DomesticStockPrice.swift @@ -129,7 +129,7 @@ extension Domestic { } public var body: [String: Any] { [ - "FID_COND_MRKT_DIV_CODE": "", + "FID_COND_MRKT_DIV_CODE": "J", "FID_INPUT_ISCD": productNo, "FID_INPUT_DATE_1": startDate, "FID_INPUT_DATE_2": endDate, @@ -140,7 +140,7 @@ extension Domestic { public var result: KResult? = nil public let credential: Credential public var responseDataLoggable: Bool { - return false + return true } @@ -150,8 +150,8 @@ extension Domestic { public let accessToken: String let productNo: String - let startDate: String /// yyyyMMdd - let endDate: String /// yyyyMMdd + let startDate: String /// yyyyMMdd (Older date) + let endDate: String /// yyyyMMdd (Newer date) let period: PeriodDivision let priceType: PriceType diff --git a/KissMe/Sources/Domestic/DomesticStockPriceResult.swift b/KissMe/Sources/Domestic/DomesticStockPriceResult.swift index 67c6ae3..df1709d 100644 --- a/KissMe/Sources/Domestic/DomesticStockPriceResult.swift +++ b/KissMe/Sources/Domestic/DomesticStockPriceResult.swift @@ -707,7 +707,7 @@ public struct PeriodPriceResult: Codable { case per = "per" case eps = "eps" case pbr = "pbr" - case totalOutstandingloanRate = "whol_loan_rmnd_rate" + case totalOutstandingloanRate = "itewhol_loan_rmnd_ratem name" } } diff --git a/KissMeConsole/Sources/Foundation+Extensions.swift b/KissMeConsole/Sources/Foundation+Extensions.swift index 1d7effb..d226c44 100644 --- a/KissMeConsole/Sources/Foundation+Extensions.swift +++ b/KissMeConsole/Sources/Foundation+Extensions.swift @@ -41,6 +41,25 @@ extension String { } extension Date { + + public var yyyyMMdd_split: (year: Int, month: Int, day: Int)? { + let sets: Set = [.year, .month, .day, .hour, .minute, .second] + let components = Calendar.current.dateComponents(sets, from: self) + guard let year = components.year, let month = components.month, let day = components.day else { + return nil + } + return (year, month, day) + } + + public var HHmmss_split: (hour: Int, minute: Int, second: Int)? { + let sets: Set = [.year, .month, .day, .hour, .minute, .second] + let components = Calendar.current.dateComponents(sets, from: self) + guard let hour = components.hour, let minute = components.minute, let second = components.second else { + return nil + } + return (hour, minute, second) + } + public func changing(hour: Int, min: Int, sec: Int, timeZone: String = "KST") -> Date? { let sets: Set = [.year, .month, .day, .hour, .minute, .second] var components = Calendar.current.dateComponents(sets, from: self) diff --git a/KissMeConsole/Sources/KissConsole+Candle.swift b/KissMeConsole/Sources/KissConsole+Candle.swift index 1fd0c8a..1bbbadc 100644 --- a/KissMeConsole/Sources/KissConsole+Candle.swift +++ b/KissMeConsole/Sources/KissConsole+Candle.swift @@ -19,7 +19,13 @@ let SecondsForOneDay: TimeInterval = 60 * 60 * 24 extension KissConsole { var last250Days: (startDate: Date, endDate: Date) { - let endDate = Date().changing(hour: 0, min: 0, sec: 0)! + var curDate = Date() + if let (hour, _, _) = curDate.HHmmss_split { + if hour < 9 { + curDate.addTimeInterval(-SecondsForOneDay) + } + } + let endDate = curDate.changing(hour: 0, min: 0, sec: 0)! let startDate = endDate.addingTimeInterval(-250 * SecondsForOneDay) return (startDate, endDate) } @@ -27,7 +33,13 @@ extension KissConsole { var last52Weeks: (startDate: Date, endDate: Date) { // TODO: 주당 가격을 얻기 위해, 거래 시작일을 마지막 장 개설일로 보정할 필요가 있을까? - let endDate = Date().changing(hour: 0, min: 0, sec: 0)! + var curDate = Date() + if let (hour, _, _) = curDate.HHmmss_split { + if hour < 9 { + curDate.addTimeInterval(-SecondsForOneDay) + } + } + let endDate = curDate.changing(hour: 0, min: 0, sec: 0)! let startDate = endDate.addingTimeInterval(-52 * 7 * SecondsForOneDay) return (startDate, endDate) } @@ -61,25 +73,38 @@ extension KissConsole { currentCandleShortCode = nil } - var nextTime = startDate + var reqStartDate = startDate + var reqEndDate = reqStartDate.addingTimeInterval(99 * SecondsForOneDay) + if reqEndDate > endDate { + reqEndDate = endDate + } + var candles = [Domestic.CandlePeriod]() var count = 0 - + while true { count += 1 + print("\(period) price \(productNo) from \(reqStartDate.yyyyMMdd_HHmmss_forTime) to \(reqEndDate.yyyyMMdd_HHmmss_forTime)") - let result = try await account!.getPeriodPrice(productNo: productNo, startDate: startDate, endDate: endDate, period: period) + let result = try await account!.getPeriodPrice(productNo: productNo, startDate: reqStartDate, endDate: reqEndDate, period: period) if let prices = result.output2, prices.isEmpty == false { candles.append(contentsOf: prices) if let last = prices.last { - - // TODO: nextTime 갱신을 처리한다... + if let (yyyy, mm, dd) = last.stockBusinessDate.yyyyMMdd { + print("next: \(last.stockBusinessDate)") + reqStartDate.change(year: yyyy, month: mm, day: dd+1) + reqEndDate = reqStartDate.addingTimeInterval(99 * SecondsForOneDay) + if reqEndDate > endDate { + reqEndDate = endDate + } + } } try await Task.sleep(nanoseconds: 1_000_000_000 / PreferredCandleTPS) } else { print("\(period) price finished") + break } } @@ -118,6 +143,7 @@ extension KissConsole { let more = (count > 0) count += 1 print("minute price \(productNo) from \(nextTime.yyyyMMdd_HHmmss_forTime) \(more)") + let result = try await account!.getMinutePrice(productNo: productNo, startTodayTime: nextTime, more: more) if let prices = result.output2, prices.isEmpty == false { diff --git a/KissMeConsole/Sources/KissConsole.swift b/KissMeConsole/Sources/KissConsole.swift index c338ccb..6080e27 100644 --- a/KissMeConsole/Sources/KissConsole.swift +++ b/KissMeConsole/Sources/KissConsole.swift @@ -584,6 +584,9 @@ extension KissConsole { } let (startDate, endDate) = last250Days +// let startDate = Date().changing(year: 2022, month: 12, day: 1)! +// let endDate = Date().changing(year: 2022, month: 12, day: 30)! + let semaphore = DispatchSemaphore(value: 0) Task { let success = await getCandle(productNo: productNo, period: .daily, startDate: startDate, endDate: endDate)