86 lines
2.8 KiB
JavaScript
86 lines
2.8 KiB
JavaScript
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',
|
|
AI_NEWS: 'score-ai-news',
|
|
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.AI_NEWS]: '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',
|
|
[NODE_IDS.AI_NEWS]: 'ai_news',
|
|
};
|
|
|
|
// 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.AI_NEWS]: { x: 480, y: 630 },
|
|
[NODE_IDS.COMBINE]: { x: 800, y: 280 },
|
|
[NODE_IDS.RESULT]: { x: 1080, y: 280 },
|
|
};
|
|
|
|
const SCORE_KEYS = ['FOREIGN','VOLUME','MOMENTUM','HIGH52W','RS','MA','VCP','AI_NEWS'];
|
|
|
|
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' },
|
|
[NODE_IDS.AI_NEWS]: { icon: '🤖', title: 'AI 뉴스' },
|
|
};
|