ai 전략 기능 추가

This commit is contained in:
Macbook
2026-06-30 21:59:13 +09:00
parent f9447ea52f
commit 25cbadbffb
18 changed files with 2446 additions and 3 deletions
+505
View File
@@ -0,0 +1,505 @@
# 전략편집기 — 우측 패널 지표 컨트롤 ↔ 매매 시그널 감지
전략편집기 우측 **지표** 패널에 있는 컨트롤(칩)을 클릭·드래그했을 때 생성되는 DSL 조건이,
실제 차트·백테스트·실시간 전략 평가에서 **어떻게 매수/매도 시그널로 판정되는지**를 정리한 문서입니다.
> **평가 원천:** `StrategyDslToTa4jAdapter` → Ta4j `Rule` → 봉 `i`에서 `rule.isSatisfied(i)`
> **관련:** [매매전략조건.md](./매매전략조건.md) · [드로잉선_전략조건.md](./드로잉선_전략조건.md) · [전략편집기 로직 및 동작흐름.md](./전략편집기%20로직%20및%20동작흐름.md)
---
## 1. 전체 흐름
```text
[우측 PaletteChip 클릭/드래그]
makeNode / buildXxxConditionNode → LogicNode (CONDITION 또는 AND/OR/NOT 트리)
전략 저장 (buyConditionJson / sellConditionJson)
StrategyDslToTa4jAdapter.toRule() — leaf CONDITION → Ta4j Rule
봉 i마다 isSatisfied(i) — true면 해당 봉에 BUY 또는 SELL 시그널
전략평가 차트 마커 · LiveConditionStatusService · BacktestingService
```
### 1.1 매수/매도 탭과 시그널 방향
| 편집기 탭 | DSL 저장 위치 | 시그널 타입 |
|-----------|---------------|-------------|
| **매수** (`buySellTab = buy`) | `buyConditionJson` | `BUY` |
| **매도** (`buySellTab = sell`) | `sellConditionJson` | `SELL` |
같은 칩이라도 **어느 탭에서 추가했는지**에 따라 `conditionType` 기본값이 달라집니다.
예: 보조 RSI 칩 → 매수 탭 `CROSS_UP`, 매도 탭 `CROSS_DOWN`.
### 1.2 positionMode (설정 → 전략 설정)
| 모드 | 동작 |
|------|------|
| **SIGNAL_ONLY** | 매수·매도 Rule **독립** — 보유 여부와 무관하게 봉마다 시그널 |
| **LONG_ONLY** | **미보유**일 때만 entry(BUY), **보유**일 때만 exit(SELL) — `TradingRecord` 추적 |
---
## 2. 우측 패널 구조
**파일:** `StrategyEditorPage.tsx`, `StrategyEvaluationIndicatorPalettePanel.tsx`
| 영역 | 내용 |
|------|------|
| 검색 | `paletteSearch` — 라벨·설명 필터 |
| **시작·논리** | START, AND, OR, NOT |
| **밴드·추세** | MA, EMA, BOLLINGER, DONCHIAN, ICHIMOKU (고정 5칩) |
| **지표 서브탭** | 보조지표 · 복합지표 · 횡보필터 · 추세 |
| **템플릿 탭** | 내장·사용자 템플릿 (복합/횡보 항목 재노출) |
칩 추가 경로:
- **클릭** → `applyPalette` / `applySidewaysFilter` / `applyTrendLine`
- **드래그** → `PaletteChip``StrategyEditorCanvas.resolvePaletteDropNode`
---
## 3. 논리 노드 (START / AND / OR / NOT / TIMEFRAME)
### 3.1 START
- 캔버스 **시작 섹션** 추가용. 조건 노드가 아님.
- 실제 평가는 START 아래 **자식 AND/OR 트리**가 담당.
### 3.2 AND / OR
| 노드 | Ta4j | 시그널 조건 |
|------|------|-------------|
| **AND** | `AndRule(자식…)` | **모든** 자식 Rule이 같은 봉 `i`에서 true |
| **OR** | `OrRule(자식…)` | **하나라도** true면 true |
빈 AND/OR → 항상 false (시그널 없음).
### 3.3 NOT
- **첫 번째 자식만** `NotRule`로 감쌈.
- 예: 횡보필터 **exclude** 모드 → `NOT(횡보 조건)` = 추세 구간만 통과.
### 3.4 TIMEFRAME (분봉 분기)
```json
{ "type": "TIMEFRAME", "candleTypes": ["1h"], "children": [ ] }
```
| 단계 | 동작 |
|------|------|
| 1 | `candleTypes[0]` 분봉으로 OHLCV **별도 BarSeries** 구성 |
| 2 | 자식 Rule을 그 분봉에서 평가 |
| 3 | 차트( primary ) 분봉 index `i`**시간 정렬** (`CrossSeriesRule`) |
**백테스트/전략평가:** primary 봉 시각에 맞는 **확정 분봉** index로 매핑.
**실시간:** `LiveStrategyEvaluator` + `StrategyTriggerBranchEvaluator` — 트리거 분봉 마감 시 분기 평가, AND 다중 TF는 **캐시** 결합.
---
## 4. 공통 CONDITION 구조
```typescript
interface ConditionDSL {
indicatorType: string; // RSI, MA, TREND_LINE, …
conditionType: string; // CROSS_UP, GT, TREND_LINE_CROSS_UP, …
leftField?: string; // RSI_VALUE, CLOSE_PRICE, MA20, …
rightField?: string; // HL_OVER, DC_UPPER_20, NONE, …
period?: number;
lookbackPeriod?: number; // 추세선 N, LOWEST N봉
compareValue?: number; // DIFF_GT, VOLUME_GT_MA_RATIO
slopePeriod?: number; // SLOPE_UP/DOWN
holdDays?: number; // HOLD_N_DAYS
candleRange?: number;
candleRangeMode?: 'CURRENT' | 'EXISTS_IN' | 'NOT_EXISTS_IN';
composite?: boolean;
leftPeriod / rightPeriod / leftCandleType / rightCandleType;
params?: Record<string, >;
}
```
### 4.1 conditionType → 차트에서의 의미
| conditionType | 판정 방식 | 적용 봉 |
|---------------|-----------|---------|
| **GT / LT / GTE / LTE / EQ / NEQ** | `left[i]` vs `right[i]` **수준 비교** | 현재 봉 `i` |
| **CROSS_UP** | `left[i1] ≤ right[i1]` **그리고** `left[i] > right[i]` | 교차 **1봉** |
| **CROSS_DOWN** | `left[i1] ≥ right[i1]` **그리고** `left[i] < right[i]` | 교차 **1봉** |
| **TREND_LINE_CROSS_UP/DOWN** | CROSS와 동일 형식, **right = N봉 피벗 추세선** (fit `[iN,i1]`) | 교차 1봉 |
| **SLOPE_UP / SLOPE_DOWN** | `left``slopePeriod`**연속 상승/하락** | 현재 봉 |
| **DIFF_GT / DIFF_LT** | `|left right| >/< compareValue` | 현재 봉 |
| **HOLD_N_DAYS** | `left > right`**N봉 연속** | 현재 봉 |
| **LOWEST_LTE / LOWEST_GTE** | `min(left, iN..i)` vs `right` | 현재 봉 |
**NaN·미확정:** left/right NaN → 해당 봉 false. `CROSS_*``index < 1`이면 false.
### 4.2 leftField / rightField 해석
백엔드 `resolveField()`가 심볼 → Ta4j `Indicator`로 변환합니다.
| 심볼 예 | 의미 |
|---------|------|
| `CLOSE_PRICE` | 종가 |
| `RSI_VALUE` | RSI 본선 (period는 지표 설정·조건 상속) |
| `HL_OVER` / `HL_MID` / `HL_UNDER` | 과열/중립/침체 **임계값** (설정·지표별) |
| `K_80`, `K_20` | Stoch 직접 입력 임계 |
| `DC_UPPER_20` | 20봉 Donchian **상단** (직전 N봉 high max, 당일 제외 방식은 NH_PRIOR 참고) |
| `NH_PRIOR_9` | **직전 9봉** 최고가 (당일 봉 **미포함**) |
| `NL_PRIOR_9` | **직전 9봉** 최저가 |
| `NONE` | 일목 구름·추세선 등 **단항** 조건 |
---
## 5. 밴드·추세 (고정 5칩)
**출처:** `BAND_PALETTE_CHIP_ITEMS` (`strategyPaletteStorage.ts`)
### 5.1 이동평균 (MA)
| 항목 | 값 |
|------|-----|
| 기본 (매수) | `MA` · `CROSS_UP` · `MA1` vs `MA2` |
| 기본 (매도) | `MA` · `CROSS_DOWN` · `MA1` vs `MA2` |
| **시그널** | 단기 MA가 장기 MA **상향/하향 교차**한 **그 봉** |
MA1/MA2 기간 → 보조지표 설정 `period1`, `period2` (SMA 설정).
### 5.2 EMA
MA와 동일 구조. `EMA1` vs `EMA2`, `EMAIndicator` 사용.
### 5.3 볼린저밴드 (BOLLINGER)
| 항목 | 값 |
|------|-----|
| 기본 (매수) | `CLOSE_PRICE` `CROSS_UP` `UPPER_BAND` |
| 기본 (매도) | `CLOSE_PRICE` `CROSS_DOWN` `LOWER_BAND` (편집기에서 변경 가능) |
| **시그널** | 종가가 **밴드 경계**를 돌파한 봉 |
다른 조건: `GT`/`LT`로 밴드 **내부/외부** 체류 판정.
### 5.4 돈치안 (DONCHIAN)
| 항목 | 값 |
|------|-----|
| 기본 (매수) | `CLOSE_PRICE` `CROSS_UP` `DC_UPPER_20` |
| 기본 (매도) | `CLOSE_PRICE` `CROSS_DOWN` `DC_LOWER_20` |
| **시그널** | 종가가 N봉 채널 **상단/하단** 교차 |
`DC_UPPER_n` = Donchian 상단 Indicator. (신고가 `NH_PRIOR_n`과 계산 방식·당일 포함 여부 주의 — §7.4)
### 5.5 일목균형표 (ICHIMOKU)
| 항목 | 값 |
|------|-----|
| 기본 (매수) | `CONVERSION_LINE` `CROSS_UP` `BASE_LINE` |
| 기본 (매도) | `CONVERSION_LINE` `CROSS_DOWN` `BASE_LINE` |
| **시그널** | **전환선·기준선 골든/데드크로스** |
**추가 전용 conditionType** (left/right 자동 설정):
| conditionType | 시그널 의미 |
|---------------|-------------|
| `ABOVE_CLOUD` | 종가 > 구름 상단 |
| `BELOW_CLOUD` | 종가 < 구름 하단 |
| `IN_CLOUD` | 종가가 구름 **내부** |
| `CLOUD_BREAK_UP` | 종가 **구름 상단** 상향 돌파 (Ta4j CrossedUp) |
| `CLOUD_BREAK_DOWN` | 종가 **구름 하단** 하향 이탈 |
| `SPAN1_CROSS_UP_SPAN2` | 선행1 **선행2** 상향 교차 |
| `LAGGING_GT_PRICE` | 후행스팬 > **26봉 전** 종가 |
| `LAGGING_ABOVE_PRIOR_CLOUD` | 후행 > **26봉 전** 구름 상단 |
| `CHIKOU_CROSS_ABOVE_PRIOR_CLOUD` | 후행 **구름 상단** 1회 돌파 |
파라미터: 전환 9 · 기준 26 · 선행/후행 26 · 선행2 52 (설정 상속).
---
## 6. 보조지표 탭 (`auxiliary`)
**내장 17종** + 사용자 추가 (`DEFAULT_AUXILIARY_ITEMS`).
단일 칩 → **CONDITION 1개** (`makeNode``getDefaultConditionFields`).
### 6.1 오실레이터 (RSI, Stochastic, CCI, Williams %R, BWI)
| 지표 | 기본 left | 기본 right | 기본 condition (매수) |
|------|-----------|------------|------------------------|
| RSI | `RSI_VALUE` | `HL_OVER` (과열) | `CROSS_UP` → 침체→과열 **교차** 아님, **과열선 돌파** |
| Stochastic | `STOCH_K` | `STOCH_D` | `%K` vs `%D` 교차 |
| CCI | `CCI_VALUE` | `CCI_SIGNAL` | CCI vs 시그널선 교차 |
| Williams %R | `WILLIAMS_R_VALUE` | `HL_OVER` | 과매도 구간 **탈출** 등 (필드 변경 가능) |
**추가 (오실레이터 전용):**
| conditionType | 시그널 |
|---------------|--------|
| `LOWEST_LTE` | 최근 **N봉**(lookback, 기본 20) `left` **최저** ≤ 침체선 — “최근 N봉 안 침체 터치” |
| `LOWEST_GTE` | 최근 N봉 최저 ≥ 임계 — 침체 이탈 유지 |
**실전 예 (Stoch 재매수 억제):** `AND( CROSS_UP 80, LOWEST_LTE 20 )` — 80 돌파 **且** 최근 20봉 내 20 이하 경험.
### 6.2 추세·거래량 (ADX, DMI, MACD, OBV, TRIX, Volume OSC, VR)
| 지표 | 기본 left → right | 전형적 시그널 |
|------|-------------------|---------------|
| ADX | `ADX_VALUE``HL_MID` | ADX > 25 추세 강도 |
| DMI | `PDI``MDI` | +DI **DI** 교차 |
| MACD | `MACD_LINE``SIGNAL_LINE` | MACD **시그널** 골든크로스 |
| OBV | `OBV_LINE``OBV_SIGNAL` | OBV vs OBV 시그널 |
| TRIX | `TRIX_VALUE``TRIX_SIGNAL` | TRIX 교차 |
| Volume OSC | `VOLUME_OSC_VALUE``HL_MID` | 거래량 OSC 중립 돌파 |
| VR | `VR_VALUE``HL_OVER` | VR 과열 |
### 6.3 심리·이격 (DISPARITY, PSY*, INVEST_PSY)
- `DISPARITY{n}` vs `HL_MID` — 이격도 과열/침체.
- 심리도 계열 — `PSY_VALUE` vs `HL_OVER` 등.
### 6.4 거래량 (VOLUME)
| conditionType | 시그널 |
|---------------|--------|
| `GT` / `CROSS_UP` | 거래량 vs `VOLUME_MA` |
| **`VOLUME_GT_MA_RATIO`** | `volume[i] ≥ MA(length) × compareValue` (기본 MA 5, 비율 1.5) |
### 6.5 신고가 / 신저가 (NEW_HIGH / NEW_LOW)
| 항목 | 매수 (NEW_HIGH) | 매도 (NEW_LOW) |
|------|-----------------|----------------|
| 기본 | `CLOSE` `CROSS_UP` `NH_PRIOR_9` | `CLOSE` `CROSS_DOWN` `NL_PRIOR_9` |
| **right 의미** | **직전 9봉** 최고가 수평선 | **직전 9봉** 최저가 |
| **시그널** | 종가가 **신고가선** 상향 **교차** | 종가가 **신저가선** 하향 **교차** |
백엔드: `NH_PRIOR_n` = `max(high[tn] … high[t1])` (**현재 봉 high 미포함**).
`CROSS_UP` + right≠NH_PRIOR 시 **GTE**로 정규화 (Donchian 당일 포함 CROSS 방지).
---
## 7. 복합지표 탭 (`composite`)
### 7.1 동일 지표 2기간 교차 (`COMPOSITE_INDICATOR_ITEMS`)
**플래그:** `composite: true`, `leftPeriod`, `rightPeriod`, `leftField`, `rightField`, (선택) `leftCandleType` / `rightCandleType`.
| 칩 | left → right (예) | 시그널 |
|----|-------------------|--------|
| 돈치안 | `DC_UPPER_9` `CROSS_UP` `DC_UPPER_20` | **단기** 채널상단이 **장기** 상단 돌파 |
| RSI | `RSI_VALUE_9` `CROSS_UP` `RSI_VALUE_18` | 단기 RSI **장기** RSI 상향 교차 |
| CCI, ADX, Williams, TRIX, VR, PSY, 이격도 | 동일 패턴 | 기간 교차 |
**멀티 TF:** `leftCandleType ≠ rightCandleType``CrossTimeframeCompositeRule` (각 분봉에서 left/right 취한 뒤 교차 공식).
### 7.2 Stoch 과열×보조 (`STOCH_OVERBOUGHT_PAIR`)
**LogicNode OR 트리** (단일 CONDITION 아님):
```text
OR(
AND( Stoch %K ≥ 80, 보조지표 CROSS_UP 중앙 ),
AND( 보조지표 ≥ 0, Stoch %K CROSS_UP 80 )
)
```
- **시그널:** 과열 구간 Stoch×보조 **동시 충족** 또는 **역순** 동시 충족.
- 메타: `stochPair.secondaryIndicatorType` (기본 CCI).
### 7.3 9·20일 신고/신저 (`NEW_HIGH_9_20_BUY` / `NEW_LOW_9_20_SELL`)
**LogicNode AND:**
- `NEW_HIGH` `CROSS_UP` `NH_PRIOR_9` (또는 20)
- **필터** (filterLevel: balanced / strict) — ADX·거래량 등 추가 leaf
**시그널:** 단기 신고가 돌파 **且** 필터 통과.
### 7.4 33변곡 (`INFLECTION_33_BUY/SELL`)
- EMA33 **변곡** + Donchian/필터 AND.
- **시그널:** 33봉 EMA 기울기 전환 + 채널 확인.
### 7.5 일목×볼린저 (`ICHIMOKU_BB_BUY/SELL`)
단일 CONDITION:
```text
indicatorType: ICHIMOKU_BB
leftField: LAGGING_SPAN
rightField: UPPER_BAND | LOWER_BAND
conditionType: CROSS_UP | CROSS_DOWN
params.chikouDisplacement: 26 (기본)
```
**시그널:** **26봉 전** 후행스팬 vs **26봉 전** BB 밴드 교차 (후행·밴드 모두 lag 적용).
### 7.6 일목 상황별 (23종, `ICHIMOKU_SIT_*`)
| 카테고리 | 예 | 내부 구조 |
|----------|-----|-----------|
| 기본 매수 5 | 골든크로스, 기준선 돌파, 구름 돌파… | AND/OR **복수 CONDITION** |
| 호전/역전 | 호전(정배열), 역전(역배열) | 4~5 조건 AND |
| 엘리어트 10 | 1·2·3·4·5파, A·B·C | 파동 단계별 AND |
**시그널:** 해당 **상황 ID**에 정의된 leaf 조건이 **같은 봉**에서 모두(AND) 또는 일부(OR) 충족.
### 7.7 추천 안정형 (18종, `TURTLE_S1_BUY` 등)
| 전략 ID | 시그널 요지 |
|---------|-------------|
| TURTLE_S1 | 20일 **최고가** 돌파 매수 / 10일 **최저** 이탈 청산 |
| TURTLE_S2 | 55/20일 터틀 장기 |
| DONCHIAN_20 | 20일 채널 상·하단 |
| MA_TREND | MA 교차 + ADX |
| ICHIMOKU_TREND / SANYAKU / GOELEMENT | 일목 조합 |
| MACD_MOMENTUM / BOLLINGER_BOX | 모멘텀·박스 |
각 항목은 `stableStrategyPairs.ts`에 **고정 LogicNode**로 정의 — 편집기에서 leaf 펼치면 MA·DONCHIAN·ICHIMOKU CONDITION들.
---
## 8. 횡보필터 탭 (`range`)
**목적:** 매수/매도 **본 조건**과 AND로 묶어 **횡보 구간만** 또는 **횡보만 제외**하고 시그널.
| mode | LogicNode | 시그널 해석 |
|------|-----------|-------------|
| **include** | `buildInner()` 그대로 | **횡보일 때만** true인 leaf |
| **exclude** | `NOT(buildInner())` | **추세일 때만** true |
**카테고리 10종 · 내장 52필터** (`sidewaysFilterPalette.ts`):
| 카테고리 | 대표 필터 | leaf 조건 예 | true인 시장 |
|----------|-----------|--------------|-------------|
| **ADX** | ADX < 25 | `ADX LT HL_MID` | **약한 추세** (횡보) |
| | ADX ≥ 25 (exclude용) | `ADX GTE` | 강한 추세 |
| **볼린저** | 밴드 수축 | `DIFF_LT` UPPERLOWER `< 2%` | 변동성 **축소** |
| | 종가≈중심 | `CLOSE``MIDDLE` | 밴드 중앙 횡보 |
| **MA** | MA5≈MA20 | `DIFF_LT` MA5MA20 `< N` | 이평 **수렴** |
| **일목** | 구름 안 | `IN_CLOUD` | 구름 **내부** |
| | 구름 얇음 | `DIFF_LT` SPAN1SPAN2 | 얇은 구름 |
| **Donchian** | 9/20 채널 좁음 | `DIFF_LT` UPPERLOWER | **좁은 레인지** |
| **오실레이터** | RSI 40~60 | `GTE`+`LTE` 밴드 | **중립** |
| **cycle** | Stoch N봉 침체 | `LOWEST_LTE` `%K` | lookback 내 **20 이하** 경험 |
| **DMI** | +DI≈−DI | `DIFF_LT` PDIMDI | 방향성 **없음** |
| **volume** | 거래량 < MA | `VOLUME LT VOLUME_MA` | **저거래** |
| **combo** | ADX+구름+RSI | AND | **복합 횡보** |
**사용 예:**
```text
매수 시그널 = AND( 본래 매수 조건, 횡보필터 exclude「ADX≥25」 )
→ 추세가 있을 때만 매수
```
---
## 9. 추세 탭 (`trendline`)
**10칩** (`TREND_LINE_PALETTE_ITEMS`). 추세선 **정의**는 설정 → 전략 설정 (피벗·N·스윙 k).
| 칩 | indicatorType | leftField | conditionType |
|----|---------------|-----------|---------------|
| 종가 | MA | `CLOSE_PRICE` | buy: `TREND_LINE_CROSS_UP` |
| MA / EMA | MA / EMA | `MA20` / `EMA20` | sell: `TREND_LINE_CROSS_DOWN` |
| RSI, MACD, Stoch… | 해당 타입 | 지표선 | 동일 |
**공통 DSL:** `rightField: NONE`, `lookbackPeriod` (기본 10, 설정 `trendLineDefaultLookback`).
### 9.1 백엔드 시그널 알고리즘 (`TrendLineMath` + `buildTrendLineCrossUpRule`)
1. **fit 구간:** `[i N, i 1]` (현재 봉 **제외**)
2. **피벗 선정:**
- **상향 돌파 (매수):** **하락 저항선** — 스윙 **고점** 2개, `High₂ < High₁`, **High** 가격 연결
- **하향 돌파 (매도):** **상승 지지선** — 스윙 **저점** 2개, `Low₂ > Low₁`, **Low** 가격 연결
3. **동일 선**을 `i1`, `i`에서 extrapolation → `left`와 **CROSS** 판정
4. **오실레이터 left:** 스윙을 **지표값** 기준, 선도 지표 축
**시그널:** 해당 봉에서 종가(또는 left 지표)가 **N봉 피벗 추세선**을 **상향/하향 돌파**한 **그 봉 1개**.
전략평가 차트: **선택 봉** 위치의 추세선만 overlay (`buildSignalTrendLineDrawings`).
---
## 10. candleRange (N봉 윈도우) — 조건 편집기
팔레트 기본은 `candleRange: 1`, `candleRangeMode` 미설정 (= **CURRENT**).
| candleRangeMode | 의미 |
|-----------------|------|
| **CURRENT** | 해당 봉에서만 core Rule |
| **EXISTS_IN** | 최근 N봉 **중 하나라도** core true |
| **NOT_EXISTS_IN** | 최근 N봉 **동안 core true 없음** |
`SLOPE_*` + EXISTS_IN: 최근 N봉 **전 구간** 상승/하락 추세.
---
## 11. 시그널이 차트에 표시되는 경로
| 기능 | 서비스 | Rule 빌드 | 스캔 |
|------|--------|-----------|------|
| **전략평가** | `BacktestingService` / chart scan | `toRule(buy/sell)` | evalStart..end 각 `i` |
| **전략편집기 평가 탭** | 동일 (`StrategyEvaluationChart`) | 동일 | 동일 |
| **실시간 조건 패널** | `LiveConditionStatusService.evaluate` | leaf별 + overall | 현재/선택 봉 |
| **실시간 자동매매** | `LiveStrategyEvaluator` | TriggerBranch | 분봉 **마감** 시 |
**마커:** `isSatisfied(i) === true`인 봉 `i`의 **시각·종가**에 BUY/SELL 마커.
**LONG_ONLY:** BUY 후 exit Rule true 봉까지 **재진입 BUY 억제**.
---
## 12. 컨트롤 → 시그널 빠른 참조표
| 패널 영역 | 컨트롤 | 생성물 | 한 줄 시그널 요약 |
|-----------|--------|--------|-------------------|
| 논리 | AND | AND 노드 | 모든 하위 조건 **동시** 충족 봉 |
| 논리 | OR | OR 노드 | 하나라도 충족 봉 |
| 논리 | NOT | NOT 노드 | 자식 조건 **반대** |
| 밴드 | MA/EMA | 1 CONDITION | 이평 **골든/데드크로스** 봉 |
| 밴드 | BOLLINGER | 1 CONDITION | 종가 **밴드** 돌파 |
| 밴드 | DONCHIAN | 1 CONDITION | 종가 **채널** 돌파 |
| 밴드 | ICHIMOKU | 1 CONDITION | 전환/기준 **교차** 또는 구름/후행 **전용** 조건 |
| 보조 | RSI 등 | 1 CONDITION | 지표 vs 임계/시그널 **교차·수준** |
| 보조 | NEW_HIGH | 1 CONDITION | **직전 N봉 신고가** 교차 |
| 복합 | 2기간 RSI… | 1 composite CONDITION | **단기 vs 장기** 교차 |
| 복합 | Stoch×CCI | OR 트리 | 과열+보조 **복합** |
| 복합 | 9·20 신고가 | AND 트리 | 신고가+**필터** |
| 복합 | 일목 23종 | AND/OR 트리 | **상황별** 다중 조건 |
| 복합 | 안정형 18종 | AND/OR 트리 | **템플릿 전략** |
| 횡보 | ADX<25 등 | AND/NOT 트리 | **횡보/추세 필터** (타 조건과 AND) |
| 추세 | 종가/RSI… | 1 CONDITION | **N봉 피벗 추세선** 돌파 |
---
## 13. 편집기에서 시그널 확인 방법
1. **전략평가** 또는 편집기 **평가** 탭 실행 → 차트 **BUY/SELL 마커**
2. 하단 **봉 선택기**로 봉 이동 → `LiveConditionStatusService` 스타일로 **조건별 true/false** (평가 패널)
3. **추세** 조건: 선택 봉에서 **점선 추세선** overlay
4. DSL **CondEditor**에서 `conditionType`·`leftField`·`lookbackPeriod` 변경 → 위 표의 Rule **즉시 반영**
---
## 14. 코드 인덱스
| 영역 | 경로 |
|------|------|
| 팔레트 UI | `frontend/src/components/StrategyEditorPage.tsx` |
| 칩 | `frontend/src/components/strategyEditor/PaletteChip.tsx` |
| DSL 타입 | `frontend/src/utils/strategyTypes.ts` |
| 노드 생성 | `frontend/src/utils/strategyEditorShared.tsx` |
| 보조/복합 목록 | `frontend/src/utils/strategyPaletteStorage.ts` |
| 복합 2기간 | `frontend/src/utils/compositeIndicators.ts` |
| 횡보 47필터 | `frontend/src/utils/sidewaysFilterPalette.ts` |
| 추세 9칩 | `frontend/src/utils/trendLinePalette.ts` |
| 일목 23 | `frontend/src/utils/ichimokuSituationStrategy.ts` |
| 안정형 18 | `frontend/src/utils/stableStrategyPairs.ts` |
| Rule 변환 | `backend/.../StrategyDslToTa4jAdapter.java` |
| 추세선 수학 | `backend/.../TrendLineMath.java` |
| 백테스트 스캔 | `backend/.../BacktestingService.java` |
| 실시간 | `backend/.../LiveConditionStatusService.java` |
---
*문서 버전: 2026-06 — goldenChart 전략편집기·StrategyDslToTa4jAdapter 기준*