Files
goldenChart/전략지표컨트롤.md
T
2026-06-30 21:59:13 +09:00

506 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 전략편집기 — 우측 패널 지표 컨트롤 ↔ 매매 시그널 감지
전략편집기 우측 **지표** 패널에 있는 컨트롤(칩)을 클릭·드래그했을 때 생성되는 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 기준*