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