This commit is contained in:
2026-08-03 11:53:29 +09:00
parent b134dea1e1
commit acd26abe1e
7 changed files with 138 additions and 25 deletions
+18 -3
View File
@@ -39,6 +39,7 @@ import network.KisWebSocketManager
import network.RagService
import network.RagService.isSafetyBeltStockCodes
import network.StockUniverseLoader
import okhttp3.internal.wait
import report.TradingReportManager
import util.MarketUtil
import java.time.LocalDate
@@ -1161,7 +1162,8 @@ object AutoTradingManager {
val tempAnalyzer = TechnicalAnalyzer().apply { this.daily = dailyData }
// 1. 변동성 기반 수익률 검증 (2% 이상 열려있는가?)
val volatility = tempAnalyzer.calculateVolatilityForecast(dailyData, 40)
println("(dailyData.size * 0.8).toInt() ${(dailyData.size * 0.8).toInt()}")
val volatility = tempAnalyzer.calculateVolatilityForecast(dailyData, (dailyData.size * 0.8).toInt())
val expectedProfitRate = ((volatility.realisticHigh - currentPrice) / currentPrice) * 100.0
// 2. 일봉 기준 반등 주기 통계 추출 (일주일 내 승부 가능한가?)
@@ -1173,7 +1175,7 @@ object AutoTradingManager {
timeTolerance = dailyStats.timeTolerance
)
print("-> [${stock.name}] 필터링 ${dailyStats.avgReboundPeriod} ${dailyStats.avgDropRate} ${dailyStats.timeTolerance}")
val isSteadyUptrend = tempAnalyzer.checkSteadyUptrend(dailyData)
val isSteadyUptrend = false //tempAnalyzer.checkSteadyUptrend(dailyData)
// 🌟 [수정] 조건 통합 (OR 조건)
@@ -1192,13 +1194,26 @@ object AutoTradingManager {
if (dropPrediction != null) {
// 💡 [방어 로직] 아직 바닥까지 한참 남았는데 섣불리 들어가는 것을 방지!
// 과거 평균 10% 빠지는 종목인데, 지금 겨우 -3% 빠진 상태라면 (남은 하락폭 -7%)
if (dropPrediction.remainingDropRate < -2.0 && !dropPrediction.isBottomZone) {
if (dropPrediction.remainingDropRate < -1.5 && !dropPrediction.isBottomZone) {
print("-> [${stock.name}] 지하실 주의 (현재 ${"%.1f".format(dropPrediction.currentDropRate)}% 하락, 바닥까지 ${"%.1f".format(dropPrediction.remainingDropRate)}% 추가 하락 위험) | ")
return@withTimeout // 매수 후보에서 과감히 제외!
}
// 반대로 완벽한 바닥권(isBottomZone = true)에 들어왔다면 매수 타점으로 인정하여 다음 단계로 넘김
}
if (KisSession.tradeConfig.isUpcomingDividend) {
var dividend = KisTradeService.fetchUpcomingDividend(stock.code).getOrNull()
if(dividend?.hasDividend == true){
println("[${stock.name}] 배당락일 ${dividend.exDividendDate} : ${dividend.dividendAmount}")
} else {
println("[${stock.name}] 배당 정보 없어서 분석 종료")
return@withTimeout
}
} else {
println("[${stock.name}] 배당 정보 무관 함.")
}
println("🔍 [분석 진입] ${stock.name} (${LocalTime.now()}) (예측수익: ${"%.1f".format(expectedProfitRate)}%, 주기: ${"%.1f".format(dailyStats.avgReboundPeriod)}일, 진입권: $isValidEntryTiming)")
if (!isSafetyBeltStockCodes.contains(stock.code)) {
val analyzer = coroutineScope {