fix: 백테스팅 실행 시 인디케이터 파라미터(indicatorParams) 전달

BacktestHistoryPage와 StrategyEditorPage의 handleQuickRun에서
runBacktest 호출 시 loadIndicatorSettings()로 사용자 저장 파라미터를
불러와 indicatorParams로 함께 전송한다.

이를 통해 백엔드가 기본값(kLength=14, smooth=3) 대신 사용자 설정값
(kLength=12, smooth=5 등)으로 지표를 계산하여 차트와 동일한
스토캐스틱 교차 지점에서 정확히 시그널을 생성한다.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Macbook
2026-06-11 17:45:08 +09:00
parent 8d019ddd26
commit 9d9c14c2b1
2 changed files with 16 additions and 11 deletions
@@ -13,6 +13,7 @@ import {
loadStrategies, loadStrategies,
runBacktest, runBacktest,
loadBacktestSettings, loadBacktestSettings,
loadIndicatorSettings,
API_BASE, API_BASE,
type BacktestResultRecord, type BacktestResultRecord,
type BacktestAnalysis, type BacktestAnalysis,
@@ -221,8 +222,9 @@ export function BacktestHistoryPage({ theme = 'dark' }: Props) {
setRunLoading(true); setRunLoading(true);
setRunError(null); setRunError(null);
try { try {
const [settings, barsRes] = await Promise.all([ const [settings, indicatorParams, barsRes] = await Promise.all([
loadBacktestSettings(), loadBacktestSettings(),
loadIndicatorSettings(),
fetch(`${API_BASE}/candles/history?${new URLSearchParams({ fetch(`${API_BASE}/candles/history?${new URLSearchParams({
market: runMarket, market: runMarket,
type: timeframeToCandleType(runTimeframe), type: timeframeToCandleType(runTimeframe),
@@ -242,6 +244,7 @@ export function BacktestHistoryPage({ theme = 'dark' }: Props) {
bars, bars,
timeframe: runTimeframe, timeframe: runTimeframe,
settings, settings,
indicatorParams,
symbol: runMarket, symbol: runMarket,
strategyName: strategy?.name, strategyName: strategy?.name,
}); });
@@ -86,7 +86,7 @@ import { readStoredSize, storeSize, usePanelResize } from './strategyEditor/useP
import StrategyDescriptionModal from './strategyEditor/StrategyDescriptionModal'; import StrategyDescriptionModal from './strategyEditor/StrategyDescriptionModal';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom';
import { MarketSearchPanel } from './MarketSearchPanel'; import { MarketSearchPanel } from './MarketSearchPanel';
import { runBacktest, loadBacktestSettings, API_BASE } from '../utils/backendApi'; import { runBacktest, loadBacktestSettings, loadIndicatorSettings, API_BASE } from '../utils/backendApi';
import { timeframeToCandleType } from '../utils/chartCandleType'; import { timeframeToCandleType } from '../utils/chartCandleType';
import { getKoreanName } from '../utils/marketNameCache'; import { getKoreanName } from '../utils/marketNameCache';
import type { Timeframe } from '../types'; import type { Timeframe } from '../types';
@@ -981,8 +981,9 @@ export default function StrategyEditorPage({ theme, onNavigateToBacktest }: Prop
setQbError(null); setQbError(null);
try { try {
const selectedStrategy = strategies.find(s => s.id === selectedId); const selectedStrategy = strategies.find(s => s.id === selectedId);
const [settings, barsRes] = await Promise.all([ const [settings, indicatorParams, barsRes] = await Promise.all([
loadBacktestSettings(), loadBacktestSettings(),
loadIndicatorSettings(),
fetch(`${API_BASE}/candles/history?${new URLSearchParams({ fetch(`${API_BASE}/candles/history?${new URLSearchParams({
market: qbMarket, market: qbMarket,
type: timeframeToCandleType(qbTimeframe), type: timeframeToCandleType(qbTimeframe),
@@ -1001,6 +1002,7 @@ export default function StrategyEditorPage({ theme, onNavigateToBacktest }: Prop
bars, bars,
timeframe: qbTimeframe, timeframe: qbTimeframe,
settings, settings,
indicatorParams,
symbol: qbMarket, symbol: qbMarket,
strategyName: selectedStrategy?.name, strategyName: selectedStrategy?.name,
}); });