Files
easy_tdx_max/strategies/zig_breakout.py
T
GitHub 4bd5b5d833 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 例通过
2026-09-02 20:19:17 +08:00

84 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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)