mirror of
https://ghfast.top/https://github.com/aeroxw/easy_tdx_max.git
synced 2026-09-12 14:34:18 +08:00
release: v1.29.0 — 借鉴社区 Fork 六项特性:ZIG 策略 + 交易时段感知刷新 + 120M K 线 + 逐 bar 衍生字段 + 159 龙头池 + 多 Provider LLM 直连
- ZIG 右侧突破回补策略:MyTT 新增 ZIG 之字转向(未来函数,含前视偏差警示); 波谷启动建仓挂硬止损(OCO)→ 见顶清仓记前高 → 右侧突破回补;路径依赖不实现 entry_exit_masks(向量化守护测试白名单);含寻优预设网格与 --strategy-file 独立文件 - 交易时段感知刷新:realtime/session.py(09:15~11:30:30 / 13:00~15:05)+ GET /market/session;看板 30/60/120s 轮询休市自动暂停(三态状态栏 + 开关持久化 + 手动刷新不受限);SSE/WS 既有会话语义不动 - 120 分钟 K 线:/bars?category=MIN_120(MAC 原生 Period.MINS×120 优先, 2×60M 相邻聚合兜底,标准客户端上限 400 根);前端周期选择器同步 - 逐 bar 衍生字段:/bars 与 /bars/index 附带 pre_close/change/change_pct/ amplitude_pct(pre_close≤0.01 兜底防除零) - 159 只核心龙头池:数据资产取自 Fork(东财全行业龙头名单,四组分层); universe=core 接入 screen scan / SignalScanner / StrengthRanker / market strength; GET /market/core-leaders + WebUI「龙头池」页(搜索/个股详情) - 多 Provider LLM 直连:easy_tdx.ai + /llm/*(DeepSeek/通义/智谱/Kimi/MiniMax/ OpenAI/Claude/Ollama/自定义,openai 兼容 + anthropic 原生双协议); 配置落盘 ~/.easy_tdx/llm.json(WebUI「AI 设置」页 ⇆ 手工编辑双向兼容, 文件>环境变量>预设;key 脱敏回显/CLEAR 清除);「AI 解读」后台任务化 (复用 task_runner,提交+轮询,不占 HTTP 连接);思考型模型空白正文防御 (reasoning_content 耗尽 max_tokens → 可操作报错;默认 16000); AI 解读历史页(自动归档 Prompt/正文/策略上下文 + 去回测带参引导) - WebUI 加固:SPA fallback 对未知 /api/* 返回 JSON 404(不再 200 HTML 伪装解析错); index.html 一律 Cache-Control: no-store(防缓存旧资源引用);路由兜底重定向; 全局风险提示常驻底栏 + 龙头池/AI 解读针对性免责声明 - 测试:新增 9 个单测文件共 59 例;黄金基线仅新增 zig_breakout 条目(其余零漂移); 全量 1448 例通过
This commit is contained in:
@@ -24,6 +24,7 @@ easy-tdx backtest SH 600519 --strategy-file strategies/macd_cross.py --cash 5000
|
||||
| `bias_reversal.py` | 乖离率反转 | 反转 | 震荡回归 |
|
||||
| `volume_price.py` | 量价配合 | 综合判断 | 放量突破 |
|
||||
| `obv_trend.py` | OBV 能量潮趋势 | 量价趋势 | 资金持续流入的上升趋势 |
|
||||
| `zig_breakout.py` | ZIG 右侧突破回补 | 右侧突破/波段 | 波谷启动建仓,见顶卖出后右侧突破前高回补(带硬止损;ZIG 为未来函数,回测信号有前视性) |
|
||||
|
||||
## 编写自定义策略
|
||||
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
"""ZIG 右侧突破回补策略(Re-entry on Breakout + 硬止损保护)。
|
||||
|
||||
交易逻辑
|
||||
--------
|
||||
1. **空仓**:ZIG 向上启动(底部波谷确认)→ 全仓买入建仓,挂硬止损(默认 3%)。
|
||||
2. **持仓**:ZIG 见顶回落 → 全仓卖出,并记录 N 日最高价为 breakout_level。
|
||||
3. **空仓等待回补**:收盘价突破 breakout_level × (1 + confirm_pct/100)
|
||||
→ 右侧突破确认,洗盘结束主升确立,全仓买入回补(同样带硬止损)。
|
||||
4. **风控保护**:买入后未见顶但跌破止损线,由引擎自动触发止损平仓,
|
||||
对冲 ZIG 波谷确认的前视偏差(ZIG 是未来函数,拐点回溯标出)。
|
||||
|
||||
注意:与内置注册表中的 ``zig_breakout``(``easy_tdx.backtest.strategies``)
|
||||
同一套逻辑;本文件供 ``--strategy-file`` 离线扫描(``easy-tdx screen scan``)
|
||||
使用,参数硬编码为默认档。
|
||||
|
||||
用法::
|
||||
|
||||
easy-tdx backtest SZ 300223 --strategy-file strategies/zig_breakout.py --table
|
||||
easy-tdx screen scan --strategy strategies/zig_breakout.py --universe core
|
||||
"""
|
||||
|
||||
from easy_tdx.backtest import Strategy
|
||||
from easy_tdx.MyTT import HHV, ZIG
|
||||
|
||||
|
||||
class ZigBreakoutStrategy(Strategy):
|
||||
"""ZIG 右侧突破回补策略(含硬止损保护)。"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
zig_delta: float = 10.0,
|
||||
confirm_pct: float = 2.0,
|
||||
hhv_period: int = 20,
|
||||
stop_loss_pct: float = 3.0,
|
||||
) -> None:
|
||||
super().__init__()
|
||||
self.zig_delta = zig_delta
|
||||
self.confirm_pct = confirm_pct
|
||||
self.hhv_period = hhv_period
|
||||
self.stop_loss_pct = stop_loss_pct
|
||||
|
||||
def init(self) -> None:
|
||||
self.zig = self.I(ZIG, self.data.close, self.zig_delta)
|
||||
self.hhv = self.I(HHV, self.data.high, self.hhv_period)
|
||||
self._breakout_level: float = 0.0
|
||||
|
||||
def next(self) -> None:
|
||||
i = self._bar_index
|
||||
if i == 0:
|
||||
return
|
||||
|
||||
cur_close = float(self.data.close[0])
|
||||
cur_zig = float(self.zig[i])
|
||||
prev_zig = float(self.zig[i - 1])
|
||||
cur_pos = self.position["size"]
|
||||
|
||||
# 持仓:ZIG 见顶 → 全仓卖出,记录突破位
|
||||
if cur_pos > 0 and cur_zig < prev_zig:
|
||||
self._breakout_level = float(self.hhv[i])
|
||||
self.sell(size=0)
|
||||
return
|
||||
|
||||
# 空仓:两种买入路径(均带硬止损)
|
||||
if cur_pos == 0:
|
||||
# 路径 1:ZIG 向上启动(底部波谷确认)→ 初始建仓
|
||||
if cur_zig > prev_zig:
|
||||
self._breakout_level = 0.0
|
||||
self._buy_with_stop()
|
||||
return
|
||||
|
||||
# 路径 2:右侧突破前高 → 回补建仓(洗盘结束、主升确立)
|
||||
if self._breakout_level > 0:
|
||||
threshold = self._breakout_level * (1.0 + self.confirm_pct / 100.0)
|
||||
if cur_close >= threshold:
|
||||
self._breakout_level = 0.0
|
||||
self._buy_with_stop()
|
||||
|
||||
def _buy_with_stop(self) -> None:
|
||||
pct = self.stop_loss_pct / 100.0
|
||||
if pct > 0:
|
||||
self.buy(size=0, stop_loss_pct=pct)
|
||||
else:
|
||||
self.buy(size=0)
|
||||
Reference in New Issue
Block a user