diff --git a/src/main/kotlin/model/AppConfig.kt b/src/main/kotlin/model/AppConfig.kt index 874bff7..568da25 100644 --- a/src/main/kotlin/model/AppConfig.kt +++ b/src/main/kotlin/model/AppConfig.kt @@ -258,6 +258,9 @@ class TradeConfig { var noticeGapTime : Int = 60 var lowerAveragePrice : Boolean = false var lowerAverageStockCount : Int = 1 + var lowerAverageMaxRate : Double = 1.0 + var lowerAverageMinRate : Double = 40.0 + var lowerAverageTargetCount : Int = 2 } diff --git a/src/main/kotlin/service/AutoTradingManager.kt b/src/main/kotlin/service/AutoTradingManager.kt index 474171d..5958771 100644 --- a/src/main/kotlin/service/AutoTradingManager.kt +++ b/src/main/kotlin/service/AutoTradingManager.kt @@ -121,7 +121,7 @@ object AutoTradingManager { val maxBudget = KisSession.config.getValues(ConfigIndex.MAX_BUDGET_INDEX) * gradeRate TradingLogStore.addLog(decision,"BUY",decision.summary()) - var hasCodes = currentBalance?.getHoldings()?.any { it.code.equals(decision.stockCode) && it.quantity.toInt() > 2 && it.isTodayEntry == false} + var hasCodes = currentBalance?.getHoldings()?.any { it.code.equals(decision.stockCode) && it.quantity.toInt() > 2 && !it.isTodayEntry} if (hasCodes == true) { buysCodes.add(decision.stockCode) TradingLogStore.addNotice(decision.stockName,decision.stockCode,"물타기 시도 1주 매수") @@ -380,7 +380,7 @@ object AutoTradingManager { println("🎊 [매칭 성공] 매도 완료: ${dbItem.name} | 매도가: ${actualSellPrice.toInt()}") TradingLogStore.addSellLog(dbItem.name,actualSellPrice.toString(),"SELL","매도 완료") - myOredsAndBalanceCodes.remove(dbItem.code) + TradingReportManager.closePositionCycle(dbItem.code) // 사이클 종료 알림 DatabaseFactory.updateStatusAndOrderNo(dbItem.id!!, TradeStatus.COMPLETED) @@ -834,7 +834,7 @@ object AutoTradingManager { return batch } var currentBalance : UnifiedBalance? = null - var myOredsAndBalanceCodes : MutableSet = mutableSetOf() + suspend fun checkBalance(isMorning: Boolean = true) { if (isMorning) { currentBalance = KisTradeService.fetchIntegratedBalance().getOrNull() @@ -906,16 +906,10 @@ object AutoTradingManager { suspend fun executeMarketLoop() { - myOredsAndBalanceCodes.clear() checkBalance() val myCash = currentBalance?.deposit?.replace(",", "")?.toLongOrNull() ?: 0L - val myHoldings = currentBalance?.getHoldings()?.map { - myOredsAndBalanceCodes.add(it.code) - it.code }?.toSet() ?: emptySet() - val pendingStocks = DatabaseFactory.findAllMonitoringTrades().map { - myOredsAndBalanceCodes.add(it.code) - it.code - } + val myHoldings = currentBalance?.getHoldings()?.filter { !it.isTodayEntry }?.map { it.code }?.toSet() ?: emptySet() + val pendingStocks = DatabaseFactory.findAllMonitoringTrades().map { it.code } if (remainingCandidates.isEmpty()) { if (loadedTops.size < 200) { @@ -948,7 +942,7 @@ object AutoTradingManager { reanalysisList.clear() if (KisSession.tradeConfig.lowerAveragePrice) { currentBalance?.getHoldings()?.map { - if(!it.isTodayEntry && it.quantity.toInt() > 2) { + if(!it.isTodayEntry && it.quantity.toInt() > KisSession.tradeConfig.lowerAverageTargetCount && it.profitRate.toDouble() < (KisSession.tradeConfig.lowerAverageMaxRate * -1) && it.profitRate.toDouble() > (KisSession.tradeConfig.lowerAverageMinRate * -1) ) { remainingCandidates.add(RankingStock(mksc_shrn_iscd = it.code, hts_kor_isnm = it.name)) } }