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

21 KiB
Raw Permalink Blame History

전략편집기 — 우측 패널 지표 컨트롤 ↔ 매매 시그널 감지

전략편집기 우측 지표 패널에 있는 컨트롤(칩)을 클릭·드래그했을 때 생성되는 DSL 조건이,
실제 차트·백테스트·실시간 전략 평가에서 어떻게 매수/매도 시그널로 판정되는지를 정리한 문서입니다.

평가 원천: StrategyDslToTa4jAdapter → Ta4j Rule → 봉 i에서 rule.isSatisfied(i)
관련: 매매전략조건.md · 드로잉선_전략조건.md · 전략편집기 로직 및 동작흐름.md


1. 전체 흐름

[우측 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
  • 드래그PaletteChipStrategyEditorCanvas.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 (분봉 분기)

{ "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 구조

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 leftslopePeriod연속 상승/하락 현재 봉
DIFF_GT / DIFF_LT ` left right
HOLD_N_DAYS left > rightN봉 연속 현재 봉
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개 (makeNodegetDefaultConditionFields).

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_VALUEHL_MID ADX > 25 추세 강도
DMI PDIMDI +DI DI 교차
MACD MACD_LINESIGNAL_LINE MACD 시그널 골든크로스
OBV OBV_LINEOBV_SIGNAL OBV vs OBV 시그널
TRIX TRIX_VALUETRIX_SIGNAL TRIX 교차
Volume OSC VOLUME_OSC_VALUEHL_MID 거래량 OSC 중립 돌파
VR VR_VALUEHL_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 ≠ rightCandleTypeCrossTimeframeCompositeRule (각 분봉에서 left/right 취한 뒤 교차 공식).

7.2 Stoch 과열×보조 (STOCH_OVERBOUGHT_PAIR)

LogicNode OR 트리 (단일 CONDITION 아님):

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:

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% 변동성 축소
종가≈중심 CLOSEMIDDLE 밴드 중앙 횡보
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 복합 횡보

사용 예:

매수 시그널 = 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 → leftCROSS 판정
  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 기준