134 lines
6.3 KiB
Java
134 lines
6.3 KiB
Java
package com.goldenchart.entity;
|
|
|
|
import jakarta.persistence.*;
|
|
import lombok.*;
|
|
|
|
import java.math.BigDecimal;
|
|
import java.time.LocalDateTime;
|
|
|
|
/**
|
|
* 백테스팅 설정 엔티티.
|
|
* Ta4j 의 비용 모델·손절/익절/트레일링 스탑·진입가격·재진입 규칙 등을 저장.
|
|
*/
|
|
@Entity
|
|
@Table(name = "gc_backtest_settings")
|
|
@Getter @Setter @NoArgsConstructor @AllArgsConstructor @Builder
|
|
public class GcBacktestSettings {
|
|
|
|
@Id
|
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
private Long id;
|
|
|
|
@Column(name = "device_id", length = 100)
|
|
private String deviceId;
|
|
|
|
// ── 자본 설정 ──────────────────────────────────────────────────────────────
|
|
@Column(name = "initial_capital", nullable = false, precision = 20, scale = 2)
|
|
@Builder.Default
|
|
private BigDecimal initialCapital = new BigDecimal("10000000.00");
|
|
|
|
// ── 비용 모델 ──────────────────────────────────────────────────────────────
|
|
/** LINEAR | ZERO */
|
|
@Column(name = "commission_type", nullable = false, length = 20)
|
|
@Builder.Default
|
|
private String commissionType = "LINEAR";
|
|
|
|
@Column(name = "commission_rate", nullable = false, precision = 8, scale = 5)
|
|
@Builder.Default
|
|
private BigDecimal commissionRate = new BigDecimal("0.00150");
|
|
|
|
@Column(name = "slippage_rate", nullable = false, precision = 8, scale = 5)
|
|
@Builder.Default
|
|
private BigDecimal slippageRate = new BigDecimal("0.00050");
|
|
|
|
// ── 진입/청산 가격 ─────────────────────────────────────────────────────────
|
|
/** CLOSE | NEXT_OPEN */
|
|
@Column(name = "entry_price_type", nullable = false, length = 20)
|
|
@Builder.Default
|
|
private String entryPriceType = "CLOSE";
|
|
|
|
/** CLOSE | NEXT_OPEN */
|
|
@Column(name = "exit_price_type", nullable = false, length = 20)
|
|
@Builder.Default
|
|
private String exitPriceType = "CLOSE";
|
|
|
|
// ── 포지션 방향 ────────────────────────────────────────────────────────────
|
|
/** LONG | SHORT | BOTH */
|
|
@Column(name = "position_direction", nullable = false, length = 10)
|
|
@Builder.Default
|
|
private String positionDirection = "LONG";
|
|
|
|
// ── 거래 규모 ──────────────────────────────────────────────────────────────
|
|
/** CAPITAL_PCT | FIXED_AMOUNT */
|
|
@Column(name = "trade_size_type", nullable = false, length = 20)
|
|
@Builder.Default
|
|
private String tradeSizeType = "CAPITAL_PCT";
|
|
|
|
@Column(name = "trade_size_value", nullable = false, precision = 10, scale = 4)
|
|
@Builder.Default
|
|
private BigDecimal tradeSizeValue = new BigDecimal("100.0000");
|
|
|
|
// ── 손절 ───────────────────────────────────────────────────────────────────
|
|
@Column(name = "stop_loss_enabled", nullable = false)
|
|
@Builder.Default
|
|
private Boolean stopLossEnabled = false;
|
|
|
|
@Column(name = "stop_loss_pct", nullable = false, precision = 6, scale = 3)
|
|
@Builder.Default
|
|
private BigDecimal stopLossPct = new BigDecimal("2.000");
|
|
|
|
// ── 익절 ───────────────────────────────────────────────────────────────────
|
|
@Column(name = "take_profit_enabled", nullable = false)
|
|
@Builder.Default
|
|
private Boolean takeProfitEnabled = false;
|
|
|
|
@Column(name = "take_profit_pct", nullable = false, precision = 6, scale = 3)
|
|
@Builder.Default
|
|
private BigDecimal takeProfitPct = new BigDecimal("5.000");
|
|
|
|
// ── 트레일링 스탑 ──────────────────────────────────────────────────────────
|
|
@Column(name = "trailing_stop_enabled", nullable = false)
|
|
@Builder.Default
|
|
private Boolean trailingStopEnabled = false;
|
|
|
|
@Column(name = "trailing_stop_pct", nullable = false, precision = 6, scale = 3)
|
|
@Builder.Default
|
|
private BigDecimal trailingStopPct = new BigDecimal("2.000");
|
|
|
|
// ── 재진입 제어 ────────────────────────────────────────────────────────────
|
|
@Column(name = "reentry_wait_bars", nullable = false)
|
|
@Builder.Default
|
|
private Integer reentryWaitBars = 0;
|
|
|
|
@Column(name = "max_open_trades", nullable = false)
|
|
@Builder.Default
|
|
private Integer maxOpenTrades = 1;
|
|
|
|
// ── 포지션 종속성 모드 ─────────────────────────────────────────────────────
|
|
/** LONG_ONLY | SIGNAL_ONLY */
|
|
@Column(name = "position_mode", nullable = false, length = 20)
|
|
@Builder.Default
|
|
private String positionMode = "LONG_ONLY";
|
|
|
|
// ── 분할 청산 ──────────────────────────────────────────────────────────────
|
|
@Column(name = "partial_exit_enabled", nullable = false)
|
|
@Builder.Default
|
|
private Boolean partialExitEnabled = false;
|
|
|
|
@Column(name = "partial_exit_pct", nullable = false, precision = 6, scale = 3)
|
|
@Builder.Default
|
|
private BigDecimal partialExitPct = new BigDecimal("50.000");
|
|
|
|
@Column(name = "created_at", nullable = false, updatable = false)
|
|
private LocalDateTime createdAt;
|
|
|
|
@Column(name = "updated_at")
|
|
private LocalDateTime updatedAt;
|
|
|
|
@PrePersist
|
|
protected void onCreate() { createdAt = updatedAt = LocalDateTime.now(); }
|
|
|
|
@PreUpdate
|
|
protected void onUpdate() { updatedAt = LocalDateTime.now(); }
|
|
}
|