diff --git a/KissMeConsole/Sources/KissConsole.swift b/KissMeConsole/Sources/KissConsole.swift index e178ff3..4255a9d 100644 --- a/KissMeConsole/Sources/KissConsole.swift +++ b/KissMeConsole/Sources/KissConsole.swift @@ -199,7 +199,7 @@ class KissConsole { case .now: await onNow(args) case .candle: await onCandle(args) - case .candleAll: onCancleAll() + case .candleAll: onCancleAll(args) case .candleDay: onCandleDay(args) case .candleWeek: onCandleWeek(args) case .candleValidate: onCandleValidate(args) @@ -601,7 +601,18 @@ extension KissConsole { } - private func onCancleAll() { + private func onCancleAll(_ args: [String]) { + let semaphore = DispatchSemaphore(value: 0) + Task { + await KissContext.shared.update(candleResuming: false) + if args.count == 1, args[0] == "resume" { + await KissContext.shared.update(candleResuming: true) + } + semaphore.signal() + } + semaphore.wait() + + let all = getAllProducts() for item in all { let semaphore = DispatchSemaphore(value: 0) @@ -612,6 +623,16 @@ extension KissConsole { return } + if await KissContext.shared.isCandleResuming { + let curDate = Date() + let url = KissConsole.candleFileUrl(productNo: item.shortCode, period: .minute, day: curDate.yyyyMMdd) + let r = validateCsv(filePriod: .minute, url: url) + switch r { + case .ok, .invalidFileName: return + default: break + } + } + let success = await getCandle(productNo: item.shortCode) print("DONE \(success) \(item.shortCode)") semaphore.signal() @@ -721,13 +742,7 @@ extension KissConsole { var lastTime = Date.appTime for (index, url) in urls.enumerated() { - let r: CandleValidation - switch filePriod { - case .minute: r = KissConsole.validateCandleMinute(url) - case .day: r = KissConsole.validateCandleDay(url) - case .weak: r = KissConsole.validateCandleWeek(url) - } - + let r = validateCsv(filePriod: filePriod, url: url) switch r { case .ok, .invalidFileName: break @@ -746,6 +761,15 @@ extension KissConsole { } + func validateCsv(filePriod: CandleFilePeriod, url: URL) -> CandleValidation { + switch filePriod { + case .minute: return KissConsole.validateCandleMinute(url) + case .day: return KissConsole.validateCandleDay(url) + case .weak: return KissConsole.validateCandleWeek(url) + } + } + + private func onCandleValidate(_ args: [String]) { let period: CandleFilePeriod? if args.count == 1 { diff --git a/KissMeConsole/Sources/KissContext.swift b/KissMeConsole/Sources/KissContext.swift index 386d246..8533100 100644 --- a/KissMeConsole/Sources/KissContext.swift +++ b/KissMeConsole/Sources/KissContext.swift @@ -13,6 +13,7 @@ actor KissContext { private(set) var targetDate: Date = Date(timeIntervalSince1970: 0) private(set) var isHoliday: Bool = false + private(set) var isCandleResuming: Bool = false private init() { } @@ -20,4 +21,8 @@ actor KissContext { self.isHoliday = isHolyday self.targetDate = targetDate } + + func update(candleResuming: Bool) { + self.isCandleResuming = candleResuming + } } diff --git a/KissMeMatrix/README.md b/KissMeMatrix/README.md index 373140f..9842c9b 100644 --- a/KissMeMatrix/README.md +++ b/KissMeMatrix/README.md @@ -7,8 +7,11 @@ KissMeMatrix 는 다양한 주식의 지표 집합(index set) 통해서 교집 * Index Tool 들을 조합하여 모델을 만들고, 구동한 뒤에 INPUT / PROCESSING / OUTPUT 레이어를 설계 * 각 레이어별로 디버깅 환경 구성 * 각 레이어별로 시뮬레이션을 진행할 수 있도록 구성 +* INDEX SET + * 종목 + 추가되는 정보들 + * score (+값: 매수희망, -값: 매도희망, 교집합을 작성할 때 매수/매도의 성향에 영향) * INPUT - * 지표 데이터들 + * 지표 데이터들(ARRAY OF INDEX SET) * 지표 데이터는 각종 csv 에서 데이터를 수집. * PROCESSING * model.json 에 기술된 내용으로 지표 데이터를 수집하고 정리.