From 280c187021617360db97701e6c04494d41131580 Mon Sep 17 00:00:00 2001 From: Macbook Date: Thu, 11 Jun 2026 21:34:57 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=B0=B1=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=8B=9C=EA=B7=B8=EB=84=90=20=ED=83=80=EC=9E=84=EC=8A=A4?= =?UTF-8?q?=ED=83=AC=ED=94=84=EB=A5=BC=20=EB=B4=89=20=EC=8B=9C=EC=9E=91=20?= =?UTF-8?q?=EC=8B=9C=EA=B0=81=EC=9C=BC=EB=A1=9C=20=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 시그널 time을 ta4j Bar.endTime(봉 종료)으로 저장하면 차트 캔들 time(봉 시작)과 1봉 어긋나 마커가 다음 캔들에 표시됨. IndicatorService·실시간 평가와 동일하게 barStartEpoch를 사용한다. Co-authored-by: Cursor --- .../java/com/goldenchart/service/BacktestingService.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/com/goldenchart/service/BacktestingService.java b/backend/src/main/java/com/goldenchart/service/BacktestingService.java index 4dc714c..919b9aa 100644 --- a/backend/src/main/java/com/goldenchart/service/BacktestingService.java +++ b/backend/src/main/java/com/goldenchart/service/BacktestingService.java @@ -181,7 +181,7 @@ public class BacktestingService { for (int i = 0; i < barCount; i++) { double closePrice = getPrice(series, req.getBars(), i, cfg.getEntryPriceType()); double exitPrice = getPrice(series, req.getBars(), i, cfg.getExitPriceType()); - long time = series.getBar(i).getEndTime().getEpochSecond(); + long time = barStartEpoch(series, i); // ── SIGNAL_ONLY 모드: 포지션·자금 상태 무관, 조건 충족 시마다 전체 시그널 생성 ── if (signalOnly) { @@ -458,6 +458,12 @@ public class BacktestingService { .build(); } + /** 차트·캔들 API 와 동일 — 봉 시작 시각(epoch sec). ta4j Bar.endTime 은 종료 시각. */ + private static long barStartEpoch(BarSeries series, int index) { + var bar = series.getBar(index); + return bar.getEndTime().getEpochSecond() - bar.getTimePeriod().getSeconds(); + } + // ── 개별 Criterion 계산 헬퍼 ───────────────────────────────────────────── private double enterPosition(PortfolioLedger ledger, boolean useLedger,