# 전략편집기 — 템플릿 탭 ↔ 매매 시그널 감지 전략편집기 우측 **템플릿** 탭에 나열된 각 전략을 적용했을 때 생성·저장되는 DSL이, 실제 차트·백테스트·실시간 평가에서 **어떻게 매수/매도 시그널로 판정되는지**를 정리한 문서입니다. > **평가 원천:** `StrategyDslToTa4jAdapter` → Ta4j `Rule` → 봉 `i`에서 `rule.isSatisfied(i)` > **관련:** [전략지표컨트롤.md](./전략지표컨트롤.md) · [매매전략조건.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 병합** (필터 노드 추가) | ```text [내장/내 템플릿 적용] → 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 하락+종가 **참고:** 터틀 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** 종가전환 등) | 전환/기준/구름 **하향 CROSS** OR | 삼역호전 | | **ICHIMOKU_PERFECT** | 전환>기준 + 구름 위 | 전환<기준 + 구름 아래 | 5원소(양운·후행은 strict) | | **MACD_MOMENTUM** | MACD CROSS_UP | MACD CROSS_DOWN **OR** 종가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중 횡보) | **실전 조합 예:** ```text 매수 = 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. 차트까지의 평가 경로 ```text [템플릿 적용] ↓ 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 기준*