This commit is contained in:
2026-01-20 15:13:50 +09:00
parent 91f9e4ee9a
commit 5c088414c5
4 changed files with 55 additions and 13 deletions
+20 -5
View File
@@ -33,17 +33,32 @@ fun AutoTradeSection(
var tradeList by remember { mutableStateOf(emptyList<AutoTradeItem>()) }
// refreshTrigger가 바뀔 때마다 실행됨
LaunchedEffect(refreshTrigger) {
// 1. 서버에서 실제 미체결 내역 가져오기
val serverUnfilled = tradeService.fetchUnfilledOrders().getOrNull()?.map { it.toAutoTradeItem(isDomestic) } ?: emptyList()
// 2. DB에서 로컬 감시 데이터 가져오기
val localTrades = DatabaseFactory.getActiveAutoTrades()
// 3. 동기화 로직: 서버에 없는 주문번호를 가진 로컬 데이터는 EXPIRED로 표시
tradeList = localTrades.map { local ->
if (local.status != "COMPLETED" && serverUnfilled.none { it.orderNo == local.orderNo }) {
local.copy(status = "EXPIRED")
} else local
// 3. 리스트 병합 및 동기화
val mergedList = mutableListOf<AutoTradeItem>()
// (A) DB에 있는 항목 처리
localTrades.forEach { local ->
val serverMatch = serverUnfilled.find { it.orderNo == local.orderNo }
if (local.status != "COMPLETED" && serverMatch == null) {
// 서버에 없으면 만료 처리
mergedList.add(local.copy(status = "EXPIRED"))
} else {
// 서버에 있으면 그대로 표시 (필요시 잔량 등 업데이트)
mergedList.add(local.copy(remainedQuantity = serverMatch?.remainedQuantity ?: 0))
}
}
// (B) 서버에는 있지만 DB에는 없는 항목(수동 주문 등) 추가
val manualOrders = serverUnfilled.filter { server -> localTrades.none { it.orderNo == server.orderNo } }
mergedList.addAll(manualOrders.map { it.copy(status = "MANUAL_ORDER") }) // 수동 주문 상태 등으로 표시
tradeList = mergedList
}
Column(modifier = Modifier.fillMaxSize().padding(8.dp)) {
+19 -3
View File
@@ -61,9 +61,25 @@ fun DashboardScreen() {
if (dbItem != null) {
when (dbItem.status) {
TradeStatus.PENDING_BUY -> {
// 매수 주문 체결 -> 감시(MONITORING)로 전환 및 익절 주문 발주
// 여기서 익절 주문 후 받은 신규 주문번호를 DB에 갱신
// updateStatusAndOrderNo(dbItem.id!!, TradeStatus.MONITORING, newSellOrderNo)
// 1. 매수 주문 체결 확인됨 -> 즉시 익절 매도 주문 발주
println("✅ 매수 체결 확인 [${dbItem.name}]: 익절가 ${dbItem.targetPrice}로 매도 주문을 생성합니다.")
tradeService.postOrder(
stockCode = dbItem.code,
qty = dbItem.quantity.toString(),
price = dbItem.targetPrice.toLong().toString(), // 가격은 정수형 문자열로 전달
isBuy = false
).onSuccess { newSellOrderNo ->
// 2. 매도 주문 성공 시 DB 상태를 SELLING으로 변경하고 새로운 주문번호로 갱신
DatabaseFactory.updateStatusAndOrderNo(
id = dbItem.id!!,
newStatus = TradeStatus.SELLING,
newOrderNo = newSellOrderNo
)
println("🚀 익절 매도 주문 완료: 주문번호 $newSellOrderNo")
refreshTrigger++ // UI 갱신
}.onFailure {
println("❌ 매수 체결 후 익절 주문 발주 실패: ${it.message}")
}
}
TradeStatus.SELLING -> {
// 매도(손절/익절) 주문 체결 -> COMPLETED