This commit is contained in:
2026-02-19 16:20:15 +09:00
parent 59c8ff4ebb
commit 535989b8ae
3 changed files with 100 additions and 83 deletions
+32 -28
View File
@@ -19,6 +19,7 @@ import model.ConfigIndex
import model.KisSession
import model.RankingStock
import model.RankingType
import model.UnifiedBalance
import network.DartCodeManager
import network.FinancialMapper
import network.FinancialStatement
@@ -78,13 +79,14 @@ object AutoTradingManager {
}
suspend fun resumePendingSellOrders(tradeService: KisTradeService) {
suspend fun resumePendingSellOrders(tradeService: KisTradeService,balance : UnifiedBalance) {
// 1. DB에서 매도 중(SELLING)이거나 만료(EXPIRED)된 매도 건을 가져옵니다.
println("resumePendingSellOrders")
val pendingSells = DatabaseFactory.getAutoTradesByStatus(listOf(TradeStatus.SELLING, TradeStatus.EXPIRED))
println("pendingSells >>> ${pendingSells.size}")
pendingSells.forEach { item ->
// 2. 실제로 잔고에 해당 종목이 있는지 확인 (안전장치)
val balance = tradeService.fetchIntegratedBalance().getOrNull()
// val balance = tradeService.fetchIntegratedBalance().getOrNull()
val holding = balance?.holdings?.find { it.code == item.code }
if (holding != null && holding.quantity.toInt() > 0) {
@@ -123,14 +125,16 @@ object AutoTradingManager {
println("⏱️ [Cycle Start] ${LocalTime.now()}")
// [프로세스 1] 장 마감 및 잔고 체크
val now = LocalTime.now(ZoneId.of("Asia/Seoul"))
//&& now.isBefore(LocalTime.of(15, 30))
if (now.isAfter(LocalTime.of(15, 30)) ) {
// executeClosingLiquidation(tradeService)
return@withTimeout
}
// val now = LocalTime.now(ZoneId.of("Asia/Seoul"))
// //&& now.isBefore(LocalTime.of(15, 30))
// if (now.isAfter(LocalTime.of(15, 30)) ) {
//// executeClosingLiquidation(tradeService)
// return@withTimeout
// }
val balance = tradeService.fetchIntegratedBalance().getOrNull()
balance?.let { resumePendingSellOrders(tradeService,it) }
val myCash = balance?.deposit?.replace(",", "")?.toLongOrNull() ?: 0L
val myHoldings = balance?.holdings?.filter { it.quantity.toInt() > 0 }?.map { it.code }?.toSet() ?: emptySet()
val pendingStocks = DatabaseFactory.findAllMonitoringTrades().map { it.code }
@@ -295,25 +299,25 @@ object AutoTradingManager {
private suspend fun executeClosingLiquidation(tradeService: KisTradeService) {
val activeTrades = DatabaseFactory.findAllMonitoringTrades()
val balanceResult = tradeService.fetchIntegratedBalance().getOrNull()
val realHoldings = balanceResult?.holdings?.associateBy { it.code } ?: emptyMap()
activeTrades.forEach { trade ->
try {
if (!realHoldings.containsKey(trade.code)) {
DatabaseFactory.updateStatusAndOrderNo(trade.id!!, TradeStatus.COMPLETED)
return@forEach
}
// 마감 정리 로직 (필요 시 주석 해제하여 사용)
println("📢 [마감 정리 체크] ${trade.name}")
} catch (e: Exception) {
println("⚠️ [마감 에러] ${trade.name}: ${e.message}")
}
delay(200)
}
}
// private suspend fun executeClosingLiquidation(tradeService: KisTradeService) {
// val activeTrades = DatabaseFactory.findAllMonitoringTrades()
// val balanceResult = tradeService.fetchIntegratedBalance().getOrNull()
// val realHoldings = balanceResult?.holdings?.associateBy { it.code } ?: emptyMap()
//
// activeTrades.forEach { trade ->
// try {
// if (!realHoldings.containsKey(trade.code)) {
// DatabaseFactory.updateStatusAndOrderNo(trade.id!!, TradeStatus.COMPLETED)
// return@forEach
// }
// // 마감 정리 로직 (필요 시 주석 해제하여 사용)
// println("📢 [마감 정리 체크] ${trade.name}")
// } catch (e: Exception) {
// println("⚠️ [마감 에러] ${trade.name}: ${e.message}")
// }
// delay(200)
// }
// }
fun stopDiscovery() {
discoveryJob?.cancel()