init commit
This commit is contained in:
30
signal_filter.py
Normal file
30
signal_filter.py
Normal file
@@ -0,0 +1,30 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""信号冷却过滤模块
|
||||
- 避免同一标的在冷却期内重复产生同方向信号
|
||||
- 过滤后附加 generated_at_utc 字段(UTC ISO)
|
||||
"""
|
||||
from datetime import datetime, timezone, timedelta
|
||||
from typing import List, Dict, Any
|
||||
|
||||
class SignalCooldownFilter:
|
||||
def __init__(self, cooldown_minutes: int = 30):
|
||||
self.cooldown = timedelta(minutes=cooldown_minutes)
|
||||
# key: (symbol, direction) -> last datetime
|
||||
self.last_time: Dict[tuple, datetime] = {}
|
||||
|
||||
def filter(self, signals: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
||||
now = datetime.now(timezone.utc)
|
||||
accepted = []
|
||||
for s in signals:
|
||||
symbol = s.get('symbol')
|
||||
direction = s.get('type') or s.get('direction')
|
||||
key = (symbol, direction)
|
||||
lt = self.last_time.get(key)
|
||||
if lt is not None and now - lt < self.cooldown:
|
||||
continue
|
||||
# Accept
|
||||
self.last_time[key] = now
|
||||
s['direction'] = direction # normalize
|
||||
s['generated_at_utc'] = now.strftime('%Y-%m-%dT%H:%M:%SZ')
|
||||
accepted.append(s)
|
||||
return accepted
|
||||
Reference in New Issue
Block a user