알림팝업 수정, 전략평가 로직 개선
This commit is contained in:
+23
-11
@@ -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` |
|
||||
|
||||
Reference in New Issue
Block a user