feat(screener): add canvas layout constants (11 nodes, 16 edges)
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
export const NODE_IDS = {
|
||||
DATA: 'data',
|
||||
GATE: 'gate-hygiene',
|
||||
FOREIGN: 'score-foreign-buy',
|
||||
VOLUME: 'score-volume-surge',
|
||||
MOMENTUM: 'score-momentum',
|
||||
HIGH52W: 'score-high52w',
|
||||
RS: 'score-rs-rating',
|
||||
MA: 'score-ma-alignment',
|
||||
VCP: 'score-vcp-lite',
|
||||
COMBINE: 'combine',
|
||||
RESULT: 'result',
|
||||
};
|
||||
|
||||
export const NODE_KIND_MAP = {
|
||||
[NODE_IDS.DATA]: 'data',
|
||||
[NODE_IDS.GATE]: 'gate',
|
||||
[NODE_IDS.FOREIGN]: 'score',
|
||||
[NODE_IDS.VOLUME]: 'score',
|
||||
[NODE_IDS.MOMENTUM]: 'score',
|
||||
[NODE_IDS.HIGH52W]: 'score',
|
||||
[NODE_IDS.RS]: 'score',
|
||||
[NODE_IDS.MA]: 'score',
|
||||
[NODE_IDS.VCP]: 'score',
|
||||
[NODE_IDS.COMBINE]: 'combine',
|
||||
[NODE_IDS.RESULT]: 'result',
|
||||
};
|
||||
|
||||
// 캔버스 노드 ID → 백엔드 score node name (registry 키)
|
||||
export const SCORE_NODE_NAME_MAP = {
|
||||
[NODE_IDS.FOREIGN]: 'foreign_buy',
|
||||
[NODE_IDS.VOLUME]: 'volume_surge',
|
||||
[NODE_IDS.MOMENTUM]: 'momentum',
|
||||
[NODE_IDS.HIGH52W]: 'high52w',
|
||||
[NODE_IDS.RS]: 'rs_rating',
|
||||
[NODE_IDS.MA]: 'ma_alignment',
|
||||
[NODE_IDS.VCP]: 'vcp_lite',
|
||||
};
|
||||
|
||||
// 4단 layout: DATA → GATE → (점수 7개 세로) → COMBINE → RESULT
|
||||
export const INITIAL_NODE_POSITIONS = {
|
||||
[NODE_IDS.DATA]: { x: 40, y: 280 },
|
||||
[NODE_IDS.GATE]: { x: 240, y: 280 },
|
||||
[NODE_IDS.FOREIGN]: { x: 480, y: 0 },
|
||||
[NODE_IDS.VOLUME]: { x: 480, y: 90 },
|
||||
[NODE_IDS.MOMENTUM]: { x: 480, y: 180 },
|
||||
[NODE_IDS.HIGH52W]: { x: 480, y: 270 },
|
||||
[NODE_IDS.RS]: { x: 480, y: 360 },
|
||||
[NODE_IDS.MA]: { x: 480, y: 450 },
|
||||
[NODE_IDS.VCP]: { x: 480, y: 540 },
|
||||
[NODE_IDS.COMBINE]: { x: 800, y: 280 },
|
||||
[NODE_IDS.RESULT]: { x: 1080, y: 280 },
|
||||
};
|
||||
|
||||
const SCORE_KEYS = ['FOREIGN','VOLUME','MOMENTUM','HIGH52W','RS','MA','VCP'];
|
||||
|
||||
export const EDGES = [
|
||||
{ id: 'e-data-gate', source: NODE_IDS.DATA, target: NODE_IDS.GATE },
|
||||
...SCORE_KEYS.map((k) => ({
|
||||
id: `e-gate-${k.toLowerCase()}`,
|
||||
source: NODE_IDS.GATE,
|
||||
target: NODE_IDS[k],
|
||||
})),
|
||||
...SCORE_KEYS.map((k) => ({
|
||||
id: `e-${k.toLowerCase()}-combine`,
|
||||
source: NODE_IDS[k],
|
||||
target: NODE_IDS.COMBINE,
|
||||
})),
|
||||
{ id: 'e-combine-result', source: NODE_IDS.COMBINE, target: NODE_IDS.RESULT },
|
||||
];
|
||||
|
||||
export const SCORE_NODE_LABEL = {
|
||||
[NODE_IDS.FOREIGN]: { icon: '🌏', title: '외국인 매수' },
|
||||
[NODE_IDS.VOLUME]: { icon: '📊', title: '거래량 급증' },
|
||||
[NODE_IDS.MOMENTUM]: { icon: '🚀', title: '모멘텀' },
|
||||
[NODE_IDS.HIGH52W]: { icon: '🔝', title: '52주 고가' },
|
||||
[NODE_IDS.RS]: { icon: '💪', title: 'RS Rating' },
|
||||
[NODE_IDS.MA]: { icon: '📈', title: '이평선 정렬' },
|
||||
[NODE_IDS.VCP]: { icon: '🌀', title: 'VCP-lite' },
|
||||
};
|
||||
Reference in New Issue
Block a user