海龟唐奇安通道信号引擎
用途
把「n 日新高突破买入、跌破 m 日新低卖出」的唐奇安通道策略做成可每日自动运行的信
号引擎,支持股票、ETF、指数混搭监控。只产出买卖信号,不下单、不回测。
何时使用
- 用户提到海龟交易法、唐奇安通道、通道突破、n 日新高/新低
- 用户想给手里的股票或 ETF 建立每日突破信号提醒
- 用户已有持仓(成本价 + 数量),想知道今天该不该卖
跟踪标的:留空由用户填写,不要主动提问
本技能不主动提问。 标的、成本价、持股数量一律由用户自己填 ——
不要用交互卡片问,也不要逐条追问,更不要问账户参数(一律用默认值)。
当 config.json 的 holdings 为空,或用户要加标的时,直接输出下面这张空白填写表,
让用户自己填(手机端照抄即可):
请填写要跟踪的标的(不填的行忽略;空仓跟踪把成本价与持股数量都填 0):
股票名称 代码 成本价 持股数量
____________ ________ _________ __________
____________ ________ _________ __________
____________ ________ _________ __________
____________ ________ _________ __________
____________ ________ _________ __________
收到用户回复后,把原文整段喂给脚本,由它解析(空格/逗号/冒号/斜杠/换行都能认):
python <skill>/scripts/setup.py --text "600519 1400 1000 / 510300 4.10 10000"
python <skill>/scripts/setup.py --show # 写完回读确认
用户若想自己改 config.json 也可以,直接把字段含义讲清楚,不要代问。
账户参数(总资金 10 万、单笔风险预算 2%、n1=5 / n2=4、ATR 周期 10、止损倍数 2)
一律沿用默认,只有用户主动要求修改时才调整。
写入配置
把用户填写的内容写入 <skill>/config.json:
{
"capital": 100000.0,
"risk_pct": 2.0,
"n1": 5,
"n2": 4,
"atr_n": 10,
"stop_n": 2.0,
"buy_amount": 100000.0,
"holdings": []
}
⚠️ 发布包内的 holdings 必须是空数组 —— 用户安装后不应带任何预置标的。
标的由用户自己填写,不要预填示例、不要把调试用过的代码留在里面。
单只标的的格式(供参考,写入后才会有):
{"code": "600000", "name": "", "cost": 0.0, "shares": 0}
shares 为 0 表示空仓,引擎会走买入判断;大于 0 走卖出判断与浮动盈亏计算。
追加 / 更换跟踪标的(增量配置)
用户说「再加一只 XXX」「还想跟踪 YYY」「把 ZZZ 去掉」时,不要让他重填整张表,
直接用增量命令,一次加一只或多只:
python <skill>/scripts/setup.py --add 600519:1380:0 # 代码:成本价:持有数量,空仓跟踪填 0
python <skill>/scripts/setup.py --add 510300:4.10:10000 # ETF 同样适用
python <skill>/scripts/setup.py --add 000858 # 只给代码 → 按空仓处理
python <skill>/scripts/setup.py --remove 600519 # 移除某只
python <skill>/scripts/setup.py --show # 查看当前跟踪清单
规则:
- 同一代码重复
--add视为更新成本与数量,不会产生重复条目 - 代码写法随意:
600519/600519.SS/sh600519都能识别,去重时自动归一 - 增量模式只改 holdings,不动策略参数(capital / n1 / n2 / ATR 等保持原值)
- 加完直接跑
python <skill>/scripts/engine.py,新的多标的看板会一次性覆盖所有持仓
用户只需口述「加个 XXX,成本 X,持有 N 股」,由你转成上面的命令执行,不要让用户手改 JSON。
运行引擎
python <skill>/scripts/engine.py
临时试算不写配置:
python <skill>/scripts/engine.py --set 000628:38.50:0 --set 510300:4.10:10000
终端环境下也可以用命令行直接写入(推荐 --text / --add,不必逐项问答):
python <skill>/scripts/setup.py --show # 查看当前配置
python <skill>/scripts/setup.py --reset # 清空持仓
Windows 下取数依赖 curl(Git Bash 自带),且需要 dangerouslyDisableSandbox 才能联网。
输出
signals.json—— 结构化信号,含每只标的的 signal / up / dn / atr / stop / suggest,
以及画图用的series(近 60 根 OHLC)与up_series/dn_series(通道序列)dashboard.html—— 可视化看板,涨红跌绿,含账户概览与价位卡片- stdout 摘要
生成后用 present_files 把 dashboard.html 呈现给用户,并用一两句话总结有几个买入/卖出信号。
唐奇安通道图(每只卡片内嵌)
看板里每只标的都带一张唐奇安通道图,画最近 60 个交易日:
| 元素 | 样式 | 含义 |
|---|---|---|
| 蜡烛 | 涨红 / 跌绿 | 日K(前复权) |
| 橙色虚线 | n1 日上线 |
突破即买入 |
| 蓝色虚线 | n2 日下线 |
跌破即卖出 |
| ▲ 红三角 | 买点 | |
| ▼ 绿三角 | 卖点 | |
| 横向虚线 | 当日现价 | 涨跌着色 |
买卖点由状态机生成:空仓时突破上线记一次买点,之后跌破下线记一次卖点,如此交替,
所以图上永远是「一买配一卖」,与实际可交易序列一致,而不是把所有穿越都标出来(那样会密到看不清)。
实现要点(改图时遵守):
- 纯内联 SVG 手绘,不引任何 CDN / JS 库 —— 手机端与离线环境都能渲染
- 通道口径与信号完全一致:第 i 天的上下线取前 n1 / n2 根的最值,不含当日
- 状态机在完整 640 根序列上跑,再把命中点映射到窗口内,避免窗口开头状态判断错误
- 图表数据不写进
signals.json的冗余字段:_bars(原始 bar)与chart(SVG 串)会被剔除
建立每日自动任务
用户确认后,调用 automation_update:
scheduleType:recurringrrule:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR;BYHOUR=14;BYMINUTE=50prompt(自包含,必须写全绝对路径):
运行海龟唐奇安通道信号引擎并出看板:
技能目录:本技能的安装目录(即 SKILL.md 所在目录,下称 <skill>)
1. 读取 <skill>/config.json 的 holdings:
- 有持仓 → 直接进第 2 步
- 为空 → **不要提问、不要弹表单**,直接输出下面这张空白填写表后结束:
请填写要跟踪的标的(不填的行忽略;空仓跟踪把成本价与持股数量都填 0):
股票名称 代码 成本价 持股数量
____________ ________ _________ __________
____________ ________ _________ __________
____________ ________ _________ __________
2. 执行 python "<skill>/scripts/engine.py"(需联网取数,Windows 下依赖 curl,沙箱外运行)
3. 用 present_files 呈现 <skill>/dashboard.html,并用一段话总结今日的买入/卖出/持有信号,
若出现卖出信号则醒目提示标的、触发原因与建议清仓股数
4. 若脚本报「数据异常」或「取数失败」,如实说明,不要用旧数据编造信号
5. 结尾提醒:若今日有成交,需更新 config.json 中的 cost 与 shares
用户在后续消息里回复标的清单时,用
python "<skill>/scripts/setup.py" --text "<用户原话>"
写入配置,然后立刻补跑一次引擎出当日信号。
> ⚠️ 定时任务里禁止任何形式的提问(交互卡片、逐条追问、「请回复一行」都不行)——
> 无人值守时没人回答,任务会直接空跑结束,用户手机上什么都看不到。
> 正确做法:输出空白填写表,等用户下次自己填。
策略规则(用于解释信号)
- 上线 = 最近 n1(默认 5)个已完成交易日最高价的最大值
- 下线 = 最近 n2(默认 4)个已完成交易日最低价的最小值
- ATR(n) = 最近 n 个交易日真实波幅的均值,真实波幅 = max(最高, 昨收) − min(最低, 昨收)
- 空仓:现价 > 上线 → 买入。股数 = floor(min(总资金×风险%÷(2×ATR), 金额上限÷现价)÷100)×100
- 持仓:现价 < 止损价(成本 − 2×ATR)或 现价 < 下线 → 清仓
- 通道一律用已收盘 K 线计算,触发判断用当日实时价,避免信号滞后一天
详细推导与参数含义见 references/strategy.md。
代码格式
支持以下写法,引擎自动识别市场:
| 输入 | 解析结果 |
|---|---|
000628 / 000628.SZ |
sz000628 |
600519 / 600519.SS |
sh600519 |
510300 |
sh510300(沪市 ETF) |
159915 |
sz159915(深市 ETF) |
399005 |
sz399005(深证/国证指数) |
sh000001 |
上证指数(指数与股票代码冲突时必须显式加前缀) |
数据源与容错
- 主源:腾讯
proxy.finance.qq.com前复权日K,单次上限 640 根,足够算指标 - 名称:腾讯
qt.gtimg.cn快照(GBK) - 已知坑:腾讯 qfq 数据回溯到 2021 年之前会出现负价,因此引擎只取最近 640 根;
内置健康检查会拦截负价与异常跳空,数据异常时宁可报错也不编造信号 - 东财
push2his域名在部分网络下返回http_code=000(连接被断),不作为依赖
注意事项
- 信号是提示,不构成投资建议;下单由用户自行完成
- 用户实际成交后,必须提醒其更新
config.json里的cost与shares,否则次日判断会错 - 卖出信号触发后若用户仍持有,次日会继续提示卖出,这是预期行为