新用户免费一周。 DeepTick 给的免费额度,足够你把「实时行情 + 策略告警 + 断线看门狗」整条链路跑通、把阈值调到能用。
全文代码可直接复制,改三个地方(AppKey、群地址、标的)就能跑自己的行情。
一周额度到期也不用心疼——重新注册一个账号就能接着试,具体做法写在第四节最后。

先看结果:这是程序实际跑起来的界面。1 分钟收盘价曲线叠 MA5 和 MA20,下方成交量柱,右上角绿点实时显示"WS 推送正常 / 延迟 / 每分钟条数"——数据一断,这个点就变黄。
说明:本方案完全由AI完成,不懂代码也可以,直接让AI熟悉这篇文章即可完成工具的调试, 推荐workbuddy。
--
一、先说三个盯盘时最难受的时刻
第一个,是半夜那个你没看见的插针。
币是 7×24 的,A 股收盘了美股开盘,美股收盘了期货夜盘还在跑。人一天能真正集中注意力盯盘的时间,撑死四小时。剩下的二十小时里,行情照样在动,插针照样插。第二天早上看到那根长长的下影线,除了骂一句,没什么可做的。
第二个,是你看不出"速度"。
同一根 K 线,慢慢跌 3% 和五分钟内砸 3%,含义完全不同。但屏幕上只是一条线,你的眼睛分辨不出斜率。等你反应过来"这跌得有点快",往往已经走完了一半。
第三个,也是最危险的:数据断了你不知道。
很多自建盯盘脚本的通病是——进程还在,日志还在滚,但其实 WebSocket 半小时前就断了。你以为在看实时行情,其实在看半小时前的最后一口价格。没有告警的监控,比没有监控更危险,因为它给你一种虚假的安全感。
这三个问题,靠"更努力地盯"解决不了,只能靠机器。下面这套东西,就是干这个的。
二、为什么数据源选 DeepTick
做实时告警,卡脖子的从来不是策略逻辑,是数据。三条路摆在面前:
| 方案 | 真实成本 |
|---|---|
| 直接对接各家交易所 API | 币所、券商、期货商三套协议,字段名全不一样,还得自己处理限频和断线,写一个月起步 |
| 爬行情网页 | 延迟几十秒,结构说改就改,随时挂 |
| DeepTick | 一个 Key、一套字段,REST + WebSocket 都有,接进来半天,新用户还免费一周 |
我用下来,它有几个点是真的省事:
1. 一个 Key 同时管 REST 和 WebSocket。
REST 放请求头 deeptoken,WebSocket 放握手头,同一个字段名。不用维护两套凭证,也不用研究 OAuth 流程。
2. 推送而不是轮询,这是"实时告警"的前提。
轮询 1 秒一次,你永远比市场慢 1 秒,而且请求数很快打满限额。WebSocket 是服务端主动推,实测单标的 45~66 条/分钟,延迟 0.5~3 秒(含上游推送节奏)。这个量级做分钟级策略判断完全够。
3. 市场代码是统一的。
不管币、美股、A 股还是贵金属,都是一套 代码.市场 的写法:
ZECUSDT.CR 加密 · Zcash/USDT
BTCUSDT.CR 加密 · 比特币
AAPL.US 美股 · 苹果
600519.SH A股 · 贵州茅台
XAUUSD.MT 贵金属 · 伦敦金
加一个标的,只是 YAML 里多两行,不是多写一个适配器。
4. 新用户有一周免费额度,够把整条链路验证完。
一周时间,足够你验证策略触发准不准、推送能不能到群、断线会不会自动恢复。先白跑一周,确认这套东西真的替你省了事,再决定要不要付费——不用一上来就充钱试错。
5. 错误码给得清楚,排障不用猜。4002 是免费套餐的白名单限制,4004 是订阅被拒(没有该标的权限),8008 是 K 线周期参数不合法。看一眼就知道是账号权限问题还是代码问题,不用抓包。
一个实测的坑先提醒:权限是按账号开通的。我拿同一个 Key,
ZECUSDT.CR的订阅正常,BTCUSDT.CR返回4004。接新标的之前,先用一行 curl 验证一下,别急着写进配置——否则你会在日志里看到一条条无效重连。
三、这套工具由三块组成
┌──────────────────────────────┐
│ DeepTick 行情源 │
│ REST /api/v1/quote │
│ WS wss://.../ws/v1 │
└──────────────┬───────────────┘
│
┌──────────────▼───────────────┐
│ ① 行情接入层 app/feed.py │
│ · WS 订阅 + 25s 心跳 │
│ · 55s 静默主动重建 │
│ · 指数退避重连(1→60s) │
│ · REST 兜底补数 │
└──────────────┬───────────────┘
│ 每条报价
┌──────────────▼───────────────┐
│ ② 策略引擎 strategy.py │
│ 价格/涨跌幅/振幅/量/失联 │
│ all · any · not 任意嵌套 │
│ 冷却 + 重新武装(去重) │
└──────────────┬───────────────┘
│ 命中
┌──────────────▼───────────────┐
│ ③ 告警通道 notify.py │
│ 企业微信 / 钉钉 / 任意 Webhook│
└──────────────────────────────┘
④ 看门狗 watchdog.py ← 不看行情,只看"数据链路本身"还活着吗
⑤ 定时汇总 digest.py ← 每 10 分钟报个平安 + 当前价位
三层的职责分得很清楚,好处是换任何一层都不影响另外两层:换数据源只改 feed.py,换群只改 notify 的 webhook,改阈值只动 YAML。
而第 ④ 层是我认为最值得单独说的——看门狗不看行情,它看的是"行情还在不在"。连接断了、某个标的三分钟没跳、五分钟内重连五次、推送延迟超过 5 秒、整体消息量为 0,这五种情况它都会报警。它监控的是监控本身,这才是能让脚本放心无人值守跑通宵的关键。
四、四步跑起来
第 1 步:拿 Key(新用户免费一周)
去 DeepTick 注册,新账号自带 7 天免费额度,不用绑卡、不用先充钱。注册完在控制台创建 API Key,形如 dt_xxxxxxxxxxxxxxxx。
(注册地址:https://deeptick.cc/,用邀请链接注册的话,把它替换成你自己的。)

注册只要邮箱 + 密码 + 验证码,30 秒完成。

红框里就是你要复制的东西。顺手看一眼"到期时间"——免费额度到期后这串 Key 还有效,但请求会被上游拒绝,表现为日志里的 4002 / 4004。
一句话总结这一步:一周内零成本,把下面三步全部跑完。
第 2 步:装依赖
git clone <你的仓库地址> deeptick-monitor
cd deeptick-monitor
pip install -r requirements.txt
requirements.txt 只有四个包,都是纯 Python:
websockets>=12,<18
httpx>=0.27
PyYAML>=6.0
tzdata>=2024.1
第 3 步:填 .env(只需要改这里)
# DeepTick 的 API Key(REST 与 WebSocket 共用)
DEEPTICK_API_KEY=dt_你的Key填在这里
# 钉钉群机器人(群设置 → 智能群助手 → 添加机器人 → 自定义 → 加签或关键词)
DINGTALK_WEBHOOK=https://oapi.dingtalk.com/robot/send?access_token=你的token
DINGTALK_SECRET=
# 企业微信群机器人(可选)
WECOM_WEBHOOK=
# 任意 Webhook,飞书/Server酱/自建网关都能套(可选)
CUSTOM_WEBHOOK=
这三行就是"换个人也能用"的全部秘密:Key 和群地址都在这一个文件里,代码里不出现任何密钥。你在群里看到别人分享的配置,把
.env换成自己的就能跑。
第 4 步:改配置,然后启动
# 先用模拟行情跑通链路(不需要 Key,60 秒内一定能看到一次告警)
python -m app.main --simulate
# 再切到真实行情
python -m app.main
--simulate 这个开关很值得留着:它内置了一个随机游走的假行情源,每 60 秒制造一次急跌。先用它验证"告警能不能真的发到群里",再去接真实数据,这样出了问题你能立刻判断是策略配错了还是数据没来。
附:免费的这一周怎么花,到期之后怎么办
7 天听着不长,但按天排一下会发现刚好够:
| 时间 | 干什么 |
|---|---|
| 第 1 天 | 跑--simulate,把钉钉或企业微信打通,确认告警真能到手机 |
| 第 2~3 天 | 接真实标的,先只配 1~2 条策略,看触发频率是不是太吵 |
| 第 4~5 天 | 调阈值:window_sec、cooldown_sec 调到你不会想关群的程度 |
| 第 6~7 天 | 故意断一次网、关一次代理,验证看门狗和重连是不是真的会叫你 |
到期之后会怎样? 程序不会停,但上游会开始拒绝订阅和 REST 请求,日志里会出现 4002 / 4004 这类权限错误——这时候你的告警就失效了,只能看到看门狗在报"连接中断"。所以别等到断了才发现,提前一天决定:
- 重新注册一个账号,拿新的 7 天免费额度接着试。适合还在调策略、没决定要不要长期用的阶段——代码一行都不用改。
- 升一个小套餐。真打算 7×24 挂在云上,一个月的钱通常比漏掉一次插针便宜。
- 降级成 REST 轮询,拉长间隔凑合用。但这样就失去了实时性,这套工具的意义也就没了一大半,不太推荐。
换 Key 只要两步:
# 1) 改 .env 里的这一行
DEEPTICK_API_KEY=dt_新账号的Key
# 2) 重启进程(行情源配置不支持热加载,必须重启)
python -m app.main
策略文件、群机器人地址、你调了两天的阈值,全都不用动——当初把密钥单独抽到 .env 里,就是为了这一刻。
五、关键配置:改这几行就够
行情接入 config/config.yaml
source:
adapter: "deeptick" # deeptick | simulator
deeptick:
base_url: "//api.deeptick.cc" # REST 基址
ws_url: "wss://api.deeptick.cc/ws/v1" # WebSocket 地址
api_key: "${DEEPTICK_API_KEY}" # 从 .env 读,不写死在代码里
# 认证方式:REST 放请求头,WS 放握手头
auth_header: "deeptoken"
quote_path: "/api/v1/quote"
subscribe_type: "quote" # quote / tick / depth
ping_sec: 25 # 官方建议 <= 30s,60s 读空闲会被断开
idle_timeout_sec: 55 # 客户端判定"连接已死"的静默阈值
subscribe_batch: 100 # 单次 subscribe 最多 100 个主题
reconnect: # 断线重连:指数退避
min_sec: 1
max_sec: 60
factor: 2
jitter: 0.3 # 随机抖动,避免多进程同时重连打爆上游
# REST 兜底:WS 断了,也要有最后一口气
rest_fallback:
enabled: true
check_sec: 5
stale_after_sec: 15 # 超过 15 秒没推送,就去 REST 补
per_minute_limit: 60 # 按你的套餐改:免费15 / BASE30 / PRO60 / PREMIUM120
盯哪些标的
symbols:
- symbol: "ZECUSDT.CR"
name: "Zcash"
topic: "quote.CR.ZECUSDT" # 不写也行,会按 quote.{市场}.{代码} 自动推导
# 加标的就照这个格式往下写:
# - symbol: "AAPL.US"
# name: "苹果"
# - symbol: "600519.SH"
# name: "贵州茅台"
策略 config/strategies.yaml
策略是这个工具真正"属于你"的部分。三条我实际在用的:
defaults:
severity: "warning" # info | warning | critical
cooldown_sec: 300 # 同一策略同一标的,两次告警的最小间隔
repeat_sec: 0 # >0:条件持续满足就按间隔重复提醒;0 = 只提醒一次
notify: [] # 空 = 用 config.yaml 的默认通道
silence_windows: [] # 免打扰,如 ["23:30-08:00"]
strategies:
# 1) 五分钟急跌:短线下杀,我最常用的一条
- id: zec_drop_5m
name: "ZEC 5分钟急跌"
enabled: true
symbols: ["ZECUSDT.CR"]
severity: "critical"
when:
type: "change_pct"
window_sec: 300
op: "<="
value: -1.2
message: "5分钟跌幅 {change_pct:.2f}%,现价 {price:.2f},日内 {day_change_pct:+.2f}%"
cooldown_sec: 300
notify: ["dingtalk"]
# 2) 关键价位穿越:只在"穿过去的那一次"触发,不会一直重复响
- id: zec_break_1270
name: "ZEC 跌破 1270"
enabled: true
symbols: ["ZECUSDT.CR"]
severity: "critical"
when:
type: "price"
op: "cross_below" # cross_above / cross_below = 穿越才触发
value: 1270
message: "跌破 1270,现价 {price:.2f},日内 {day_change_pct:+.2f}%"
cooldown_sec: 600
# 3) 组合条件:急跌 + 已经破位,两个同时满足才值得吵你
- id: zec_breakdown_combo
name: "ZEC 放量破位"
enabled: false
symbols: ["ZECUSDT.CR"]
severity: "critical"
when:
all:
- type: "change_pct"
window_sec: 300
op: "<="
value: -1.5
- type: "price"
op: "<"
value: 1270
message: "5分钟 {change_pct:.2f}%,已跌破 1270,现价 {price:.2f}"
cooldown_sec: 600
能用的条件类型:price 最新价、change_pct 窗口涨跌幅、day_change_pct 当日涨跌、volatility_pct 窗口振幅、volume_delta 窗口成交量增量、stale_sec 距上次更新的秒数。
比较符支持 > >= < <= == !=,价格额外支持 cross_above / cross_below。组合用 all、any、not,可以任意嵌套——写策略基本等于写 YAML,不需要碰 Python。
告警发到哪
notify:
default_channels: ["console"]
channels:
console:
type: "console" # 只写日志,留痕用
dingtalk:
type: "dingtalk"
webhook: "${DINGTALK_WEBHOOK}"
secret: "${DINGTALK_SECRET}" # 群机器人选"加签"时必填
keyword: "DeepTick" # 选"自定义关键词"时填同一个词
at_mobiles: []
at_all: false
wecom:
type: "wecom"
webhook: "${WECOM_WEBHOOK}"
msgtype: "text" # text | markdown
custom: # 飞书、自建网关、Server酱都能套
type: "webhook"
url: "${CUSTOM_WEBHOOK}"
method: "POST"
headers:
Content-Type: "application/json"
body_template: '{"text": "{message}", "symbol": "{symbol}", "severity": "{severity}"}'
一个细节值得说:keyword 那行不是摆设。钉钉机器人如果选了"自定义关键词"校验,消息里没有这个词就直接被拒,还不给你明显报错。所以代码里做了兜底——推送前检查正文,缺了关键词就自动补在最前面。这种小地方,才是能不能长期无人值守的差别。
钉钉机器人怎么建(4 步,全程免费)

四个坑提前说清楚,能省你半小时:
- 必须选「自定义」,不要选 GitHub、GitLab、Jira 那些现成模板——它们发的是固定格式,接不了自己的消息。
- 关键词必须和配置文件里一模一样。你填
DeepTick,config.yaml里keyword: "DeepTick"就得一字不差(大小写敏感),否则钉钉静默拒收。 - 选了「加签」就不用填关键词,但要复制那串
SEC...开头的 secret 填进.env的DINGTALK_SECRET,代码会自动算时间戳签名。 - 一个群一个机器人。想同时推到两个群,就建两个机器人、再在
config.yaml里加一个通道(复制dingtalk那段改个名字即可),策略里notify: ["dingtalk", "dingtalk2"]就能双推。
建好之后,最稳妥的验证方式不是等策略触发,而是主动发一条:
# 先跑模拟行情,60 秒内必然有一次急跌告警,能到群就说明通道通了
python -m app.main --simulate --test-alert
定时汇总(可选,但很香)
digest:
enabled: true
interval_sec: 600 # 每 10 分钟推一条,对齐到 :00 :10 :20
channels: ["dingtalk", "console"]
silence_windows: ["22:00-08:00"] # 夜间免打扰,只掐汇总,策略告警照发
keyword: "DeepTick"
策略告警是"有事才响",汇总是"没事也报个平安"。半夜静音很关键——不然你会因为一堆无关紧要的定时消息,把整个群设成免打扰,结果真出事的那条也被淹了。
六、核心代码:它为什么能连着跑通宵
配置文件只是外壳,真正决定"能不能没人管"的是这三段。
1. WebSocket 会话:握手、订阅、心跳、静默判死
async def _ws_session(self, stop: asyncio.Event) -> None:
headers = {self.auth_header: self.api_key} # 认证走握手头 deeptoken
async with ws_connect(
self.ws_url,
additional_headers=headers,
ping_interval=None, # 心跳走业务层的 JSON ping,不用协议层
open_timeout=10,
close_timeout=5,
max_size=8 * 1024 * 1024,
) as ws:
try:
first = await asyncio.wait_for(ws.recv(), timeout=10)
except asyncio.TimeoutError as exc:
raise ConnectionError("握手后 10 秒没收到 welcome") from exc
self._handle_signal(first, initial=True) # welcome 里带 session 和心跳建议
self.connected = True
self.connected_since = time.time()
self.connect_events.append(self.connected_since)
await self._subscribe(ws) # 批量订阅 quote.{市场}.{代码}
ping_task = asyncio.create_task(self._ping_loop(ws), name="deeptick-ping")
try:
while not stop.is_set():
try:
raw = await asyncio.wait_for(ws.recv(), timeout=self.idle_timeout)
except asyncio.TimeoutError as exc:
# 关键:连接"看着还在"但没数据,主动判死重建
raise ConnectionError(
f"{self.idle_timeout:.0f} 秒没有收到任何数据,主动重建连接"
) from exc
await self._handle_message(raw)
finally:
ping_task.cancel()
await asyncio.gather(ping_task, return_exceptions=True)
这段里最要紧的是 idle_timeout_sec 那个 wait_for。TCP 连接经常是"半死"状态——socket 还在,但数据早就不来了。光靠协议层的心跳发现不了,必须自己数秒。
2. 断线重连:指数退避 + 抖动
delay = max(0.5, min(backoff, max_sec) * (1 + random.uniform(-jitter, jitter)))
self.log.info("计划 %.1f 秒后重连 WebSocket", delay)
try:
await asyncio.wait_for(stop.wait(), timeout=delay)
except asyncio.TimeoutError:
pass
backoff = min(backoff * factor, max_sec)
1 秒 → 2 → 4 → 8……封顶 60 秒,加 30% 抖动。抖动是必须的:如果你跑十个标的十个连接,上游挂了一下,没抖动的话它们会在同一毫秒一起重连,把服务端再打挂一次。
3. REST 兜底
WS 断了不意味着数据一定断。代码里有一条独立巡检:每 5 秒看一遍,哪个标的超过 15 秒没推送,就用 REST GET /api/v1/quote?symbols=XXX 单独补一次。频率受 per_minute_limit 控制,按套餐设。
这样 WebSocket 抖动的那几十秒里,你的策略依然在正常工作,只是数据源从"推"变成"拉"。
4. 看门狗:监控"监控本身"
# 1) 连接状态:断开超过阈值才报
threshold = float(self.cfg.get("watchdog.disconnect.alert_after_sec", 30))
if self.feed.connected:
self._evaluate("feed_down", False, recovery="行情连接已恢复")
else:
down_sec = now - (self.feed.disconnected_at or self._started)
self._evaluate(
"feed_down",
down_sec >= threshold,
severity="critical",
title="行情连接中断",
summary=f"行情连接已断开 {down_sec:.0f} 秒",
)
# 2) 重连风暴:5 分钟内重连超过 5 次 = 连接不稳定
window = float(self.cfg.get("watchdog.reconnect.window_sec", 300))
max_count = int(self.cfg.get("watchdog.reconnect.max_count", 5))
recent = [ts for ts in self.feed.connect_events if now - ts <= window]
self._evaluate(
"reconnect_storm",
len(recent) > max_count,
severity="warning",
title="行情连接不稳定",
summary=f"{window:.0f} 秒内重连 {len(recent)} 次",
)
而且它做了防抖和恢复通知:连续 2 次异常才报警,连续 2 次正常才发"已恢复"。不然网络抖一下你能收到十几条消息,最后你把群静音了,这才是真正的失守。
还有个细节:watchdog.trading_windows 可以设交易时段,休市期间不检查"行情是否跳动",避免周末被"数据停摆"误报吵醒。
七、跑起来是什么样
钉钉群里收到的告警
【行情严重预警】ZEC 5分钟急跌
5分钟跌幅 -1.87%,现价 1262.33,日内 -5.12%
标的: ZECUSDT.CR Zcash
现价: 1262.33 来源: deeptick
时间: 2026-11-05 02:14:37
每 10 分钟一条的汇总
DeepTick 行情汇总 11:20
——————————————————
Zcash · ZECUSDT.CR
现价 1,332.91 | 日内 +1.77%
近10分钟 -0.42% | 10分钟量 +1234.50
日内 高 1,388.00 / 低 1,247.83 | 位置 61%
——————————————————
链路 deeptick 已连接 | 延迟 2.5s | 45 条/分
看门狗 正常
数据来源 deepTick,每 10 分钟自动汇总
终端里的走势(不想开网页的时候)
python tools/trend.py # 打一次
python tools/trend.py -n 5 # 每 5 秒刷新
FORCE_COLOR=1 python tools/trend.py > snap.txt # 重定向到文件也保留红绿配色

一次输出给了四层信息:顶部是现价、日内涨跌、高低开和日内分位;中间是 1 分钟 / 15 分钟 / 1 小时 / 日线四条 sparkline,同一屏就能看出"短期在跌、中期还在涨"这种矛盾;再往下是最近 8 根 K 线明细;最后两行是程序按均线关系算出的走势判断(是描述,不是预测)。
实时曲线页
python tools/live_chart.py # 起本地服务,自动开浏览器
顶栏现价 + 日内涨跌 + 六格统计(高/低/开/昨收/量/额),主图是 1 分钟收盘价面积曲线叠 MA5、MA20,副图成交量柱,右上角一个状态灯实时显示延迟、每分钟条数、连接状态——就是本文开头那张图。周期按钮可切 1 分 / 5 分 / 15 分 / 1 小时 / 日线,切一次拉一次对应 K 线,服务端缓存 15 秒,不会撞上游限频。
注意这里 Key 是放在服务端读的,前端页面只拿已经算好的 JSON。不把 Key 写进 JS 里,是自建工具最基本的一条。
八、三个真实场景
场景 1:币圈 7×24。
配置里 interval_sec: 600 加 silence_windows: ["22:00-08:00"],白天每 10 分钟一条汇总,夜里只保留"5 分钟急跌 -1.5%"这类硬告警。睡觉的时候不会被平安消息吵醒,但真砸盘会响。
场景 2:A 股 / 美股日内。
watchdog.trading_windows: ["09:15-15:10", "21:30-04:00"],非交易时段不检查"数据是否跳动",避免中午休市和周末误报。策略主用 volatility_pct(窗口振幅)而不是 change_pct——A 股涨跌停板附近波动小但振幅大,振幅指标更敏感。
场景 3:期货夜盘。
夜盘最大的问题是熬夜。把关键价位设成 cross_above / cross_below,只在穿越那一刻响一次,配合 cooldown_sec: 600,一晚上最多吵你两次,但不会漏。剩下的交给早上看汇总。
九、实测数据
| 项目 | 实测值 |
|---|---|
| 单标的推送频率 | 45~66 条/分钟(WS) |
| 端到端延迟 | 0.5~3 秒(含上游推送节奏) |
| 断线重连 | 1s → 2s → 4s 指数退避,实测无消息丢失窗口 |
| 看门狗误报 | 连续 2 次异常才报,演练中零抖动刷屏 |
| 配置热加载 | 策略/通道改完保存,5 秒内生效,不用重启 |
| 静态内存占用 | 单标的采样上限 6000 点(约 50 分钟),自动滚动清理 |
十、适合谁,不适合谁
适合:
- 有明确价位判断、但没法一直盯屏的人
- 想把自己的规则固化成纪律,而不是盘中临时拍脑袋的人
- 会改 YAML 就行,不需要写代码
- 想给自己现有的数据源加一层告警,而不是换掉整套系统
不适合:
- 想要"自动下单"的——这不是交易机器人,它只负责看和喊。下单要自己做,或者另接一套。
- 想要"预测涨跌"的——它不认识行情,只认识你写的阈值。
- 完全不想配置的——虽然只要改三个地方,但终究得自己填 Key 和群地址。
十一、FAQ
Q:非白名单标的订阅返回 4004 怎么办?
先用 REST 验证权限:curl -H "deeptoken: $KEY" "//api.deeptick.cc/api/v1/quote?symbols=BTCUSDT.CR"。REST 通但 WS 拒,通常是套餐的订阅标的数限制,升配或在控制台开通对应市场。
Q:一周免费额度够试出效果吗?
够。1~3 个标的、十分钟级汇总加几条急跌告警,一天就能跑明白。唯一要立刻改的是 rest_fallback.per_minute_limit,改成 15(免费档的限频),否则断线兜底那几分钟会撞限频。
Q:额度到期了,我调好的策略会丢吗?
不会。策略全在本地 strategies.yaml 里,跟账号没关系。换个 Key 重启就接着跑,阈值、冷却、免打扰时段一个字都不用重配。
Q:能同时盯几个标的?
配置上不封顶,但单连接主题数上限 400(代码里超过会报错提示)。实际瓶颈是你的套餐和 REST 限频。十个标的以内,一个进程绰绰有余。
Q:服务器要什么配置?
一台 1 核 1G 的小机器就够,纯 Python 异步,CPU 基本闲着。跑在本地也行,只是关电脑就断了——真要 7×24,还是扔到云上。
Q:数据存多久?
默认只存内存里最近 50 分钟(6000 个采样点),进程重启即清空。要落库做回测,得自己接 ClickHouse / TimescaleDB,这套没做。
最后
工具的价值不在于写得多复杂,而在于你睡觉的时候它还在值班。
这套东西一共 12 个文件、约 3700 行 Python,配置文件是主体,代码只是把配置翻译成动作。你要做的只有三件事:填 Key、写标的、写阈值。剩下的断线、重连、去重、防抖、免打扰,都已经处理好了, 全部由deepSeek AI完成,如果需要改策略和方案可以直接本地修改运行测试,谁用谁知道;
# 三步开始,全程零成本
pip install -r requirements.txt
cp .env.example .env # 填入 DEEPTICK_API_KEY 和群机器人地址
python -m app.main --simulate # 先跑模拟,再换真实行情
本文代码全部可运行,已在 Windows + Python 3.13 实测通过;策略引擎带单元测试(python tests/test_engine.py)。

