This commit is contained in:
2026-02-13 13:49:40 +09:00
parent ad5e7e0ccb
commit 904e3011c9
6 changed files with 39 additions and 31 deletions
+14 -12
View File
@@ -49,7 +49,7 @@ object AutoTradingManager {
fun isRunning(): Boolean = discoveryJob?.isActive == true
private var remainingCandidates = mutableListOf<RankingStock>()
// private val processedCodes = mutableSetOf<String>() // 중복 처리 방지용 (선택 사항)
// private val processedCodes = mutableSetOf<String>() // 중복 처리 방지용 (선택 사항)
private val reanalysisList = mutableListOf<RankingStock>()
private val retryCountMap = mutableMapOf<String, Int>()
/**
@@ -102,16 +102,14 @@ object AutoTradingManager {
if (remainingCandidates.isEmpty()) {
val candidates: MutableList<RankingStock> = fetchCandidates(tradeService).apply {
println("후보군 총 개수 : $size")
}
.filter { (it.prdy_ctrt.toDoubleOrNull() ?: 0.0) in MIN_RISE_RATE..MAX_RISE_RATE }
.filter { it.code !in myHoldings && it.code !in pendingStocks }
.filter { !it.name.contains("호스팩", true) }
}.filter { !it.name.contains("호스팩", true) }
.sortedBy { (it.prdy_ctrt.toDoubleOrNull() ?: 0.0) }
.toMutableList()
if (reanalysisList.isNotEmpty()) {
candidates.addAll(reanalysisList)
}
remainingCandidates.addAll(candidates.distinctBy { it.code })
remainingCandidates.addAll(candidates.filter { it.code !in myHoldings && it.code !in pendingStocks }.distinctBy { it.code })
} else {
println("미확인 데이터 ${remainingCandidates.size}")
}
@@ -148,7 +146,7 @@ object AutoTradingManager {
delay(5000)
}
waitForNextCycle(1)
waitForNextCycle(0.5)
}
}
}
@@ -200,7 +198,7 @@ object AutoTradingManager {
}
RagService.processStock(analyzer, stock.name, stock.code) { decision, isSuccess ->
RagService.processStock(currentPrice,analyzer, stock.name, stock.code) { decision, isSuccess ->
callback(decision?.apply { this.currentPrice = currentPrice }, isSuccess)
}
println("✅ [분석 종료] ${stock.name} (${LocalTime.now()})")
@@ -217,6 +215,9 @@ object AutoTradingManager {
// async { tradeService.fetchMarketRanking(RankingType.VOLUME1, true).getOrDefault(emptyList()) },
// async { tradeService.fetchMarketRanking(RankingType.VOLUME0, true).getOrDefault(emptyList()) },
async { tradeService.fetchMarketRanking(RankingType.VOLUME, true).getOrDefault(emptyList()) },
async { tradeService.fetchMarketRanking(RankingType.VOLUME0, true).getOrDefault(emptyList()) },
async { tradeService.fetchMarketRanking(RankingType.VOLUME1, true).getOrDefault(emptyList()) },
async { tradeService.fetchMarketRanking(RankingType.VOLUME4, true).getOrDefault(emptyList()) },
async { tradeService.fetchMarketRanking(RankingType.RISE, true).getOrDefault(emptyList()) },
async { tradeService.fetchMarketRanking(RankingType.FALL, true).getOrDefault(emptyList()) },
// async { tradeService.fetchMarketRanking(RankingType.RISE2, true).getOrDefault(emptyList()) },
@@ -236,12 +237,13 @@ object AutoTradingManager {
startAutoDiscoveryLoop(tradeService, callback)
}
private suspend fun waitForNextCycle(minutes: Int) {
private suspend fun waitForNextCycle(minutes: Double) {
println("💤 대기 모드 진입...")
val endWait = System.currentTimeMillis() + (minutes * 60 * 1000L)
while (System.currentTimeMillis() < endWait && isRunning()) {
lastTickTime.set(System.currentTimeMillis()) // 대기 중에도 Watchdog에 생존 신고
delay(10000)
println("💤 대기 모드 상태 확인...")
delay(5000)
}
}
@@ -273,9 +275,9 @@ object AutoTradingManager {
println("🛑 [AutoTrading] 자동 발굴 중단됨")
}
fun addStock(technicalAnalyzer : TechnicalAnalyzer,stockName: String, stockCode: String, result: TradingDecisionCallback) {
fun addStock(currentPrice : Double , technicalAnalyzer : TechnicalAnalyzer,stockName: String, stockCode: String, result: TradingDecisionCallback) {
scope.launch {
RagService.processStock(technicalAnalyzer,stockName, stockCode, result)
RagService.processStock(currentPrice,technicalAnalyzer,stockName, stockCode, result)
}
}