19 KiB
전략편집기 — 템플릿 탭 ↔ 매매 시그널 감지
전략편집기 우측 템플릿 탭에 나열된 각 전략을 적용했을 때 생성·저장되는 DSL이,
실제 차트·백테스트·실시간 평가에서 어떻게 매수/매도 시그널로 판정되는지를 정리한 문서입니다.
평가 원천:
StrategyDslToTa4jAdapter→ Ta4jRule→ 봉i에서rule.isSatisfied(i)
관련: 전략지표컨트롤.md · 매매전략조건.md
1. 템플릿 탭 구조
파일: StrategyEditorPage.tsx, strategyTemplateList.ts, TemplatePaletteTab.tsx
템플릿 목록은 4종 출처를 하나의 리스트로 합칩니다 (buildStrategyTemplatePaletteRows).
출처 (source) |
배지 | 개수(기본) | 생성·적용 |
|---|---|---|---|
| builtin | (없음) | 28 | getStrategyTemplates() |
| composite-palette | 복합지표 | ~58 | 복합지표 팔레트와 동일 항목 |
| sideways-palette | 횡보지표 | 52 | 횡보필터 팔레트와 동일 항목 |
| user | 내 템플릿 | 사용자 저장 | ui_preferences.strategyEditor.userTemplates |
검색(templateSearch)은 라벨·설명·매수/매도·배지 문자열로 필터합니다.
2. 템플릿 적용 방식 (중요)
템플릿을 더블클릭/적용할 때 동작이 출처마다 다릅니다.
| 출처 | 적용 함수 | 캔버스 동작 |
|---|---|---|
| 내장 (builtin) | handleTemplate |
해당 매수 또는 매도 탭 전체를 교체 (반대 탭·고아 노드 초기화) |
| 내 템플릿 (user) | applyUserTemplate |
저장된 LogicNode 트리로 해당 탭 전체 교체 |
| 복합지표 (composite-palette) | applyPaletteItem |
현재 탭 루트에 AND 병합 (기존 조건 유지 + 추가) |
| 횡보지표 (sideways-palette) | applySidewaysFilter |
현재 탭 루트에 AND 병합 (필터 노드 추가) |
[내장/내 템플릿 적용]
→ buyCondition 또는 sellCondition = 템플릿 루트 1개 (교체)
[복합·횡보 템플릿 적용]
→ mergeAtRoot(기존 루트, 새 노드, AND) — 다른 조건과 결합 가능
전략평가 탭에서는 buildTemplateEvaluationPayload가 내장/내 템플릿을 새 평가 전략으로 만들고, 복합·횡보는 동일 빌더로 DSL을 생성합니다.
3. 시그널 판정 공통 규칙
템플릿도 최종적으로 LogicNode 트리이므로, leaf CONDITION마다 아래 규칙이 적용됩니다.
| conditionType | 봉 i에서 true 조건 |
|---|---|
| CROSS_UP | left[i−1] ≤ right[i−1] 且 left[i] > right[i] |
| CROSS_DOWN | left[i−1] ≥ right[i−1] 且 left[i] < right[i] |
| GT / LT / GTE / LTE | left[i] vs right[i] 수준 비교 |
| AND | 모든 자식 true |
| OR | 하나라도 true |
| NOT | 자식 false |
| EXISTS_IN (N봉) | 최근 N봉 중 core Rule 1회 이상 true |
필터 강도: 복합 전략(9·20 신고가, 33변곡, 안정형 등)은 기본 relaxed(완화) — ADX·거래량 등 보조 필터 없음이 기본값입니다. 편집기에서 강함/보통으로 변경 가능.
positionMode: 설정 → 전략 설정. LONG_ONLY면 BUY 후 exit(SELL) true 전까지 재진입 BUY 억제.
4. 내장 템플릿 (28종)
출처: strategyPresets.ts → getStrategyTemplates(def)
MA 기간은 설정의 maLines[0], maLines[1] (기본 5·10일)을 사용합니다.
4.1 단순 템플릿 (kind: 'simple') — 16종
CONDITION 1개. simpleTemplateToNode()로 변환.
| 라벨 | signal | indicator | condition | left → right | 시그널 의미 |
|---|---|---|---|---|---|
| MA 골든크로스 매수 | buy | MA | CROSS_UP | MA5 → MA10 | 단기 MA 장기 MA 상향 교차 봉 |
| MA 데드크로스 매도 | sell | MA | CROSS_DOWN | MA5 → MA10 | 단기 MA 장기 MA 하향 교차 봉 |
| RSI 과매도 매수 | buy | RSI | LTE | RSI_VALUE → OVERSOLD_30 | RSI ≤ 30 (과매도 구간 체류, 교차 아님) |
| RSI 과매수 매도 | sell | RSI | GTE | RSI_VALUE → OVERBOUGHT_70 | RSI ≥ 70 |
| MACD 상향 돌파 | buy | MACD | CROSS_UP | MACD_LINE → SIGNAL_LINE | MACD 시그널선 골든크로스 |
| MACD 하향 돌파 | sell | MACD | CROSS_DOWN | MACD_LINE → SIGNAL_LINE | MACD 데드크로스 |
| 볼린저 하단 돌파 매수 | buy | BOLLINGER | CROSS_UP | CLOSE → LOWER_BAND | 종가 하단밴드 상향 돌파 (반등) |
| 볼린저 상단 돌파 매도 | sell | BOLLINGER | CROSS_UP | CLOSE → UPPER_BAND | 종가 상단밴드 상향 돌파 (과열 이탈) |
| CCI 과매도 반등 | buy | CCI | CROSS_UP | CCI_VALUE → OVERSOLD_NEG100 | CCI −100선 상향 돌파 |
| 심리도 과매도 반등 매수 | buy | PSY | CROSS_UP | PSY_VALUE → OVERSOLD_25 | 심리도 25선 상향 돌파 |
| 스토캐스틱 골든크로스 | buy | STOCH | CROSS_UP | STOCH_K → STOCH_D | %K %D 상향 교차 |
| ADX 중앙선 상향 돌파 | buy | ADX | CROSS_UP | ADX_VALUE → ADX_25 | ADX 25선 상향 돌파 |
| 9일 신고가 돌파 | buy | NEW_HIGH | CROSS_UP | CLOSE → NH_PRIOR_9 | 종가 직전 9봉 최고가 교차 |
| 20일 신고가 돌파 | buy | NEW_HIGH | CROSS_UP | CLOSE → NH_PRIOR_20 | 종가 직전 20봉 최고가 교차 |
| 9일 신저가 이탈 | sell | NEW_LOW | CROSS_DOWN | CLOSE → NL_PRIOR_9 | 종가 직전 9봉 최저가 하향 교차 |
| 20일 신저가 이탈 | sell | NEW_LOW | CROSS_DOWN | CLOSE → NL_PRIOR_20 | 종가 직전 20봉 최저가 하향 교차 |
NH_PRIOR_n / NL_PRIOR_n: max(high[t−n..t−1]) / min(low[t−n..t−1]) — 현재 봉 high/low 미포함.
4.2 복합 내장 템플릿 (kind: 'composite') — 12종
build() 함수가 AND/OR LogicNode를 반환. 적용 시 해당 탭 전체가 이 트리로 교체됩니다.
4.2.1 9·20일 신고/신저가
| 라벨 | signal | 트리 | 기본(relaxed) 시그널 |
|---|---|---|---|
| 9·20일 신고가 매수 | buy | AND |
CLOSE CROSS_UP NH_PRIOR_20 만 |
| 9·20일 신저가 매도 | sell | AND |
CLOSE CROSS_DOWN NL_PRIOR_20 만 |
필터 강도별 추가 leaf (편집기에서 변경 가능):
| 강도 | 매수 추가 | 매도 추가 |
|---|---|---|
| strict | 9일 CROSS + ADX≥25 + 거래량>MA + 고가≥20일선 | ADX≥20 + 거래량>MA |
| balanced | ADX≥18 | ADX≥15 |
| relaxed | (없음) | (없음) |
4.2.2 33변곡
| 라벨 | signal | 트리 | 기본(relaxed) 시그널 |
|---|---|---|---|
| 33변곡 매수 | buy | AND |
EMA33 1봉 SLOPE_UP + CLOSE CROSS_UP CLOSE_MAX_33 |
| 33변곡 매도 | sell | OR |
CLOSE CROSS_DOWN CLOSE_MIN_33 만 (EMA 분기 생략) |
balanced/strict 시 매수: EMA 2봉 변곡, 종가>EMA33, ADX·거래량 필터 추가.
매도 strict/balanced: EMA 하락+종가<EMA33 OR 채널 이탈.
4.2.3 돈천·터틀·일목 (Donchian / Ichimoku)
| 라벨 | signal | DSL 핵심 | 시그널 |
|---|---|---|---|
| 돈천 채널(20일) 매수 | buy | DONCHIAN CROSS_UP CLOSE → DC_UPPER_20 | 20일 채널 상단 돌파 |
| 돈천 채널(20일) 매도 | sell | DONCHIAN CROSS_DOWN CLOSE → DC_LOWER_20 | 20일 채널 하단 이탈 |
| 터틀 S1 매수 | buy | DC_UPPER_20 CROSS_UP | 20일 최고가 돌파 진입 |
| 터틀 S1 청산 | sell | DC_LOWER_10 CROSS_DOWN | 10일 최저가 이탈 청산 |
| 터틀 S2 매수 | buy | DC_UPPER_55 CROSS_UP | 55일 최고가 돌파 |
| 터틀 S2 청산 | sell | DC_LOWER_20 CROSS_DOWN | 20일 최저가 이탈 |
| 일목 전환/기준선 매수 | buy | ICHIMOKU CROSS_UP CONVERSION → BASE | 전환·기준 골든크로스 |
| 일목 전환/기준선 매도 | sell | ICHIMOKU CROSS_DOWN CONVERSION → BASE | 데드크로스 |
참고: 터틀 S1 매수 = 돈천 20일 매수와 동일 DSL. S1 청산만 10일 하단으로 다름.
5. 복합지표 템플릿 (~58종, 배지「복합지표」)
출처: buildCompositePaletteTemplateRows — DEFAULT_COMPOSITE_ITEMS (strategyPaletteStorage.ts)
지표 탭 복합 서브탭과 동일 항목이 템플릿 탭에도 노출됩니다.
적용 시 현재 탭 조건에 AND 병합 (applyPaletteItem).
5.1 Stoch 과열×보조 (1종)
| 라벨 | signal | 트리 | 시그널 |
|---|---|---|---|
| Stoch 과열×보조 | buy | OR |
(Stoch≥80 ∧ 보조 CROSS_UP 중앙) ∨ (보조≥중앙 ∧ Stoch CROSS_UP 80) |
기본 보조: CCI. 편집기에서 RSI·ADX 등 변경 가능.
5.2 9·20 신고/신저 · 33변곡 · 일목×BB (6종)
내장 §4.2와 동일 빌더. 템플릿 탭에서는 추가(병합) 방식만 다름.
| 항목 | 빌더 | 기본 시그널 요약 |
|---|---|---|
| 9·20일 신고가 매수 | buildNewHigh920BuyTree |
20일 신고가 CROSS + (필터) |
| 9·20일 신저가 매도 | buildNewLow920SellTree |
20일 신저가 CROSS + (필터) |
| 33변곡 매수/매도 | buildInflection33Tree |
EMA33 변곡 + 33봉 종가 채널 |
| 일목×BB 매수 | buildIchimokuBbBuyTree |
26봉 전 후행 vs 26봉 전 BB 상한 CROSS_UP |
| 일목×BB 매도 | buildIchimokuBbSellTree |
26봉 전 후행 vs 26봉 전 BB 하한 CROSS_DOWN |
5.3 일목 상황별 (23종)
빌더: ichimokuSituationStrategy.ts — BUILDERS[situationId][mode]
| ID | 라벨(요) | signal | 논리 | leaf 조건 (동일 봉 AND/OR) |
|---|---|---|---|---|
| GOLDEN_CROSS | 골든크로스 매수 | buy | AND | 전환 CROSS_UP 기준 |
| BASE_BREAKUP | 기준선 돌파 매수 | buy | AND | 종가 CROSS_UP 기준선 |
| CLOUD_BREAKUP | 구름 돌파 매수 | buy | AND | CLOUD_BREAK_UP |
| LAGGING_BULL | 후행 호전 매수 | buy | AND | 후행 > 26봉 전 종가 |
| CLOUD_SUPPORT | 구름 지지 매수 | buy | AND | 종가>선행1 且 종가>기준선 |
| HOJEON | 호전(정배열) 매수 | buy | AND | 전환>기준 + 구름 위 + 양운 + 후행>종가 |
| DEAD_CROSS | 데드크로스 매도 | sell | OR | 전환 CROSS_DOWN 기준 |
| BASE_BREAKDOWN | 기준선 이탈 매도 | sell | OR | 종가 CROSS_DOWN 기준선 |
| CLOUD_BREAKDOWN | 구름 이탈 매도 | sell | OR | CLOUD_BREAK_DOWN |
| LAGGING_BEAR | 후행 역전 매도 | sell | OR | 후행 < 26봉 전 종가 |
| CLOUD_RESISTANCE | 구름 저항 매도 | sell | AND | 종가<선행1 且 종가<기준선 |
| SANYAKU_REVERSE | 삼역역전 매도 | sell | AND | 전환<기준 + 구름 아래 + 후행 역전 |
| GYEOKJEON | 역전(역배열) 매도 | sell | AND | 전환<기준 + 구름 아래 + 음운 + 후행 역전 |
| EW1 | 1파 매수 | buy | AND | 종가>기준 CROSS + 전환>기준 |
| EW2 | 2파 매수/손절 | buy/sell | AND/OR | 매수: 기준·선행2 지지+전환>기준 / 매도: 기준 이탈 OR 구름 이탈 |
| EW3 | 3파 매수 | buy | AND | 전환>기준 + 구름 위 + 후행 + 양운 |
| EW4 | 4파 재매수/익절 | buy/sell | AND/OR | 매수: 선행1·전환 지지 / 매도: 기준·구름 이탈 |
| EW5 | 5파 분할매도 | sell | OR | 종가<전환 OR 데드 OR 구름 이탈 |
| EW_A | A파 매도 | sell | OR | 기준·데드 이탈 |
| EW_B | B파 매도 | sell | AND | 기준 아래 + 구름 아래 + 전환<기준 |
| EW_C | C파 매도 | sell | AND | 구름 이탈 + 구름 아래 + 전환<기준 + 후행 역전 |
5.4 추천 안정형 (18종)
빌더: stableStrategyPairs.ts — 기본 필터 relaxed
| strategyId | 매수 핵심 | 매도 핵심 | relaxed 시그널 |
|---|---|---|---|
| TURTLE_S1 | DC_UPPER_20 CROSS_UP | DC_LOWER_10 CROSS_DOWN | §4.2.3과 동일 |
| TURTLE_S2 | DC_UPPER_55 CROSS_UP | DC_LOWER_20 CROSS_DOWN | 장기 터틀 |
| DONCHIAN_20 | DC_UPPER_20 CROSS_UP | DC_LOWER_20 CROSS_DOWN | 20일 채널 |
| MA_TREND | MA20 CROSS_UP MA60 | MA20 CROSS_DOWN MA60 OR 종가<MA20 | 이평 추세 |
| ICHIMOKU_TREND | 전환/기준 CROSS_UP | CROSS_DOWN OR 구름 아래(balanced+) | 일목 추세 |
| ICHIMOKU_SANYAKU | 구름 돌파 + (종가>전환 등) | 전환/기준/구름 하향 CROSS OR | 삼역호전 |
| ICHIMOKU_PERFECT | 전환>기준 + 구름 위 | 전환<기준 + 구름 아래 | 5원소(양운·후행은 strict) |
| MACD_MOMENTUM | MACD CROSS_UP | MACD CROSS_DOWN OR 종가<EMA60 | 모멘텀 |
| BOLLINGER_RANGE | RSI≤30 + ADX약 + 하단밴드 CROSS_UP | RSI≥70 OR 상단밴드 CROSS_UP | 박스권 |
필터 강도 (strict/balanced) 추가 예:
| 전략 | strict 추가 |
|---|---|
| TURTLE / DONCHIAN 매수 | ADX≥25 + 거래량>MA |
| MA_TREND 매수 | ADX≥25 + 거래량>MA |
| ICHIMOKU_SANYAKU 매수 | EXISTS_IN 윈도우(12~26봉) + MA60·거래량 |
| MACD_MOMENTUM 매수 | EMA60 위 + ADX·거래량 |
5.5 동일 지표 2기간 교차 (10종)
적용: makeNode(..., { composite: true }) — 현재 매수/매도 탭에 따라 CROSS_UP / CROSS_DOWN.
| 칩 | left → right (기본 기간) | 시그널 |
|---|---|---|
| 돈치안 | DC_UPPER_9 CROSS DC_UPPER_20 | 단기 채널상단이 장기 상단 돌파 |
| RSI | RSI_VALUE_9 CROSS RSI_VALUE_18 | 단기 RSI 장기 RSI 교차 |
| CCI | CCI_VALUE_9 CROSS CCI_VALUE_26 | 동일 패턴 |
| ADX | ADX_VALUE_14 CROSS ADX_VALUE_28 | 동일 |
| Williams %R | WILLIAMS_R 14 vs 28 | 동일 |
| TRIX | TRIX 12 vs 24 | 동일 |
| VR | VR 26 vs 52 | 동일 |
| 심리도 / 투자심리도 | 설정 기간 ×2 | 동일 |
| 이격도 | dispShort vs dispMid | 동일 |
기간은 보조지표 설정(DefType)에서 상속.
6. 횡보지표 템플릿 (52종, 배지「횡보지표」)
출처: buildSidewaysPaletteTemplateRows — DEFAULT_SIDEWAYS_FILTER_ITEMS
적용: buildSidewaysFilterLogic(templateId, mode, def) → 현재 탭에 AND 병합.
| mode | LogicNode | 시그널 해석 |
|---|---|---|
| include | 필터 leaf 그대로 | 횡보일 때 true — 횡보 구간 포함 필터 |
| exclude | NOT(필터 leaf) |
추세일 때 true — 횡보 제외 |
템플릿 탭 signal 표시: include → buy, exclude → sell (UI 라벨용; 실제로는 필터 노드이며 단독 매매 시그널이 아님).
6.1 카테고리별 시그널 조건
| 카테고리 | 대표 템플릿 | true = 횡보(include) |
|---|---|---|
| ADX | ADX < 25 | ADX < 25 (비추세) |
| ADX ≥ 25 (exclude) | 추세 — NOT으로 횡보 제외 | |
| 볼린저 | BB 수축 | 상·하단 간격 DIFF_LT (Squeeze) |
| 종가 ≈ 중심 | 종가 ≈ MIDDLE_BAND | |
| MA | MA5≈MA20 | MA 스프레드 DIFF_LT |
| 일목 | 구름 안 | IN_CLOUD |
| Donchian | 9/20일 채널 좁음 | DC_UPPER − DC_LOWER DIFF_LT |
| 오실레이터 | RSI 40~60 | RSI GTE 40 ∧ LTE 60 |
| cycle | Stoch 20봉 침체 | LOWEST_LTE %K ≤ 20 (lookback 20) |
| DMI | +DI ≈ −DI | PDI−MDI DIFF_LT |
| volume | 거래량 < MA | VOLUME LT VOLUME_MA |
| combo | ADX+구름+RSI | 위 조건 AND (3중 횡보) |
실전 조합 예:
매수 = AND( MA 골든크로스, NOT「ADX<25」 ) ← exclude ADX≥25 = 추세에서만 매수
매수 = AND( RSI 과매도, 「RSI 40~60」 ) ← include = 횡보 확인 (드묾)
전체 52항목 ID·설명은 sidewaysFilterPalette.ts DEFAULT_SIDEWAYS_FILTER_ITEMS 참고.
7. 내 템플릿 (사용자 저장)
저장: 현재 매수 또는 매도 탭의 EditorConditionState + orphans 스냅샷.
| 필드 | 의미 |
|---|---|
signal |
buy / sell — 적용 시 해당 탭만 채움 |
editorState.root |
LogicNode 트리 |
orphans |
캔버스 고아 노드 |
시그널: 저장 시점 DSL 그대로 StrategyDslToTa4jAdapter 평가.
내용은 사용자가 만든 AND/OR/CONDITION 조합이므로, leaf별로 §3 공통 규칙 적용.
적용: 반대 탭·고아 초기화 후 전체 교체 (applyUserTemplate).
8. 내장 vs 복합지표 중복
다음 항목은 내장 템플릿과 복합지표 템플릿에 둘 다 나타날 수 있습니다.
| 항목 | 차이 |
|---|---|
| 9·20 신고/신저, 33변곡, 터틀, 돈천, 일목 전환/기준 | DSL 동일 |
| 적용 방식 | 내장 = 탭 교체 / 복합 = AND 추가 |
숨김: 템플릿 삭제 → hiddenBuiltinTemplateIds에 key 저장 (복원 가능).
9. 차트까지의 평가 경로
[템플릿 적용]
↓
buyConditionJson / sellConditionJson (전략 저장)
↓
StrategyDslToTa4jAdapter.toRule(buy) / toRule(sell)
↓
BacktestingService · StrategyEvaluationChart · LiveConditionStatusService
↓
isSatisfied(i) === true → 봉 i에 BUY/SELL 마커
| 기능 | 템플릿 사용처 |
|---|---|
| 전략편집기 | 템플릿 탭 적용 → 편집 후 전략 저장 |
| 전략평가 | 템플릿 선택 → [템플릿] {라벨} 임시 전략 생성 |
| 실시간 | 저장된 전략 DSL → 분봉 마감 시 TriggerBranch 평가 |
10. 템플릿별 시그널 빠른 참조
| 템플릿 유형 | 대표 예 | 한 줄 시그널 |
|---|---|---|
| 단순 내장 | MA 골든크로스 | 이평 교차 1봉 |
| 단순 내장 | RSI 과매도 | RSI ≤30 수준 |
| 단순 내장 | 20일 신고가 | 직전 20봉 고가 CROSS_UP |
| 복합 내장 | 9·20 신고가 | 20일 CROSS + (선택 필터) AND |
| 복합 내장 | 터틀 S1 | 20일 돌파 매수 / 10일 이탈 매도 |
| 복합지표 | Stoch×CCI | 과열+보조 OR 조합 |
| 복합지표 | 일목 EW3 | 4~5 일목 leaf AND |
| 복합지표 | MA 추세 | MA20/60 + (ADX) |
| 복합지표 | RSI 2기간 | RSI 단기 장기 CROSS |
| 횡보 | ADX<25 include | 횡보 필터 (타 조건과 AND) |
| 횡보 | ADX≥25 exclude | 추세만 통과 NOT |
| 내 템플릿 | (사용자) | 저장 DSL 그대로 |
11. 코드 인덱스
| 영역 | 경로 |
|---|---|
| 템플릿 목록 병합 | frontend/src/utils/strategyTemplateList.ts |
| 내장 28종 정의 | frontend/src/utils/strategyPresets.ts |
| 복합·횡보 행 변환 | frontend/src/utils/strategyEditorTemplatePaletteRows.ts |
| 템플릿 UI | frontend/src/components/strategyEditor/TemplatePaletteTab.tsx |
| 적용 (편집기) | frontend/src/components/StrategyEditorPage.tsx — handleTemplateApply |
| 적용 (전략평가) | frontend/src/utils/strategyEvaluationTemplateApply.ts |
| 9·20 / 33변곡 | priceExtremeBreakoutPair.ts, inflection33Strategy.ts |
| Stoch×보조 | stochOverboughtPair.ts |
| 일목×BB | ichimokuBbStrategy.ts |
| 일목 23상황 | ichimokuSituationStrategy.ts |
| 안정형 18 | stableStrategyPairs.ts |
| 2기간 교차 | compositeIndicators.ts |
| 횡보 52 | sidewaysFilterPalette.ts |
| 사용자 템플릿 | strategyTemplateStorage.ts |
| Rule 변환 | backend/.../StrategyDslToTa4jAdapter.java |
문서 버전: 2026-06 — goldenChart 전략편집기 템플릿 탭·strategyPresets 기준