From ce63b5760adf25881489a7a8564f37e54a41e397 Mon Sep 17 00:00:00 2001 From: lunaticbum Date: Tue, 19 May 2026 13:33:59 +0900 Subject: [PATCH] ... --- src/main/kotlin/service/AutoTradingManager.kt | 54 ++++++++++++++----- stocks_universe.json | 16 ++++++ 2 files changed, 57 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/service/AutoTradingManager.kt b/src/main/kotlin/service/AutoTradingManager.kt index cac36ba..d284c58 100644 --- a/src/main/kotlin/service/AutoTradingManager.kt +++ b/src/main/kotlin/service/AutoTradingManager.kt @@ -6,6 +6,7 @@ import Defines.BLACKLISTEDSTOCKCODES import Defines.EMBEDDING_PORT import Defines.LLM_PORT import TradingLogStore +import TradingLogStore.noticeFilter import analyzer.AdvancedTradeAssistant import analyzer.TechnicalAnalyzer import androidx.compose.runtime.getValue @@ -531,25 +532,21 @@ object AutoTradingManager { ) } } else { - if (KisSession.config.stop_Loss + if (KisSession.tradeConfig.autoSellOrder && holding != null && holding.quantity.toInt() > 0 && holding.availOrderCount.toInt() > 0 - && holding.profitRate.toDouble() <= KisSession.config.getValues(ConfigIndex.LOSS_MINRATE) - && holding.profitRate.toDouble() >= KisSession.config.getValues(ConfigIndex.LOSS_MAXRATE) - && holding.valuationProfitAmount.toDouble() >= KisSession.config.getValues(ConfigIndex.LOSS_MAX_MONEY)) { - println("${holding.name} ${holding.profitRate.toDouble()} ${holding.valuationProfitAmount.toDouble()} ${KisSession.config.getValues(ConfigIndex.LOSS_MAX_MONEY)} , ${KisSession.config.getValues(ConfigIndex.LOSS_MINRATE)} , ${KisSession.config.getValues(ConfigIndex.STOP_LOSS)}") - val profit = holding.profitRate.toDouble() - var targetPrice = if (KisSession.tradeConfig.autoSellOrder ) holding.avgPrice.toDouble() else holding.currentPrice.toDouble() + && holding.profitRate.toDouble() <= -15.0 + && holding.profitRate.toDouble() >= -29.0 + && holding.avgPrice.toDouble() > holding.currentPrice.toDouble()) { + var targetPrice = holding.avgPrice.toDouble() targetPrice = MarketUtil.roundToTickSize(targetPrice + MarketUtil.getTickSize(targetPrice) * 3.0) - - tradeService.postOrder( stockCode = holding.code, qty = holding.availOrderCount, price = targetPrice.toInt().toString(), isBuy = false, ).onSuccess { newOrderNo -> - println("✅ [보유 주식 손절 처리] 수익률($profit%) -> ${holding.valuationProfitAmount} 손해 중이며 현제 손절 가이드에 적합함 시장가 매도.") + println("✅ [보유 주식 손절 처리] 매수가 기준 (${holding.avgPrice.toDouble()} 3호가 위[${targetPrice}] 매도 주문") }.onFailure { err-> println("✅ [보유 주식 손절 처리] 실패 ${err.message}") } @@ -557,9 +554,37 @@ object AutoTradingManager { TradingLogStore.addNotice( "보유주식[${holding.name}]", holding.code, - "수익률($profit%) -> ${holding.valuationProfitAmount} 손해 중이며 현제 손절 가이드에 적합함 시장가 매도." + "매수가 기준 (${holding.avgPrice.toDouble()} 3호가 위[${targetPrice}] 매도 주문" ) - } + } else if (KisSession.config.stop_Loss + && holding != null && holding.quantity.toInt() > 0 + && holding.availOrderCount.toInt() > 0 + && holding.profitRate.toDouble() <= KisSession.config.getValues(ConfigIndex.LOSS_MINRATE) + && holding.profitRate.toDouble() >= KisSession.config.getValues(ConfigIndex.LOSS_MAXRATE) + && holding.valuationProfitAmount.toDouble() >= KisSession.config.getValues(ConfigIndex.LOSS_MAX_MONEY)) { + println("${holding.name} ${holding.profitRate.toDouble()} ${holding.valuationProfitAmount.toDouble()} ${KisSession.config.getValues(ConfigIndex.LOSS_MAX_MONEY)} , ${KisSession.config.getValues(ConfigIndex.LOSS_MINRATE)} , ${KisSession.config.getValues(ConfigIndex.STOP_LOSS)}") + val profit = holding.profitRate.toDouble() + var targetPrice = holding.currentPrice.toDouble() + targetPrice = MarketUtil.roundToTickSize(targetPrice + MarketUtil.getTickSize(targetPrice) * 3.0) + + + tradeService.postOrder( + stockCode = holding.code, + qty = holding.availOrderCount, + price = targetPrice.toInt().toString(), + isBuy = false, + ).onSuccess { newOrderNo -> + println("✅ [보유 주식 손절 처리] 수익률($profit%) -> ${holding.valuationProfitAmount} 손해 중이며 현제 손절 가이드에 적합함 시장가 매도.") + }.onFailure { err-> + println("✅ [보유 주식 손절 처리] 실패 ${err.message}") + } + + TradingLogStore.addNotice( + "보유주식[${holding.name}]", + holding.code, + "수익률($profit%) -> ${holding.valuationProfitAmount} 손해 중이며 현제 손절 가이드에 적합함 시장가 매도." + ) + } analyzeDeepLossHoldingsAfterMarket(holding , true) } delay(200) // API 호출 부하 방지 @@ -970,7 +995,10 @@ object AutoTradingManager { isExecuted = true } if (isExecuted) { executionCountMap[timeKey] = currentCount + 1 } - if (now.hour >= 20) { executionCountMap.clear() } + if (now.hour >= 20) { + executionCountMap.clear() + noticeFilter.clear() + } } diff --git a/stocks_universe.json b/stocks_universe.json index d2a095b..9253fe8 100644 --- a/stocks_universe.json +++ b/stocks_universe.json @@ -11378,5 +11378,21 @@ { "code": "408470", "name": "한패스" + }, + { + "code": "403810", + "name": "아이엘로보틱스" + }, + { + "code": "059180", + "name": "엔더블유시" + }, + { + "code": "950250", + "name": "테라뷰" + }, + { + "code": "288180", + "name": "케이피항공산업" } ] \ No newline at end of file