From dc18d5baafcad6d1dc1359b12035179ca18174be Mon Sep 17 00:00:00 2001 From: lunaticbum Date: Mon, 23 Mar 2026 10:54:54 +0900 Subject: [PATCH] .... --- src/main/kotlin/network/RagService.kt | 33 ++++++++++--------- src/main/kotlin/service/AutoTradingManager.kt | 24 ++++++++++---- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/src/main/kotlin/network/RagService.kt b/src/main/kotlin/network/RagService.kt index 159e195..707c636 100644 --- a/src/main/kotlin/network/RagService.kt +++ b/src/main/kotlin/network/RagService.kt @@ -199,23 +199,26 @@ object RagService { val financialScore = FinancialAnalyzer.calculateScore(financialStmt) val scores = technicalAnalyzer.calculateScores(financialScore) + if (scores.avg() > 50) { + result(tradingDecision, false) - result(tradingDecision, false) + tradingDecision.techSummary = technicalAnalyzer.generateComprehensiveReport() + result(tradingDecision, false) - tradingDecision.techSummary = technicalAnalyzer.generateComprehensiveReport() - result(tradingDecision, false) - - val question = "${corpInfo?.cName} $stockName[$stockCode]의 향후 실적 전망과 관련된 핵심 뉴스" - val questionEmbedding = embeddingModel.embed(question).content() - val searchResult = embeddingStore.search( - EmbeddingSearchRequest.builder() - .queryEmbedding(questionEmbedding) - .maxResults(3) - .build() - ) - tradingDecision.newsContext = searchResult.matches().joinToString("\n") { it.embedded().text() } - result(tradingDecision, false) - result(decideTrading(stockCode, scores,financialStmt,tradingDecision), true) + val question = "${corpInfo?.cName} $stockName[$stockCode]의 향후 실적 전망과 관련된 핵심 뉴스" + val questionEmbedding = embeddingModel.embed(question).content() + val searchResult = embeddingStore.search( + EmbeddingSearchRequest.builder() + .queryEmbedding(questionEmbedding) + .maxResults(3) + .build() + ) + tradingDecision.newsContext = searchResult.matches().joinToString("\n") { it.embedded().text() } + result(tradingDecision, false) + result(decideTrading(stockCode, scores, financialStmt, tradingDecision), true) + } else { + result(tradingDecision, false) + } } else { result(tradingDecision, false) } diff --git a/src/main/kotlin/service/AutoTradingManager.kt b/src/main/kotlin/service/AutoTradingManager.kt index c873b52..dcd20f3 100644 --- a/src/main/kotlin/service/AutoTradingManager.kt +++ b/src/main/kotlin/service/AutoTradingManager.kt @@ -96,7 +96,10 @@ object AutoTradingManager { TradingLogStore.addLog(completeTradingDecision) println("🚀 [자동매수 실행] ${completeTradingDecision.stockName}") - if (completeTradingDecision != null && !completeTradingDecision.stockCode.isNullOrEmpty()) { + if (completeTradingDecision.confidence < 10) { + addToReanalysis(RankingStock(mksc_shrn_iscd = completeTradingDecision.stockCode,hts_kor_isnm = completeTradingDecision.stockName)) + TradingLogStore.addLog(completeTradingDecision,"HOLD","분석 신뢰도 오류 인지로 재분석 대기열에 추가") + }else if (completeTradingDecision != null && !completeTradingDecision.stockCode.isNullOrEmpty()) { var basePrice = completeTradingDecision.currentPrice var stockCode = completeTradingDecision.stockCode println("basePrice $basePrice") @@ -156,8 +159,11 @@ object AutoTradingManager { TradingLogStore.addLog(completeTradingDecision,"HOLD","✋ [관망] 토탈 스코어(${String.format("%.1f[${minScore}]", totalScore)}) 또는 신뢰도 (${String.format("%.1f[${MIN_CONFIDENCE}]", completeTradingDecision.confidence)}) 미달") } } + if (completeTradingDecision?.decision?.contains("매수") == true) { + completeTradingDecision.decision = "BUY" + } when (completeTradingDecision?.decision) { - "BUY" -> { + "BUY","매수" -> { append = buyWeight TradingLogStore.addLog(completeTradingDecision,"BUY","[$stockCode] 매수 추천 resultCheck: ${completeTradingDecision?.reason}") resultCheck(completeTradingDecision) @@ -451,7 +457,7 @@ object AutoTradingManager { BrowserManager.closeIfIdle(0) LlamaServerManager.stopAll() // AI 서버 완전 종료 TradingLogStore.clear() - // Main.kt에 설정 화면으로 가라고 신호 전송 + // Main.kt에 설정 화면으로 가라고 신호 전송 stopDiscovery() // 발굴 루프 완전 폭파 (내일 8시 30분에 다시 켜짐) return@launch } else if (now.isAfter(H08M30) && now.isBefore(H08M50) && !isSystemReadyToday) { @@ -668,10 +674,10 @@ object AutoTradingManager { this.monthly = monthly.await() } } - - - RagService.processStock(currentPrice,analyzer, stock.name, stock.code) { decision, isSuccess -> - callback(decision?.apply { this.currentPrice = currentPrice }, isSuccess) + if (analyzer.isValid()) { + RagService.processStock(currentPrice, analyzer, stock.name, stock.code) { decision, isSuccess -> + callback(decision?.apply { this.currentPrice = currentPrice }, isSuccess) + } } println("✅ [분석 종료] ${stock.name} (${LocalTime.now()})") } @@ -862,6 +868,8 @@ data class InvestmentScores( longTerm $longTerm """.trimIndent() } + + fun avg() = listOf(ultraShort, shortTerm, midTerm, longTerm).average() } @Serializable @@ -871,6 +879,8 @@ class TechnicalAnalyzer { var daily: List = emptyList() var min30: List = emptyList() + fun isValid() = listOf(min30,monthly, weekly,daily).filter { it.size > 0 }.size == 4 + fun isOverheatedStock(): Boolean { if (min30.size < 20 || daily.size < 20) return false