전략분봉 저장 에러 문제 수정
This commit is contained in:
@@ -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,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user