전략분봉 저장 에러 문제 수정

This commit is contained in:
Macbook
2026-05-23 21:08:46 +09:00
parent eaf067db1c
commit 70ac67afe7
18 changed files with 2445 additions and 498 deletions
+35 -11
View File
@@ -6,7 +6,7 @@
*
* await run({ strategyId, bars, timeframe });
*/
import { useState, useCallback } from 'react';
import { useState, useCallback, useRef } from 'react';
import type { OHLCVBar } from '../types';
import {
runBacktest,
@@ -17,16 +17,30 @@ import {
} from '../utils/backendApi';
export interface BacktestResult {
signals: BacktestSignal[];
stats: BacktestStats | null;
analysis: BacktestAnalysis | null;
signals: BacktestSignal[];
stats: BacktestStats | null;
analysis: BacktestAnalysis | null;
resultId?: number;
/** 백테스팅 실행 당시 차트 종목·타임프레임 (마커 표시 범위 검증용) */
symbol?: string;
timeframe?: string;
/** 실행마다 증가 — 동일 시그널 배열 참조여도 차트 마커 재적용 트리거 */
runSeq: number;
}
const EMPTY_SIGNALS: BacktestSignal[] = [];
export function useBacktest() {
const [result, setResult] = useState<BacktestResult | null>(null);
const [running, setRunning] = useState(false);
const [error, setError] = useState<string | null>(null);
const runSeqRef = useRef(0);
/** 종목·타임프레임 변경 등으로 진행 중인 run 을 무효화할 때 증가 */
const runGenRef = useRef(0);
const invalidateRuns = useCallback(() => {
runGenRef.current += 1;
}, []);
const run = useCallback(async (opts: {
strategyId?: number;
@@ -39,6 +53,7 @@ export function useBacktest() {
symbol?: string;
strategyName?: string;
}) => {
const runGen = runGenRef.current;
setRunning(true);
setError(null);
try {
@@ -61,15 +76,20 @@ export function useBacktest() {
strategyName: opts.strategyName,
};
const res = await runBacktest(req);
if (runGen !== runGenRef.current) return null;
if (!res) {
setError('백테스팅 요청에 실패했습니다.');
return null;
}
runSeqRef.current += 1;
const r: BacktestResult = {
signals: res.signals,
stats: res.stats,
analysis: res.analysis ?? null,
resultId: res.resultId,
signals: [...res.signals],
stats: res.stats,
analysis: res.analysis ?? null,
resultId: res.resultId,
symbol: opts.symbol,
timeframe: opts.timeframe,
runSeq: runSeqRef.current,
};
setResult(r);
return r;
@@ -88,13 +108,17 @@ export function useBacktest() {
}, []);
return {
signals: result?.signals ?? [],
stats: result?.stats ?? null,
analysis: result?.analysis ?? null,
signals: result?.signals ?? EMPTY_SIGNALS,
stats: result?.stats ?? null,
analysis: result?.analysis ?? null,
resultSymbol: result?.symbol ?? null,
resultTimeframe: result?.timeframe ?? null,
runSeq: result?.runSeq ?? 0,
result,
running,
error,
run,
clear,
invalidateRuns,
};
}