Files
goldenChart/backend/src/main/java/com/goldenchart/service/BacktestSettingsService.java
T
2026-05-23 15:11:48 +09:00

85 lines
4.0 KiB
Java

package com.goldenchart.service;
import com.goldenchart.dto.BacktestSettingsDto;
import com.goldenchart.entity.GcBacktestSettings;
import com.goldenchart.repository.GcBacktestSettingsRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@RequiredArgsConstructor
public class BacktestSettingsService {
private final GcBacktestSettingsRepository repo;
/** device_id 기준 설정 조회 — 없으면 기본값 반환 */
@Transactional(readOnly = true)
public BacktestSettingsDto get(String deviceId) {
return repo.findFirstByDeviceIdOrderByUpdatedAtDesc(deviceId)
.map(this::toDto)
.orElseGet(BacktestSettingsDto::new);
}
/** upsert — 기존 설정이 있으면 덮어쓰기, 없으면 새 행 삽입 */
@Transactional
public BacktestSettingsDto save(String deviceId, BacktestSettingsDto dto) {
GcBacktestSettings entity = repo
.findFirstByDeviceIdOrderByUpdatedAtDesc(deviceId)
.orElseGet(GcBacktestSettings::new);
entity.setDeviceId(deviceId);
entity.setInitialCapital(dto.getInitialCapital());
entity.setCommissionType(dto.getCommissionType());
entity.setCommissionRate(dto.getCommissionRate());
entity.setSlippageRate(dto.getSlippageRate());
entity.setEntryPriceType(dto.getEntryPriceType());
entity.setExitPriceType(dto.getExitPriceType());
entity.setPositionDirection(dto.getPositionDirection());
entity.setTradeSizeType(dto.getTradeSizeType());
entity.setTradeSizeValue(dto.getTradeSizeValue());
entity.setStopLossEnabled(dto.getStopLossEnabled());
entity.setStopLossPct(dto.getStopLossPct());
entity.setTakeProfitEnabled(dto.getTakeProfitEnabled());
entity.setTakeProfitPct(dto.getTakeProfitPct());
entity.setTrailingStopEnabled(dto.getTrailingStopEnabled());
entity.setTrailingStopPct(dto.getTrailingStopPct());
entity.setReentryWaitBars(dto.getReentryWaitBars());
entity.setMaxOpenTrades(dto.getMaxOpenTrades());
entity.setPartialExitEnabled(dto.getPartialExitEnabled());
entity.setPartialExitPct(dto.getPartialExitPct());
entity.setPositionMode(
"SIGNAL_ONLY".equals(dto.getPositionMode()) ? "SIGNAL_ONLY" : "LONG_ONLY");
return toDto(repo.save(entity));
}
// ── 변환 헬퍼 ─────────────────────────────────────────────────────────────
private BacktestSettingsDto toDto(GcBacktestSettings e) {
return BacktestSettingsDto.builder()
.id(e.getId())
.initialCapital(e.getInitialCapital())
.commissionType(e.getCommissionType())
.commissionRate(e.getCommissionRate())
.slippageRate(e.getSlippageRate())
.entryPriceType(e.getEntryPriceType())
.exitPriceType(e.getExitPriceType())
.positionDirection(e.getPositionDirection())
.tradeSizeType(e.getTradeSizeType())
.tradeSizeValue(e.getTradeSizeValue())
.stopLossEnabled(e.getStopLossEnabled())
.stopLossPct(e.getStopLossPct())
.takeProfitEnabled(e.getTakeProfitEnabled())
.takeProfitPct(e.getTakeProfitPct())
.trailingStopEnabled(e.getTrailingStopEnabled())
.trailingStopPct(e.getTrailingStopPct())
.reentryWaitBars(e.getReentryWaitBars())
.maxOpenTrades(e.getMaxOpenTrades())
.partialExitEnabled(e.getPartialExitEnabled())
.partialExitPct(e.getPartialExitPct())
.positionMode(e.getPositionMode() != null ? e.getPositionMode() : "LONG_ONLY")
.build();
}
}