From 7e402cfca2878ff8398d45f43596d88e661c73f8 Mon Sep 17 00:00:00 2001 From: bbbang105 <2018111366@dgu.ac.kr> Date: Fri, 31 May 2024 22:41:57 +0900 Subject: [PATCH] =?UTF-8?q?#16=20[fix]=20:=20=EC=88=98=EC=9D=B5=EB=A5=A0?= =?UTF-8?q?=20=EA=B3=84=EC=82=B0=20=EC=97=90=EB=9F=AC=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/BackTestingCalculator.java | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/backend/src/main/java/org/dgu/backend/service/BackTestingCalculator.java b/backend/src/main/java/org/dgu/backend/service/BackTestingCalculator.java index 73ff36c..1aafea2 100644 --- a/backend/src/main/java/org/dgu/backend/service/BackTestingCalculator.java +++ b/backend/src/main/java/org/dgu/backend/service/BackTestingCalculator.java @@ -108,7 +108,7 @@ public List run(List candles, Back } // 거래를 실행하는 메서드 - private void executeTrade(List candles, int startIndex, int tradingUnit, List backTestingResults) { + private void executeTrade(List candles, int startIndex, int tradingCnt, List backTestingResults) { // 초기 세팅 coin = 0.0; executeBuy(candles.get(startIndex).getDateTime(), candles.get(startIndex).getTradePrice(), backTestingResults); @@ -126,20 +126,22 @@ private void executeTrade(List candles, int startIndex, int tradingU startDate = currentDate; } + Long initialCapital = capital + tradingUnit * (buyingCnt); + Double curRate = calculateRate(capital, initialCapital, currentPrice, coin); // 매수 처리 - if (buyingCnt < tradingUnit && currentPrice < avgPrice * (100 - buyingPoint) / 100) { + if (buyingCnt < tradingCnt && currentPrice < avgPrice * (100 - buyingPoint) / 100) { executeBuy(currentDate, currentPrice, backTestingResults); buyingCnt++; tradePrices.add(currentPrice); avgPrice = tradePrices.stream().mapToDouble(Double::doubleValue).sum() / buyingCnt; } // 전체 자본 대비 수익률을 기준으로 한 익절 처리 - else if (((currentPrice * coin + capital) - (tradingUnit * buyingCnt)) / (tradingUnit * buyingCnt) * 100 > sellingPoint) { + else if (curRate > sellingPoint) { executeSell(currentDate, currentPrice, backTestingResults); break; } // 전체 자본 대비 수익률을 기준으로 한 손절 처리 - else if (((currentPrice * coin + capital) - (tradingUnit * buyingCnt)) / (tradingUnit * buyingCnt) * 100 < -stopLossPoint) { + else if (curRate < -stopLossPoint) { executeStopLoss(currentDate, currentPrice, backTestingResults); break; } @@ -156,22 +158,22 @@ private void executeBuy(LocalDateTime currentDate, Double currentPrice, List backTestingResults) { - Long orgCapital = capital + tradingUnit * buyingCnt; + Long initialCapital = capital + tradingUnit * buyingCnt; capital += (long) (currentPrice * coin); coin = 0.0; - Long income = capital - orgCapital; - Double rate = ((double) income / orgCapital) * 100; + Long income = capital - initialCapital; + Double rate = ((double) income / initialCapital) * 100; backTestingResults.add(BackTestingDto.BackTestingResult.of(currentDate, "SELL", currentPrice, coin, capital, rate, income, currentDate.compareTo(startDate))); } // 손절 처리 메서드 private void executeStopLoss(LocalDateTime currentDate, Double currentPrice, List backTestingResults) { - Long orgCapital = capital + tradingUnit * buyingCnt; + Long initialCapital = capital + tradingUnit * buyingCnt; capital += (long) (currentPrice * coin); coin = 0.0; - Long income = capital - orgCapital; - Double rate = ((double) income / orgCapital) * 100; + Long income = capital - initialCapital; + Double rate = ((double) income / initialCapital) * 100; backTestingResults.add(BackTestingDto.BackTestingResult.of(currentDate, "STOP_LOSS", currentPrice, coin, capital, rate, income, currentDate.compareTo(startDate))); } @@ -288,4 +290,11 @@ private BackTestingDto.TradingLog createTradingLog(BackTestingDto.BackTestingRes return BackTestingDto.TradingLog.of(backTestingResult); } + + // 수익률을 계산하는 메서드 + private Double calculateRate(Long capital, Long initialCapital, Double currentPrice, Double coin) { + Double currentAssetValue = capital + (currentPrice * coin); + + return ((currentAssetValue - initialCapital) / initialCapital) * 100; + } } \ No newline at end of file