보조지표 기준값 변경시 전략편집기 연동

This commit is contained in:
Macbook
2026-05-27 09:53:19 +09:00
parent 8876dbd752
commit cd5502d302
13 changed files with 288 additions and 110 deletions
+40 -7
View File
@@ -9,7 +9,9 @@ import {
type LiveStrategySettingsDto,
} from '../utils/backendApi';
import { BacktestSettingsPanel } from './BacktestSettingsPanel';
import IndicatorMainDefaultsPanel from './IndicatorMainDefaultsPanel';
import IndicatorMainDefaultsPanel, {
type IndicatorSaveUiState,
} from './IndicatorMainDefaultsPanel';
import type { IndicatorConfig } from '../types';
import type { PlotDef, HLineDef } from '../utils/indicatorRegistry';
import type { IchimokuCloudColors } from '../utils/ichimokuConfig';
@@ -90,6 +92,10 @@ interface SettingsPageProps {
hlines?: HLineDef[],
cloudColors?: IchimokuCloudColors,
) => void;
/** 설정 화면 — 보조지표 기본값 일괄 DB 저장 */
saveAllIndicatorDefaults?: (configs: Record<string, IndicatorConfig>) => Promise<void>;
/** 보조지표 DB 캐시 갱신 revision */
indicatorSettingsRevision?: number;
/** 설정 화면에서 차트 on/off 연동 */
chartIndicators?: IndicatorConfig[];
onAddIndicatorToChart?: (type: string, config?: IndicatorConfig) => void;
@@ -1395,6 +1401,8 @@ const SettingsPage: React.FC<SettingsPageProps> = ({
saveIndicatorParams,
getIndicatorVisual,
saveIndicatorVisual,
saveAllIndicatorDefaults,
indicatorSettingsRevision = 0,
chartIndicators = [],
onAddIndicatorToChart,
onRemoveIndicatorFromChart,
@@ -1455,6 +1463,7 @@ const SettingsPage: React.FC<SettingsPageProps> = ({
}) => {
const categories = filterCategories(menuPermissions);
const [active, setActive] = useState<CategoryId>('general');
const [indicatorSaveUi, setIndicatorSaveUi] = useState<IndicatorSaveUiState | null>(null);
useEffect(() => {
if (categories.length === 0) return;
@@ -1463,6 +1472,10 @@ const SettingsPage: React.FC<SettingsPageProps> = ({
}
}, [categories, active]);
useEffect(() => {
if (active !== 'indicators') setIndicatorSaveUi(null);
}, [active]);
const activeCat = categories.find(c => c.id === active) ?? categories[0];
if (!activeCat) {
@@ -1494,6 +1507,7 @@ const SettingsPage: React.FC<SettingsPageProps> = ({
case 'indicators':
if (
!getIndicatorParams || !saveIndicatorParams || !getIndicatorVisual || !saveIndicatorVisual
|| !saveAllIndicatorDefaults
|| !onAddIndicatorToChart || !onRemoveIndicatorFromChart
) {
return (
@@ -1509,6 +1523,9 @@ const SettingsPage: React.FC<SettingsPageProps> = ({
saveParams={saveIndicatorParams}
getVisualConfig={getIndicatorVisual}
saveVisual={saveIndicatorVisual}
saveAllDefaults={saveAllIndicatorDefaults}
onSaveUiState={setIndicatorSaveUi}
settingsRevision={indicatorSettingsRevision}
/>
);
case 'backtest': return (
@@ -1631,10 +1648,31 @@ const SettingsPage: React.FC<SettingsPageProps> = ({
{/* 헤더 */}
<div className="stg-content-header">
<div className="stg-content-icon">{activeCat.icon}</div>
<div>
<div className="stg-content-header-text">
<h2 className="stg-content-title">{activeCat.label}</h2>
<p className="stg-content-desc">{activeCat.desc}</p>
</div>
{active === 'indicators' && indicatorSaveUi && (
<div className="stg-content-header-actions">
{indicatorSaveUi.saveMessage && (
<span
className={`stg-ind-save-msg stg-ind-save-msg--inline${
indicatorSaveUi.saveMessage.includes('실패') ? ' stg-ind-save-msg--err' : ''
}`}
>
{indicatorSaveUi.saveMessage}
</span>
)}
<button
type="button"
className="stg-btn-save"
disabled={!indicatorSaveUi.dirty || indicatorSaveUi.saving}
onClick={() => void indicatorSaveUi.save()}
>
{indicatorSaveUi.saving ? '저장 중…' : '저장'}
</button>
</div>
)}
</div>
{/* 설정 패널 */}
@@ -1649,11 +1687,6 @@ const SettingsPage: React.FC<SettingsPageProps> = ({
<button className="stg-btn-save"></button>
</div>
)}
{active === 'indicators' && (
<div className="stg-footer stg-footer--hint">
<span className="stg-footer-hint"> .</span>
</div>
)}
</main>
</div>
);