This commit is contained in:
lunaticbum 2026-06-02 17:10:06 +09:00
parent d26eb34f1d
commit 21242d5ca4

View File

@ -128,7 +128,8 @@ object AutoTradingManager {
decision = decision,
orderQty = calculatedQty.toString(),
profitRate1 = KisSession.config.getValues(ConfigIndex.PROFIT_INDEX) * KisSession.config.getValues(grade.profitGuide),
investmentGrade = grade
investmentGrade = grade,
hasCode = hasCodes == true
)
} else if (decision.decision.equals("RETRY") || decision.confidence >= 60.0) { // 아까운 종목만 재분석
addToReanalysis(RankingStock(decision.stockCode, decision.stockName))
@ -207,7 +208,7 @@ object AutoTradingManager {
}
}
fun excuteTrade(decision: TradingDecision, orderQty: String, profitRate1: Double?, investmentGrade: InvestmentGrade = InvestmentGrade.LEVEL_2_HIGH_RISK) {
fun excuteTrade(decision: TradingDecision, orderQty: String, profitRate1: Double?, investmentGrade: InvestmentGrade = InvestmentGrade.LEVEL_2_HIGH_RISK, hasCode: Boolean) {
scope.launch {
var basePrice = decision.currentPrice
val tickSize = MarketUtil.getTickSize(basePrice)
@ -218,9 +219,8 @@ object AutoTradingManager {
val maxStocks = KisSession.config.getValues(ConfigIndex.MAX_HOLDING_COUNT).toInt()
if (!canAddNewPosition(maxStocks)) {
TradingLogStore.addNotice("SYSTEM", "LIMIT", "최대 보유 종목 도달로 신규 매수 일시 중단")
AutoTradingManager.addToReanalysis(RankingStock(mksc_shrn_iscd = stockCode,hts_kor_isnm = stockName))
addToReanalysis(RankingStock(mksc_shrn_iscd = stockCode,hts_kor_isnm = stockName))
TradingLogStore.addWatchLog(decision,"WATCH","매수 실패 : 최대 보유 종목 도달로 신규 매수 일시 중단 => 재분석 대기열에 추가")
} else if (KisSession.isAvailBuyTime(LocalTime.now())){
println("basePrice : $basePrice, oneTickLowerPrice : $oneTickLowerPrice, finalPrice : $finalPrice hasStocks : ${stockCode.contains(stockCode)}" )
@ -238,6 +238,13 @@ object AutoTradingManager {
var tax = KisSession.config.getValues(ConfigIndex.TAX_INDEX)
val effectiveProfitRate =
(profitRate1 ?: KisSession.config.getValues(ConfigIndex.PROFIT_INDEX)) + tax
var oldTarget = currentBalance?.getHoldings()?.filter { it.code.equals(decision.stockCode) }?.first()
if (hasCode && oldTarget != null) {
var avgPrive = oldTarget.avgPrice.toDouble()
var qty = oldTarget.quantity.toDouble()
basePrice = ((avgPrive * qty) + decision.currentPrice).div(qty!!.toInt() + 1)
println("물타기 ${avgPrive}, ${qty} ${basePrice}")
}
val calculatedTarget =
MarketUtil.roundToTickSize(basePrice * (1 + effectiveProfitRate / 100.0))
@ -822,7 +829,7 @@ object AutoTradingManager {
}
}
var loadedTops = mutableListOf<Pair<String, String>>()
var defaultStockCount = 100
var defaultStockCount = 30
fun poll100Stocks(): List<Pair<String, String>> {
loadedTops.shuffle()
val count = minOf(loadedTops.size, defaultStockCount)
@ -915,7 +922,7 @@ object AutoTradingManager {
val myCash = currentBalance?.deposit?.replace(",", "")?.toLongOrNull() ?: KisSession.config.getValues(ConfigIndex.MAX_PRICE_INDEX).toLong()
val myHoldings = currentBalance?.getHoldings()?.filter { !it.isTodayEntry }?.map { it.code }?.toSet() ?: emptySet()
val pendingStocks = DatabaseFactory.findAllMonitoringTrades().map { it.code }
var now = LocalTime.now(ZoneId.of("Asia/Seoul"))
if (remainingCandidates.isEmpty()) {
if (loadedTops.size < defaultStockCount) {
loadedTops.addAll(StockUniverseLoader.loadUniverse())
@ -944,10 +951,10 @@ object AutoTradingManager {
if (reanalysisList.isNotEmpty()) {
candidates.addAll(reanalysisList)
}
candidates.clear()///물타기
reanalysisList.clear()
if (KisSession.tradeConfig.lowerAveragePrice) {
currentBalance?.getHoldings()?.map {
// println("물타기 기준 체크${ it.profitRate.toDouble()},${(KisSession.tradeConfig.lowerAverageMaxRate * -1)}, ${(KisSession.tradeConfig.lowerAverageMinRate * -1)}")
if(
it.quantity.toInt() > KisSession.tradeConfig.lowerAverageTargetCount &&
it.profitRate.toDouble() < (KisSession.tradeConfig.lowerAverageMaxRate * -1) &&
@ -955,6 +962,14 @@ object AutoTradingManager {
{
candidates.add(RankingStock(mksc_shrn_iscd = it.code, hts_kor_isnm = it.name))
println("물타기 대상 추가 ${it.name}[${it.code}]")
var oldTarget = it
if ( oldTarget != null) {
var avgPrive = oldTarget.avgPrice.toDouble()
var qty = oldTarget.quantity.toDouble()
var basePrice = ((avgPrive * qty) + it.currentPrice.toDouble()).div(qty!!.toInt() + 1)
println("물타기 ${avgPrive}, ${qty} ${basePrice}")
}
}
}
}