506 lines
21 KiB
Markdown
506 lines
21 KiB
Markdown
# 전략편집기 — 우측 패널 지표 컨트롤 ↔ 매매 시그널 감지
|
||
|
||
전략편집기 우측 **지표** 패널에 있는 컨트롤(칩)을 클릭·드래그했을 때 생성되는 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[i−1] ≤ right[i−1]` **그리고** `left[i] > right[i]` | 교차 **1봉** |
|
||
| **CROSS_DOWN** | `left[i−1] ≥ right[i−1]` **그리고** `left[i] < right[i]` | 교차 **1봉** |
|
||
| **TREND_LINE_CROSS_UP/DOWN** | CROSS와 동일 형식, **right = N봉 피벗 추세선** (fit `[i−N,i−1]`) | 교차 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, i−N..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[t−n] … high[t−1])` (**현재 봉 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` UPPER−LOWER `< 2%` | 변동성 **축소** |
|
||
| | 종가≈중심 | `CLOSE` ≈ `MIDDLE` | 밴드 중앙 횡보 |
|
||
| **MA** | MA5≈MA20 | `DIFF_LT` MA5−MA20 `< N` | 이평 **수렴** |
|
||
| **일목** | 구름 안 | `IN_CLOUD` | 구름 **내부** |
|
||
| | 구름 얇음 | `DIFF_LT` SPAN1−SPAN2 | 얇은 구름 |
|
||
| **Donchian** | 9/20 채널 좁음 | `DIFF_LT` UPPER−LOWER | **좁은 레인지** |
|
||
| **오실레이터** | RSI 40~60 | `GTE`+`LTE` 밴드 | **중립** |
|
||
| **cycle** | Stoch N봉 침체 | `LOWEST_LTE` `%K` | lookback 내 **20 이하** 경험 |
|
||
| **DMI** | +DI≈−DI | `DIFF_LT` PDI−MDI | 방향성 **없음** |
|
||
| **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. **동일 선**을 `i−1`, `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 기준*
|