diff --git a/src/pages/stock/screener/components/GatePanel.jsx b/src/pages/stock/screener/components/GatePanel.jsx index ab0aa7e..1fb568d 100644 --- a/src/pages/stock/screener/components/GatePanel.jsx +++ b/src/pages/stock/screener/components/GatePanel.jsx @@ -1,3 +1,41 @@ export default function GatePanel({ meta, value, onChange }) { - return

{meta?.label ?? '게이트'}

TODO: 게이트 파라미터 폼 (Task 4.5)

; + if (!meta) return null; + const props = meta.param_schema?.properties || {}; + return ( +
+

{meta.label}

+

+ 통과 조건 — 통과한 종목만 점수 노드에 전달 +

+ {Object.entries(props).map(([key, prop]) => ( + onChange({ ...value, [key]: v })} /> + ))} +
+ ); +} + +function GateField({ paramKey, prop, value, onChange }) { + if (prop.type === 'integer') { + return ( +
+ + onChange(parseInt(e.target.value, 10))} + style={{ flex: 1 }} /> +
+ ); + } + if (prop.type === 'boolean') { + return ( +
+ +
+ ); + } + return null; } diff --git a/src/pages/stock/screener/components/GlobalControls.jsx b/src/pages/stock/screener/components/GlobalControls.jsx index dd8990c..b55c9aa 100644 --- a/src/pages/stock/screener/components/GlobalControls.jsx +++ b/src/pages/stock/screener/components/GlobalControls.jsx @@ -2,9 +2,42 @@ export default function GlobalControls({ settings, setSettings, onRun, onSave, o return (

실행 옵션

- - - +
+ + setSettings({ ...settings, top_n: parseInt(e.target.value, 10) })} + min={5} max={100} style={{ width: 80 }} /> +
+
+ + setSettings({ ...settings, atr_window: parseInt(e.target.value, 10) })} + min={5} max={50} style={{ width: 80 }} /> +
+
+ + setSettings({ ...settings, atr_stop_mult: parseFloat(e.target.value) })} + min={0.5} max={5} style={{ width: 80 }} /> +
+
+ + setSettings({ ...settings, rr_ratio: parseFloat(e.target.value) })} + min={1} max={10} style={{ width: 80 }} /> +
+ + +
); }