....
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user