This commit is contained in:
lunaticbum 2026-03-23 10:54:54 +09:00
parent d804c7061b
commit dc18d5baaf
2 changed files with 35 additions and 22 deletions

View File

@ -199,23 +199,26 @@ object RagService {
val financialScore = FinancialAnalyzer.calculateScore(financialStmt) val financialScore = FinancialAnalyzer.calculateScore(financialStmt)
val scores = technicalAnalyzer.calculateScores(financialScore) 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() val question = "${corpInfo?.cName} $stockName[$stockCode]의 향후 실적 전망과 관련된 핵심 뉴스"
result(tradingDecision, false) val questionEmbedding = embeddingModel.embed(question).content()
val searchResult = embeddingStore.search(
val question = "${corpInfo?.cName} $stockName[$stockCode]의 향후 실적 전망과 관련된 핵심 뉴스" EmbeddingSearchRequest.builder()
val questionEmbedding = embeddingModel.embed(question).content() .queryEmbedding(questionEmbedding)
val searchResult = embeddingStore.search( .maxResults(3)
EmbeddingSearchRequest.builder() .build()
.queryEmbedding(questionEmbedding) )
.maxResults(3) tradingDecision.newsContext = searchResult.matches().joinToString("\n") { it.embedded().text() }
.build() result(tradingDecision, false)
) result(decideTrading(stockCode, scores, financialStmt, tradingDecision), true)
tradingDecision.newsContext = searchResult.matches().joinToString("\n") { it.embedded().text() } } else {
result(tradingDecision, false) result(tradingDecision, false)
result(decideTrading(stockCode, scores,financialStmt,tradingDecision), true) }
} else { } else {
result(tradingDecision, false) result(tradingDecision, false)
} }

View File

@ -96,7 +96,10 @@ object AutoTradingManager {
TradingLogStore.addLog(completeTradingDecision) TradingLogStore.addLog(completeTradingDecision)
println("🚀 [자동매수 실행] ${completeTradingDecision.stockName}") 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 basePrice = completeTradingDecision.currentPrice
var stockCode = completeTradingDecision.stockCode var stockCode = completeTradingDecision.stockCode
println("basePrice $basePrice") 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)}) 미달") 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) { when (completeTradingDecision?.decision) {
"BUY" -> { "BUY","매수" -> {
append = buyWeight append = buyWeight
TradingLogStore.addLog(completeTradingDecision,"BUY","[$stockCode] 매수 추천 resultCheck: ${completeTradingDecision?.reason}") TradingLogStore.addLog(completeTradingDecision,"BUY","[$stockCode] 매수 추천 resultCheck: ${completeTradingDecision?.reason}")
resultCheck(completeTradingDecision) resultCheck(completeTradingDecision)
@ -451,7 +457,7 @@ object AutoTradingManager {
BrowserManager.closeIfIdle(0) BrowserManager.closeIfIdle(0)
LlamaServerManager.stopAll() // AI 서버 완전 종료 LlamaServerManager.stopAll() // AI 서버 완전 종료
TradingLogStore.clear() TradingLogStore.clear()
// Main.kt에 설정 화면으로 가라고 신호 전송 // Main.kt에 설정 화면으로 가라고 신호 전송
stopDiscovery() // 발굴 루프 완전 폭파 (내일 8시 30분에 다시 켜짐) stopDiscovery() // 발굴 루프 완전 폭파 (내일 8시 30분에 다시 켜짐)
return@launch return@launch
} else if (now.isAfter(H08M30) && now.isBefore(H08M50) && !isSystemReadyToday) { } else if (now.isAfter(H08M30) && now.isBefore(H08M50) && !isSystemReadyToday) {
@ -668,10 +674,10 @@ object AutoTradingManager {
this.monthly = monthly.await() this.monthly = monthly.await()
} }
} }
if (analyzer.isValid()) {
RagService.processStock(currentPrice, analyzer, stock.name, stock.code) { decision, isSuccess ->
RagService.processStock(currentPrice,analyzer, stock.name, stock.code) { decision, isSuccess -> callback(decision?.apply { this.currentPrice = currentPrice }, isSuccess)
callback(decision?.apply { this.currentPrice = currentPrice }, isSuccess) }
} }
println("✅ [분석 종료] ${stock.name} (${LocalTime.now()})") println("✅ [분석 종료] ${stock.name} (${LocalTime.now()})")
} }
@ -862,6 +868,8 @@ data class InvestmentScores(
longTerm $longTerm longTerm $longTerm
""".trimIndent() """.trimIndent()
} }
fun avg() = listOf(ultraShort, shortTerm, midTerm, longTerm).average()
} }
@Serializable @Serializable
@ -871,6 +879,8 @@ class TechnicalAnalyzer {
var daily: List<CandleData> = emptyList() var daily: List<CandleData> = emptyList()
var min30: List<CandleData> = emptyList() var min30: List<CandleData> = emptyList()
fun isValid() = listOf(min30,monthly, weekly,daily).filter { it.size > 0 }.size == 4
fun isOverheatedStock(): Boolean { fun isOverheatedStock(): Boolean {
if (min30.size < 20 || daily.size < 20) return false if (min30.size < 20 || daily.size < 20) return false