{{ kline.name || ('HK.' + market.code) }} HK.{{ market.code }}
共 {{ kline.count }} 条 · {{ klineRange }}
加载 K 线中…
数据明细
| 日期 | 开 | 高 | 低 | 收 | 成交量 | 成交额 |
|---|---|---|---|---|---|---|
| {{ row.datetime }} | {{ fmt(row.open) }} | {{ fmt(row.high) }} | {{ fmt(row.low) }} | {{ fmt(row.close) }} | {{ fmtInt(row.volume) }} | {{ fmtInt(row.turnover) }} |
请选择左侧的股票或指数
支持查看「全部标的」或「按配置」下的历史行情,可切换日 / 周 / 月线。
获取行情数据
调用 fetch_market_data.py,从数据源抓取股票 / 指数行情并写入数据目录。
任务运行中…
执行输出 / 操作记录
{{ statusText(current.status) }}
{{ current.command }}
{{ current.output || '等待输出…' }}
暂无执行记录,点击「开始获取」运行一次任务。
操作记录
| 时间 | 标题 | 状态 | 耗时 | |
|---|---|---|---|---|
| {{ t.started_at }} | {{ t.title }} | {{ statusText(t.status) }} | {{ fmtDur(t.duration_ms) }} | |
| 暂无记录 | ||||
生成对比网页
调用 deploy_web.py,按 configs 逐个生成交互式 HTML 到输出目录,并生成导航首页。
留空则使用默认目录。生成完成后,输出目录下的 index.html 即为导航页。
任务运行中…
执行输出 / 操作记录
{{ statusText(current.status) }}
{{ current.command }}
{{ current.output || '等待输出…' }}
操作记录
| 时间 | 标题 | 状态 | 耗时 | |
|---|---|---|---|---|
| {{ t.started_at }} | {{ t.title }} | {{ statusText(t.status) }} | {{ fmtDur(t.duration_ms) }} | |
| 暂无记录 | ||||
港股交易日判断
依据港交所公众假期表:港股交易日 = 非周六日 且 非公众假期(半日市仍为交易日)。
{{ trading.result.is_trading_day ? '交易日' : '非交易日' }}
{{ trading.result.date }} {{ trading.result.weekday }}
{{ trading.result.reason }}
半日市:{{ trading.result.half_day_note }}(12:00 收市)
⚠ 该年份不在内置假期表中,结果可能不准
{{ !trading.online.ok ? '在线佐证失败' : (trading.online.agree === false ? '结论不一致' : '在线一致') }}
{{ trading.online.note || trading.online.error }}
邻近交易日
过去
{{ d }}
未来
{{ d }}
交易日历
交易日
周末
公众假期
半日市
本月交易日 {{ calendar.trading_count }} 天 · 公众假期 {{ calendar.holiday_count }} 天 · 半日市 {{ calendar.half_day_count }} 天
({{ calendar.year }} 年不在内置假期表中)
{{ w }}
{{ c.day }}
假
半
加载日历中…
每日定时任务
每个港股交易日固定时刻自动执行:判断是否交易日 → 抓取股票与指数行情 → 生成静态页面。
运行状态
| 启用状态 | {{ schedule.status.enabled ? '已启用' : '未启用' }} |
|---|---|
| 调度线程 | {{ schedule.status.thread_alive ? '运行中' : '未运行' }} 上次检查 {{ schedule.status.last_checked_at || '—' }} |
| 执行时刻 | {{ schedule.status.run_time }}(每 {{ schedule.status.poll_seconds }} 秒轮询) |
| 下一次到点 | {{ schedule.status.next_run_at || '—' }} |
| 下一次实际执行 | {{ schedule.status.next_trading_run_at || '—' }} (自动跳过非交易日) |
| 上次处理日期 | {{ schedule.status.last_handled_date || '—' }} |
| 上次触发时间 | {{ schedule.status.last_run_at || '—' }} |
| 上次跳过原因 | {{ schedule.status.last_skip_reason || '—' }} |
今日(港股)
{{ schedule.status.today.is_trading_day ? '交易日' : '非交易日' }}
{{ schedule.status.today.date }} {{ schedule.status.today.weekday }} · {{ schedule.status.today.reason }}
流水线执行输出 / 操作记录
{{ statusText(schedule.run.status) }}
{{ groupStageText(schedule.run) }}
数据获取
{{ statusText(schedule.run.fetch.status) }}
等待中…
{{ schedule.run.fetch.started_at }} · {{ fmtDur(schedule.run.fetch.duration_ms) }}
网页生成
{{ statusText(schedule.run.deploy.status) }}
等待中…
{{ schedule.run.deploy.started_at }} · {{ fmtDur(schedule.run.deploy.duration_ms) }}
{{ pipelineOutput(schedule.run) }}
暂无运行中的流水线,可点击「立即运行」或等待定时触发。
流水线记录(数据获取 / 网页生成)
| 时间 | 触发 | 数据获取 | 网页生成 | 总状态 | |
|---|---|---|---|---|---|
| {{ g.created_at }} | {{ triggerText(g.trigger) }} | {{ statusText(g.fetch.status) }} — {{ fmtDur(g.fetch.duration_ms) }} | {{ statusText(g.deploy.status) }} — {{ fmtDur(g.deploy.duration_ms) }} | {{ statusText(g.status) }} | |
| 暂无记录 | |||||
手动添加港股交易日数据
指定港股交易日区间,补抓历史 / 后续行情并重新生成静态页面。执行流程为 数据获取 → 网页生成,两步各自独立记录,可在「定时任务」页追溯。
参数校验通过
{{ backfill.preview.params.start }} ~ {{ backfill.preview.params.end }}
| 区间交易日 | {{ backfill.preview.calendar.days == null ? '—' : backfill.preview.calendar.days }} 天 ({{ backfill.preview.calendar.first_trading }} ~ {{ backfill.preview.calendar.last_trading }}) |
|---|---|
| 网页输出目录 | {{ backfill.preview.params.webroot }} |
⚠ {{ w }}
任务运行中…
点击「开始补数」后会弹出确认框,确认无误后再执行。
补数进度 / 结果
{{ statusText(backfill.run.status) }}
{{ groupStageText(backfill.run) }}
数据获取
{{ statusText(backfill.run.fetch.status) }}
等待中…
{{ backfill.run.fetch.started_at }} · {{ fmtDur(backfill.run.fetch.duration_ms) }}
网页生成
{{ statusText(backfill.run.deploy.status) }}
等待中…
{{ backfill.run.deploy.started_at }} · {{ fmtDur(backfill.run.deploy.duration_ms) }}
数据获取:{{ backfill.run.fetch.message }}
网页生成:{{ backfill.run.deploy.message }}
{{ pipelineOutput(backfill.run) }}
尚未启动补数。填写日期区间 → 校验预览 → 开始补数。
用户管理
| 用户名 | 昵称 | 邮箱 | 手机 | 角色 | 状态 | 最近登录 | 操作 | |
|---|---|---|---|---|---|---|---|---|
| {{ u.username }} | {{ u.nickname || '—' }} | {{ u.email || '—' }} | {{ u.phone || '—' }} | {{ roleName(u.role) }} | {{ userStatusText(u.status) }} | {{ u.last_login_at || '—' }} | ||
| {{ users.loading ? '加载中…' : '暂无用户' }} | ||||||||
共 {{ users.total }} 条 · 第 {{ users.page }} / {{ userPages }} 页
角色与权限
权限粒度可自定义:勾选权限项即可为角色授予细粒度访问权;内置角色可调整权限但不可删除。
| 标识 | 名称 | 说明 | 权限数 | 类型 | 操作 |
|---|---|---|---|---|---|
{{ r.code }} |
{{ r.name }} | {{ r.description || '—' }} | {{ permCount(r) }} (全部) | {{ r.builtin ? '内置' : '自定义' }} | |
| 暂无角色 | |||||
操作日志
| 时间 | 操作人 | 动作 | 目标 | 详情 | 结果 | IP |
|---|---|---|---|---|---|---|
| {{ a.created_at }} | {{ a.operator_name || '—' }} | {{ actionText(a.action) }} | {{ a.target_type || '—' }}{{ a.target_id ? '#' + a.target_id : '' }} | {{ a.detail || '—' }} | {{ a.result === 'success' ? '成功' : '失败' }} | {{ a.client_ip || '—' }} |
| {{ audit.loading ? '加载中…' : '暂无日志' }} | ||||||
共 {{ audit.total }} 条 · 第 {{ audit.page }} / {{ auditPages }} 页
使用指南
一、行情数据查看
- 左侧可切换「全部标的」或「按配置查看」;「按配置查看」会列出该配置下的成分股与基准指数。
- 点击任一标的,右侧展示交互式 K 线图(蜡烛图 + 成交量),支持缩放、拖动。
- 可切换 日线 / 周线 / 月线;下方「数据明细」表支持分页浏览。
- 数据来自数据目录;若某标的无数据,请先到「数据获取」页抓取。
二、行情数据获取
- 选择抓取范围:
- 选择配置:保留每个配置自身的
start_date作为起始时间(推荐)。 - 指定代码:手动输入代码,可用
--start覆盖起始时间。 - 全部配置:抓取 configs 下所有配置涉及的标的。
- 选择配置:保留每个配置自身的
- 选择周期与数据源。自动选择会优先探测东方财富,失败则回退新浪;恒生综合指数 800701–800713 优先走恒生官方 API。
- 点击「开始获取」,执行过程实时输出到右侧;每次执行都会在下方「操作记录」中留下档案。
- 运行中可点击「停止」中断任务。
三、生成对比网页
- 填写输出目录(留空使用默认
{{ help.webroot }})。 - 点击「开始生成」,系统会逐个配置生成 HTML 并写入导航首页。
- 完成后打开输出目录中的
index.html即可浏览全部图表。
四、港股交易日
- 判断规则:港股交易日 = 非周六日 且 非公众假期;半日市仍计入交易日。
- 在「港股交易日」页选择日期后点击「判断该日」,可查看该日结果、原因与是否半日市。
- 「在线佐证」会调用恒生官网实时数据交叉验证(需外网,失败不影响本地判断)。
- 右侧「交易日历」按周(周一为第一列)展示整月,可切换月份;绿底 为交易日、 红底 为公众假期、橙底为半日市;点击某日即可判断。
- 「邻近交易日」列出前后各 5 个交易日,便于快速定位。
五、每日定时任务
- 每个港股交易日固定时刻自动执行「判断是否交易日 → 抓取股票与指数行情 → 生成静态页面」流水线。
- 在「定时任务」页开启开关并设置执行时刻(默认
{{ (help.trading && help.trading.default_run_time) || '17:00' }}),保存后立即生效,无需等待下一轮询周期。 - 后端每
{{ help.trading && help.trading.poll_seconds }}秒轮询一次;到点且当天为交易日才触发,非交易日自动跳过并记录原因。 - 可点「立即运行(按交易日)」;「强制运行」则忽略交易日判断直接执行(便于测试)。
- 「下一次实际执行」会自动跳过非交易日,展示真正会触发的日期。
- 流水线由后端编排为「数据获取」与「网页生成」两条独立操作记录,各自记录开始/结束时间、状态、耗时与异常信息,通过分组 id 关联,可在「流水线记录」表中查看两步状态并追溯日志。
六、手动补数
- 在「手动补数」页指定起始与结束日期(港股交易日区间),点击「校验并预览」进行参数校验。
- 预览会显示区间内港股交易日天数、网页输出目录,并对未覆盖年份等给出告警。
- 点击「开始补数」会弹出确认框;确认后依次执行「数据获取 → 网页生成」,右侧实时展示进度与结果。
- 运行中可查看两步各自的日志;数据获取被手动停止时不会继续生成网页。
操作记录说明
- 记录保存在 SQLite 数据库
webapp/data/webapp.db,包含参数、命令行、状态、耗时与完整输出。 - 状态:运行中 成功 失败 已停止
- 完整日志另存于
webapp/data/logs/op_<id>.log。
环境与路径
| 数据根目录 | {{ help.data_root }} |
|---|---|
| 配置目录 | {{ help.config_dir }} |
| 网页输出 | {{ help.webroot }} |
| 可用周期 | {{ k.label }} |
常见问题
- 抓取失败:多为网络/数据源限制,可更换「数据源」或稍后重试。
- 某指数无数据:800701–800713 依赖恒生官方 API,需可访问外网。
- 查看不到数据:确认数据目录正确(环境变量
STOCK_DB_ROOT),并先执行一次获取。