...
This commit is contained in:
parent
794b3fb5cb
commit
d512919d41
@ -78,10 +78,10 @@ object KisTradeService {
|
|||||||
/**
|
/**
|
||||||
* [1] 통합 잔고 조회 (국내 + 해외 합산)
|
* [1] 통합 잔고 조회 (국내 + 해외 합산)
|
||||||
*/
|
*/
|
||||||
suspend fun fetchIntegratedBalance(): Result<UnifiedBalance> = coroutineScope {
|
suspend fun fetchIntegratedBalance(marketCode : String = "N"): Result<UnifiedBalance> = coroutineScope {
|
||||||
val config = KisSession.config
|
val config = KisSession.config
|
||||||
// 국내와 해외 잔고를 비동기로 동시 호출
|
// 국내와 해외 잔고를 비동기로 동시 호출
|
||||||
val domesticJob = async { fetchDomesticRawBalance() }
|
val domesticJob = async { fetchDomesticRawBalance(marketCode) }
|
||||||
val overseasJob = async { fetchOverseasRawBalance() }
|
val overseasJob = async { fetchOverseasRawBalance() }
|
||||||
try {
|
try {
|
||||||
val domRes = domesticJob.await().getOrNull()
|
val domRes = domesticJob.await().getOrNull()
|
||||||
@ -322,7 +322,8 @@ object KisTradeService {
|
|||||||
qty: String,
|
qty: String,
|
||||||
price: String,
|
price: String,
|
||||||
isBuy: Boolean,
|
isBuy: Boolean,
|
||||||
orderDivision: String = ""
|
orderDivision: String = "",
|
||||||
|
marketCode : String = "KRX"
|
||||||
): Result<String> {
|
): Result<String> {
|
||||||
val config = KisSession.config
|
val config = KisSession.config
|
||||||
val isDomestic = stockCode.length == 6 && stockCode.all { it.isDigit() }
|
val isDomestic = stockCode.length == 6 && stockCode.all { it.isDigit() }
|
||||||
@ -341,8 +342,7 @@ object KisTradeService {
|
|||||||
else -> if (isBuy) "TTTS3002U" else "TTTS3001U"
|
else -> if (isBuy) "TTTS3002U" else "TTTS3001U"
|
||||||
}
|
}
|
||||||
val finalOrderDivision = when {
|
val finalOrderDivision = when {
|
||||||
orderDivision.isNotEmpty() -> orderDivision // 외부에서 넘겨준 코드 우선 (02, 03, 34 등)
|
marketCode.equals("SOR") || price == "0" || price.isEmpty() -> "01" // 시장가
|
||||||
price == "0" || price.isEmpty() -> "01" // 시장가
|
|
||||||
else -> "00" // 지정가
|
else -> "00" // 지정가
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -357,6 +357,7 @@ object KisTradeService {
|
|||||||
header("Content-Type", "application/json")
|
header("Content-Type", "application/json")
|
||||||
|
|
||||||
setBody(mapOf(
|
setBody(mapOf(
|
||||||
|
"EXCG_ID_DVSN_CD" to marketCode,
|
||||||
"CANO" to cano,
|
"CANO" to cano,
|
||||||
"ACNT_PRDT_CD" to acntPrdtCd,
|
"ACNT_PRDT_CD" to acntPrdtCd,
|
||||||
"PDNO" to stockCode,
|
"PDNO" to stockCode,
|
||||||
@ -539,7 +540,7 @@ object KisTradeService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// --- 내부 Raw 호출용 (통합 잔고에서 사용) ---
|
// --- 내부 Raw 호출용 (통합 잔고에서 사용) ---
|
||||||
private suspend fun fetchDomesticRawBalance(): Result<StockBalanceResponse> {
|
private suspend fun fetchDomesticRawBalance(markgetCode : String = "N"): Result<StockBalanceResponse> {
|
||||||
val config = KisSession.config
|
val config = KisSession.config
|
||||||
val baseUrl = prodUrl
|
val baseUrl = prodUrl
|
||||||
val trId = "TTTC8434R"
|
val trId = "TTTC8434R"
|
||||||
@ -571,7 +572,7 @@ object KisTradeService {
|
|||||||
|
|
||||||
parameter("CANO", cano)
|
parameter("CANO", cano)
|
||||||
parameter("ACNT_PRDT_CD", acntPrdtCd)
|
parameter("ACNT_PRDT_CD", acntPrdtCd)
|
||||||
parameter("AFHR_FLPR_YN", "N")
|
parameter("AFHR_FLPR_YN", markgetCode)
|
||||||
parameter("OFL_YN", "N")
|
parameter("OFL_YN", "N")
|
||||||
parameter("INQR_DVSN", "0")
|
parameter("INQR_DVSN", "0")
|
||||||
parameter("UNPR_DVSN", "01")
|
parameter("UNPR_DVSN", "01")
|
||||||
|
|||||||
@ -365,7 +365,7 @@ object AutoTradingManager {
|
|||||||
runDiscoveryLoop(globalCallback)
|
runDiscoveryLoop(globalCallback)
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun sellingAfterMarketOnePrice(tradeService: KisTradeService,balance : UnifiedBalance) {
|
suspend fun sellingAfterMarketOnePrice(tradeService: KisTradeService,balance : UnifiedBalance,marketCode : String = "Y") {
|
||||||
println("sellingAfterMarketOnePrice")
|
println("sellingAfterMarketOnePrice")
|
||||||
balance.holdings.forEach { holding ->
|
balance.holdings.forEach { holding ->
|
||||||
if (BLACKLISTEDSTOCKCODES.contains(holding.code)){
|
if (BLACKLISTEDSTOCKCODES.contains(holding.code)){
|
||||||
@ -377,7 +377,7 @@ object AutoTradingManager {
|
|||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
println("${holding.name} - 매수 : ${holding.avgPrice} - 현재 : ${holding.currentPrice} , 주문 가능 : ${holding.availOrderCount}, 수익율 : ${holding.profitRate}")
|
println("${holding.name} - 매수 : ${holding.avgPrice} - 현재 : ${holding.currentPrice} , 주문 가능 : ${holding.availOrderCount}, 수익율 : ${holding.profitRate}")
|
||||||
if (holding != null && holding.quantity.toInt() > 0 && holding.availOrderCount.toInt() > 0 && holding.profitRate.toDouble() > 0.5) {
|
if (holding != null && holding.quantity.toInt() > 0 && holding.availOrderCount.toInt() > 0 && holding.profitRate.toDouble() > KisSession.config.SELL_PROFIT) {
|
||||||
println("${holding.name} - 매수 : ${holding.avgPrice} - 현재 : ${holding.currentPrice} ")
|
println("${holding.name} - 매수 : ${holding.avgPrice} - 현재 : ${holding.currentPrice} ")
|
||||||
var targetPrice = holding.currentPrice.toDouble()
|
var targetPrice = holding.currentPrice.toDouble()
|
||||||
targetPrice = MarketUtil.roundToTickSize(targetPrice)
|
targetPrice = MarketUtil.roundToTickSize(targetPrice)
|
||||||
@ -386,7 +386,8 @@ object AutoTradingManager {
|
|||||||
qty = holding.availOrderCount,
|
qty = holding.availOrderCount,
|
||||||
price = targetPrice.toInt().toString(),
|
price = targetPrice.toInt().toString(),
|
||||||
isBuy = false,
|
isBuy = false,
|
||||||
"34"
|
orderDivision = if (marketCode.equals("Y")) "07" else "",
|
||||||
|
marketCode = if (marketCode.equals("Y")) "KRX" else "SOR"
|
||||||
).onSuccess { newOrderNo ->
|
).onSuccess { newOrderNo ->
|
||||||
println("✅ [재주문 완료] ${holding.name}: $newOrderNo")
|
println("✅ [재주문 완료] ${holding.name}: $newOrderNo")
|
||||||
TradingLogStore.addSellLog(
|
TradingLogStore.addSellLog(
|
||||||
@ -612,13 +613,20 @@ object AutoTradingManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
suspend fun checkBalance(isMorning: Boolean = true) : UnifiedBalance? {
|
suspend fun checkBalance(isMorning: Boolean = true) : UnifiedBalance? {
|
||||||
val balance = KisTradeService.fetchIntegratedBalance().getOrNull()
|
var balance : UnifiedBalance? = null
|
||||||
if (isMorning) {
|
if (isMorning) {
|
||||||
|
balance = KisTradeService.fetchIntegratedBalance().getOrNull()
|
||||||
if (AUTOSELL) balance?.let { resumePendingSellOrders(KisTradeService, it) }
|
if (AUTOSELL) balance?.let { resumePendingSellOrders(KisTradeService, it) }
|
||||||
|
return balance
|
||||||
} else {
|
} else {
|
||||||
balance?.let { sellingAfterMarketOnePrice(KisTradeService, it) }
|
// listOf<String>("Y","X").forEach { code ->
|
||||||
|
// KisTradeService.fetchIntegratedBalance(code).getOrNull()?.let {
|
||||||
|
// sellingAfterMarketOnePrice(KisTradeService, it, code)
|
||||||
|
// }
|
||||||
|
// delay(1000)
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
return balance
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun executeMarketLoop() {
|
suspend fun executeMarketLoop() {
|
||||||
@ -702,7 +710,7 @@ object AutoTradingManager {
|
|||||||
lastForceCheckMinute = currentMinute // 실행 완료 기록
|
lastForceCheckMinute = currentMinute // 실행 완료 기록
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if((now.hour == 16 || now.hour == 17) && (currentMinute == 5 || currentMinute == 55)) {
|
else if((now.hour == 16 || now.hour == 17) && (currentMinute == 31 || currentMinute == 36)) {
|
||||||
if (lastForceCheckMinute != currentMinute) {
|
if (lastForceCheckMinute != currentMinute) {
|
||||||
TradingLogStore.addAnalyzer(
|
TradingLogStore.addAnalyzer(
|
||||||
" - ",
|
" - ",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user