feat: 趋势过滤信号记录系统 + 实时涨跌方向判断
- 新增 TrendFilter 信号记录(enter/exit),按完整信号和高分信号两档分类 - 信号持久化到 data/trend_signals_cache.json,开机自动恢复 - 新增 /api/trend-signals API + SSE trend_signal 实时广播 - 前端新增完整信号卡片和高分信号卡片,移除旧趋势检测卡片 - 评分加入 1h 涨跌方向和实时 drift 惩罚,下跌币不触发信号 - OKX 交易所支持(累积变动、动量、趋势检测) - 修复 trend_filter.go 编译错误 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
73dac50a36
commit
559d7bb870
+33
-1
@@ -208,9 +208,12 @@ type Dashboard struct {
|
||||
|
||||
// Cumulative tracker (1m/5m multi-exchange consensus)
|
||||
cumulativeTracker *CumulativeTracker
|
||||
|
||||
// Trend filter (K-line based quiet + EMA filter)
|
||||
trendFilter *TrendFilter
|
||||
}
|
||||
|
||||
func NewDashboard(store *PriceStore, trader *Trader, database *db.DB, addr string, cfg *Config, momentumTracker *MomentumTracker, trendDetector *TrendDetector, cumulativeTracker *CumulativeTracker) *Dashboard {
|
||||
func NewDashboard(store *PriceStore, trader *Trader, database *db.DB, addr string, cfg *Config, momentumTracker *MomentumTracker, trendDetector *TrendDetector, cumulativeTracker *CumulativeTracker, trendFilter *TrendFilter) *Dashboard {
|
||||
d := &Dashboard{
|
||||
hub: NewSSEHub(),
|
||||
history: newPriceHistory(),
|
||||
@@ -224,6 +227,7 @@ func NewDashboard(store *PriceStore, trader *Trader, database *db.DB, addr strin
|
||||
momentumTracker: momentumTracker,
|
||||
trendDetector: trendDetector,
|
||||
cumulativeTracker: cumulativeTracker,
|
||||
trendFilter: trendFilter,
|
||||
}
|
||||
|
||||
// Wire trend event persistence to SQLite
|
||||
@@ -235,6 +239,13 @@ func NewDashboard(store *PriceStore, trader *Trader, database *db.DB, addr strin
|
||||
}
|
||||
}
|
||||
|
||||
// Wire trend filter signal broadcast via SSE
|
||||
if trendFilter != nil {
|
||||
trendFilter.OnNewSignal = func(sig TrendSignal) {
|
||||
d.hub.Broadcast("trend_signal", sig)
|
||||
}
|
||||
}
|
||||
|
||||
// Wire cumulative event persistence to SQLite
|
||||
if cumulativeTracker != nil && database != nil {
|
||||
cumulativeTracker.OnEvent = func(ev CmEvent) {
|
||||
@@ -276,6 +287,7 @@ func (d *Dashboard) Run() {
|
||||
mux.HandleFunc("GET /api/connections", d.handleConnStatus) // P3-5
|
||||
mux.HandleFunc("GET /api/trend-history", d.handleTrendHistory)
|
||||
mux.HandleFunc("GET /api/cm-history", d.handleCmHistory)
|
||||
mux.HandleFunc("GET /api/trend-signals", d.handleTrendSignals)
|
||||
mux.HandleFunc("GET /events", d.handleSSE)
|
||||
mux.HandleFunc("POST /api/stop", d.handleStop)
|
||||
mux.HandleFunc("POST /api/start", d.handleStart)
|
||||
@@ -597,6 +609,15 @@ func (d *Dashboard) broadcastLoop() {
|
||||
d.hub.Broadcast("cumulative", cmData)
|
||||
}
|
||||
}
|
||||
|
||||
// 8. Trend filter (K-line based quiet + EMA)
|
||||
if d.trendFilter != nil {
|
||||
d.trendFilter.Tick()
|
||||
filterData := d.trendFilter.Snapshot(0)
|
||||
if len(filterData) > 0 {
|
||||
d.hub.Broadcast("trend_filter", filterData)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -764,6 +785,17 @@ func (d *Dashboard) handleCmHistory(w http.ResponseWriter, r *http.Request) {
|
||||
writeJSON(w, map[string]interface{}{"events": events})
|
||||
}
|
||||
|
||||
func (d *Dashboard) handleTrendSignals(w http.ResponseWriter, r *http.Request) {
|
||||
var signals []TrendSignal
|
||||
if d.trendFilter != nil {
|
||||
signals = d.trendFilter.GetSignals(100)
|
||||
}
|
||||
if signals == nil {
|
||||
signals = []TrendSignal{}
|
||||
}
|
||||
writeJSON(w, map[string]interface{}{"signals": signals})
|
||||
}
|
||||
|
||||
func (d *Dashboard) handleTrades(w http.ResponseWriter, r *http.Request) {
|
||||
if d.db == nil {
|
||||
writeJSON(w, map[string]interface{}{"trades": []interface{}{}, "total": 0})
|
||||
|
||||
Reference in New Issue
Block a user