免费工:不盯盘也能抓住插针,这套行情哨兵改 3 个地方就能用

用户头像mx_****08999
2026-11-07 发布

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

788ae06186aadbaeaf24a00cc4c4685f.png

先看结果:这是程序实际跑起来的界面。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/,用邀请链接注册的话,把它替换成你自己的。)

0c92e138aa234d65e8132aa0e60d72ae.png

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

df495c2fa19aafd0ca6e9a50899e0197.png

红框里就是你要复制的东西。顺手看一眼"到期时间"——免费额度到期后这串 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 这类权限错误——这时候你的告警就失效了,只能看到看门狗在报"连接中断"。所以别等到断了才发现,提前一天决定:

  1. 重新注册一个账号,拿新的 7 天免费额度接着试。适合还在调策略、没决定要不要长期用的阶段——代码一行都不用改。
  2. 升一个小套餐。真打算 7×24 挂在云上,一个月的钱通常比漏掉一次插针便宜。
  3. 降级成 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 步,全程免费)

3151a49e023c80544d082bfe2efb0a35.png

四个坑提前说清楚,能省你半小时:

  1. 必须选「自定义」,不要选 GitHub、GitLab、Jira 那些现成模板——它们发的是固定格式,接不了自己的消息。
  2. 关键词必须和配置文件里一模一样。你填 DeepTick,config.yaml 里 keyword: "DeepTick" 就得一字不差(大小写敏感),否则钉钉静默拒收。
  3. 选了「加签」就不用填关键词,但要复制那串 SEC... 开头的 secret 填进 .env 的 DINGTALK_SECRET,代码会自动算时间戳签名。
  4. 一个群一个机器人。想同时推到两个群,就建两个机器人、再在 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   # 重定向到文件也保留红绿配色

e449054746a889f27b7ac1e870044a2e.png

一次输出给了四层信息:顶部是现价、日内涨跌、高低开和日内分位;中间是 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)。

评论