알림팝업 수정, 전략평가 로직 개선

This commit is contained in:
Macbook
2026-06-05 10:32:40 +09:00
parent 238dd0cebe
commit 5278177bbb
9 changed files with 484 additions and 116 deletions
+23 -11
View File
@@ -438,17 +438,22 @@ flowchart LR
**조건:** `executionType == REALTIME_TICK` 등 동일
**평가:** `evaluateRealtimeTick(market, candleType)`
**평가:** `evaluateSettingRealtimeTick(setting, market, candleType)`
- `currentIndex = series.getEndIndex()`**진행 중(provisional) 봉**
- **중복 방지:** 동일 `(market, candleType)`에서 같은 index에 이미 시그널 냈으면 skip
- 평가 전 **strategy 캐시 제거**`updateLastBar` 후 지표 캐시 stale 방지
- **중복 방지:** 동일 `(market, candleType:strategyId)`에서 같은 index에 이미 시그널 냈으면 skip
- **Rule 캐시 완전 우회:** 매 평가마다 신규 Rule 인스턴스 빌드 (`evaluateWithFreshRules`)
- Ta4j `CachedIndicator` stale 캐시 원천 차단
- `triggerRulesCache` 복합 연산(remove→put) 스레드 안전성 문제 제거
- **멀티 TF:** `useConfirmedOnly=false` — 비트리거 상위봉 현재 진행 중인 봉 기준 평가
### 9.5 보완 — 마감 직후 REALTIME 재평가
`BarBuilder`: `CANDLE_CLOSE``NONE`이면`evaluateRealtimeAtClose(maturedIndex)`
봉 마감 시`evaluateSettingRealtimeAtClose(setting, market, candleType, maturedIndex)`
- 봉 마감 시점의 **교차(CROSS)** 를 3초 스케줄러가 놓치는 경우 대비
- `useConfirmedOnly=true` — 확정봉 인덱스 기준 + 상위봉도 확정봉 사용
- Rule 캐시 우회
### 9.6 평가 흐름 (단일 종목·단일 시점)
@@ -457,24 +462,29 @@ flowchart TD
A[트리거: 봉 마감 또는 3초 틱]
B{isLiveCheck?}
C{usesTimeframe?}
D[LiveStrategyEvaluator.evaluate]
E[buildStrategy - DSL to Ta4j]
D1[CANDLE_CLOSE: evaluate - 캐시 사용 - useConfirmedOnly=true]
D2[REALTIME_TICK: evaluateWithFreshRules - 캐시 우회 - useConfirmedOnly=false]
E[buildTriggerRules - DSL to Ta4j with CrossSeriesRule]
F[StrategySignalDeterminer.determineSignal]
G{결과}
H[publishStrategySignal]
H[설정별 독립 publishStrategySignal]
I[NONE - 종료]
A --> B
B -->|false| I
B -->|true| C
C -->|false| I
C -->|true| D
D --> E --> F --> G
C -->|CANDLE_CLOSE| D1
C -->|REALTIME_TICK| D2
D1 --> E --> F --> G
D2 --> E
G -->|BUY/SELL| H
G -->|NONE| I
```
**주의:** 동일 마켓에 활성 설정이 여러 개면 evaluator**첫 non-NONE 시그널만** 반환할 수 있음.
**주의:** `BarCloseStrategyEvaluationService` / `LiveStrategyScheduler` 는 **설정별 독립 루프**로
멀티 전략 시그널을 각각 발행한다. `evaluateCandleClose(market)`, `evaluateRealtimeTick(market)` 마켓 단위 API 는
첫 non-NONE 만 반환하므로 실시간 시그널 발행 경로에서 사용 금지 (`@Deprecated`).
---
@@ -533,7 +543,9 @@ flowchart TD
| 항목 | 백테스트 (`BacktestingService`) | 실시간 (`LiveStrategyEvaluator`) |
|------|--------------------------------|----------------------------------|
| BarSeries | 요청 `bars`로 일회성 생성 | `Ta4jStorage` 실시간 누적 |
| adapter | `toRule(dsl, series, params)` | `toRule(..., market, storage)` |
| 멀티 TF | **DSL에서 상위봉 타입 추출 → 집계 시리즈 생성** (→ seriesOverrides) | `Ta4jStorage` 다중 시리즈 |
| adapter | `toRule(dsl, series, params, seriesOverrides)` (백테스트 멀티 TF) | `toRule(..., market, storage)` |
| CrossSeriesRule | **타임스탬프 기반 룩업** (isBacktest=true) | getEndIndex() 또는 endIndex-1 |
| 스캔 | **전 구간** 0..barCount-1 | **단일 index** (마감 or provisional) |
| 청산 | DSL sell + **손절/익절/트레일링** OR 합성 | DSL sell (+ 리스크 모니터 별도) |
| 출력 | `BacktestResponse.signals`, `gc_backtest_result` | STOMP + `gc_trade_signal` |