package com.goldenchart.dto;
import lombok.*;
import java.util.List;
/**
* 백테스팅 결과 응답 DTO.
*
*
* {
* "signals": [
* { "time": 1700000000, "type": "BUY", "price": 42000 },
* { "time": 1700200000, "type": "SELL", "price": 45000 }
* ],
* "stats": { "totalTrades": 8, "winRate": 0.625, ... }
* }
*
*/
@Data @Builder @NoArgsConstructor @AllArgsConstructor
public class BacktestResponse {
private List signals;
private Stats stats;
/** Ta4j AnalysisCriterion 전체 결과 */
private BacktestAnalysisDto analysis;
/** DB 저장 후 부여된 결과 ID */
private Long resultId;
@Data @Builder @NoArgsConstructor @AllArgsConstructor
public static class Signal {
/** Unix timestamp (초) */
private long time;
/** BUY | SELL */
private String type;
/** 해당 봉 종가 */
private double price;
/** 진입/청산 인덱스 (0-based) */
private int barIndex;
}
@Data @Builder @NoArgsConstructor @AllArgsConstructor
public static class Stats {
private int totalSignals;
private int buySignals;
private int sellSignals;
/** 거래 쌍(매수→매도) 수 */
private int totalTrades;
/** 수익 거래 수 */
private int winTrades;
/** 승률 0~1 */
private double winRate;
/** 총 수익률 (소수, e.g. 0.15 = +15%) */
private double totalReturn;
/** 최대 낙폭 (소수, 음수, e.g. -0.12 = -12%) */
private double maxDrawdown;
/** 평균 수익률 per trade */
private double avgReturn;
/** 최종 자산 (초기 자본 × 복리 수익) */
private double finalEquity;
}
}