特征定义查询
GET /api/indicators/signals 返回按指标分组的特征定义:有哪些特征、判断规则、含义和有效条件。 它不返回某个标的当前是否发生了特征,也不返回买卖建议。
Base URL:https://api.mobiusquant.ai。沿用普通 API 的可选 Bearer Token 与限流规则,不需要管理员账号。
请求
# 全部指标,包括没有独立特征的指标及原因
curl 'https://api.mobiusquant.ai/api/indicators/signals'
# MACD 的全部特征
curl 'https://api.mobiusquant.ai/api/indicators/signals?indicator=macd'
# MACD 的事件特征,不包含持续状态
curl 'https://api.mobiusquant.ai/api/indicators/signals?indicator=macd&kind=event'
# 单个特征的定义
curl 'https://api.mobiusquant.ai/api/indicators/signals?id=macd.cross_up'| 参数 | 类型 | 必填 | 含义 |
|---|---|---|---|
indicator | string | 否 | 精确指标名,与 calc[].name 相同,例如 macd;不带则查询全部指标 |
kind | event / state | 否 | 只返回事件或状态;不带则包含两类 |
id | string | 否 | 完整特征 ID,例如 macd.cross_up |
名称与 ID 区分大小写,不接受模糊匹配。多个条件按 AND 组合;同时传入 indicator 和 id 时,ID 必须属于该指标。
- 不传
kind、id:保留没有独立特征的指标,返回原因及signals: []。 - 传入
kind或id:仅保留具有匹配特征的指标组。 - 合法条件无匹配:返回
200,内容为{"count":0,"signal_count":0,"indicators":{}}。例如indicator=cvd&kind=state。 - 空字符串不是省略参数;空值返回
422。
响应
查询 ?id=macd.cross_up:
{
"count": 1,
"signal_count": 1,
"indicators": {
"macd": {
"has_signals": true,
"signal_status": "supported",
"signal_reason": "",
"signals": [
{
"id": "macd.cross_up",
"label": "MACD 金叉",
"kind": "event",
"description": "前根 MACD <= Signal,本根 MACD > Signal。",
"meaning": "MACD 相对信号线或零轴的动量关系;事件只在交叉根出现,状态可持续,不是买卖指令。",
"required_history": "max(fast, slow) + signal 根连续有效输入",
"version": 1,
"details": [],
"supports_forming": true
}
]
}
}
}分组字段
| 字段 | 含义 |
|---|---|
count | 筛选后返回的指标组数量 |
signal_count | 筛选后返回的特征总数 |
indicators | 以指标名为 key 的对象;按 key 读取,不依赖顺序 |
has_signals | 该指标是否提供特征输出,不代表当前行情数据已满足计算条件 |
signal_status | supported:提供特征;none:没有独立特征;unreviewed:尚无特征能力结论 |
signal_reason | 不提供特征的原因;支持特征时为空字符串 |
signals | 匹配的定义列表,不是计算结果;无特征时为空数组 |
不应将 none 与 unreviewed 混为一谈,也不应把按类型筛选得到的空结果理解为“该指标没有任何特征”。
特征字段
| 字段 | 类型 | 含义 |
|---|---|---|
id | string | 稳定特征标识,与计算结果列名、图表标记的 signal_ids 一致 |
label | string | 展示名称 |
kind | string | event:只在发生柱成立;state:逐根判断,可连续成立 |
description | string | 判定规则,参数取实际计算请求值 |
meaning | string | 特征所代表的含义 |
required_history | string | 历史长度与有效性要求;可能含参数公式,不是固定整数 |
version | integer | 该特征定义的版本 |
details | string[] | 额外边界条件或确认要求;没有时为空数组 |
supports_forming | boolean | 是否支持 include_forming: true 末根试算;不代表当前输入足够判断 |
名称及规则说明当前使用中文,ID 与枚举值不随语言变化。计算参数、默认值及指标周期限制通过 GET /api/indicators/registry 查询。 GET /api/indicators/registry?include_signals=true 仍可获取简版特征定义。
与计算、绘图结合
- 查询本接口,按
indicator和id选择需要的特征。 - 向
/api/indicators或/api/indicators/compute发送计算请求,顶层设置"signals": true。 - 用定义的
id查找indicators[响应key].signals.columns,再读取data中对应列。
绘图时,向 /api/chart 设置 "signals": true。特征表位于 indicator_signals[响应key]; 事件标记中的 signal_ids 可关联本接口的名称、规则和含义。状态不逐根生成事件标记。 同一指标使用多组参数时,用响应 key/indicator_key 区分实例;特征 ID 不会因参数改变。 查询参数 id 是特征 ID,不是计算请求中自定义的 calc[].id。
特征定义与实际数据可判断性不同。默认模式下:
| 计算结果 | 含义 |
|---|---|
true | 已收盘 K 线上的事件发生,或状态成立 |
false | 数据可判断,但事件未发生或状态不成立 |
null | 未收盘、历史不足、依赖值无效或输入存在缺口,不能可靠判断 |
实时特征支持 Binance、Bybit、OKX、Hyperliquid 已接入行情,包含币安股票永续,不包含股票现货。BYO 必须提供 interval 和连续、固定时长的 K 线,并满足所选指标的限制。 末根未收盘时设置 last_bar_closed: false。输入出现周期缺口或无效 OHLCV 后,本次输入后续特征为 null。 open_time、confirmed_at_ms 为毫秒,图表标记 time 为秒;确认时间存在不代表该根一定触发了事件。 没有特征能力的指标在计算中返回整个 signals: null,不同于目录中的 signals: []。
盘中特征试算
在 /api/indicators、/api/indicators/compute 或 /api/chart 请求顶层,同时设置 signals: true 和 include_forming: true。include_forming 默认为 false,只接受 JSON 布尔值; 未开启 signals 时使用该选项返回 422。
curl -X POST 'https://api.mobiusquant.ai/api/indicators?explain=false' \
-H 'Content-Type: application/json' \
-d '{"exchange":"binance","market":"perp","symbol":"BTCUSDT","interval":"5m","limit":2,"signals":true,"include_forming":true,"calc":[{"name":"macd","id":"m"}]}'引擎将最后一根尚未收盘 K 线的当前实际 OHLCV 当作完整样本,按原算法计算。 不预测最终收盘值,不补足不存在的后续 K 线;历史长度、输入连续性、原生阈值和模型确认条件不变。 金叉等前后关系仍比较相邻 K 线,不比较前后两次请求。同一根重复请求不会累计确认次数或去重。
仍然只返回一套结果:计算接口读 indicators[key].signals,绘图接口读 indicator_signals[key]。 信号表在已有列末尾追加 bar_status,请按列名读取:
| bar_status | 含义 | confirmed_at_ms |
|---|---|---|
closed | 收盘计算结果 | 原有按周期计算的收盘时间 |
forming | 未收盘末根的当前快照试算 | 始终为 null |
true 表示当前条件成立,可用于盘中预警;false 表示当前条件不成立;null 仍表示依赖不足等不可判断。 盘中特征可以在下一次更新或收盘时消失,不能当作已确认事件。 数值、特征、原因及原生对象来自同次计算。 例如 CVD 背离 ID 含 confirmed 不代表实际收盘,应读取 bar_status 和对象 status。 CVD 在试算模式使用 objects.schema_version=2,盘中背离对象为 status=forming、confirmed_at_ms=null。
BYO 请求仍需如实传 last_bar_closed: false,并提供 interval;可以使用历史时点的盘中快照。 之前各根必须已收盘,不得把多根未收盘数据交给此选项。输入已全部收盘时,各行均为 closed。 实时最新查询缺少当前形成中的 K 线时返回 503 和 Retry-After;显式历史窗口不会被上一根冒充盘中结果。 该模式不提供历史盘中快照回放,也不额外保证数据源终态完整性;calculation.as_of_ms 不是上游数据观察时间。
/api/chart 使用同一计算方式,事件标记增加相同的 bar_status,盘中标记确认时间为空; 不增加颜色规则或专用图元。include 的原因和属性关联选项仍然可用; calculation 在本模式额外包含 include_forming=true、signal_evaluation_version=1。 结构化定义的 limits.live_features.supports_forming 与特征目录声明支持情况;不支持时末根特征为 null, 开启原因信息后可读 forming_not_supported。没有原生特征的指标仍返回 signals: null。
省略或设置 include_forming: false 时,旧数值、对象、特征及图表行为不变,也不增加 bar_status 列。 预警记录、盘中与收盘结果关联、通知、去重和冷却由消费端负责。
单次计算的可选信息
计算和绘图请求可以通过顶层 include 选择附加信息。省略或传 [] 时不附加这些字段, 现有数值、特征和图表协议保持不变。
{
"exchange": "binance",
"market": "perp",
"symbol": "BTCUSDT",
"interval": "5m",
"limit": 100,
"calc": [
{"name": "macd", "id": "macd"},
{"name": "cvd", "id": "cvd"},
{"name": "hmm_regime", "id": "hmm"}
],
"signals": true,
"include": ["signal_reasons", "signal_details", "calculation", "definition"]
}向 /api/indicators?explain=false 或 /api/chart 发送上述请求;BYO 使用同样的选项。 include 为可选值数组,不接受重复项或未知值。signal_reasons 和 signal_details 必须同时开启 signals: true,否则返回 422;calculation 和 definition 可独立使用。
| 选项 | 计算响应中的位置 | 图表响应中的位置 |
|---|---|---|
signal_reasons | indicators[key].signals.invalid_reasons | indicator_signals[key].invalid_reasons |
signal_details | indicators[key].signals.details | indicator_signals[key].details |
calculation | indicators[key].calculation | indicator_calculations[key] |
definition | indicators[key].definition | indicator_definitions[key] |
无独立特征的指标仍返回整个 signals: null,不为其制造原因或事件。
不可判断原因
invalid_reasons 采用 {columns, data},第一列为毫秒 open_time,其余列为特征 ID。 它只保留至少有一个特征为 null 的行:不可判断的单元格为原因码数组,可判断的单元格为 null。 这里单元格的 null 表示“没有不可判断原因”,不取代原 signals.data 中的三态值。 没有不可判断行时,data 为空数组。
| 原因码 | 含义 |
|---|---|
bar_not_closed | 所需 K 线尚未收盘 |
insufficient_history | 未满足该特征的历史长度,或缺少所需前值 |
input_gap | 本次计算输入存在周期缺口,影响当前判断 |
invalid_input | 本次输入存在无效 OHLCV,影响当前判断 |
invalid_dependency | 依赖数值、成交量条件或原生对象不可用 |
state_unavailable | 尚无该特征要求的有效方向或状态 |
not_applicable | 当前不满足该特征的适用前提,例如 HMM 已切换方向,不判断原方向的支持恢复 |
原因按特征、按 K 线提供,可同时出现多个;事件还可能受前一根的有效性影响。 例如同一根 RSI 的超买状态可以判断,而进入超买区事件仍缺少有效前值。 此选项解释已有 null,不改变其判断结果。BYO 请求中的 NaN/inf 仍在输入校验时被拒绝, 不会因为开启原因说明而放宽输入要求。
原生数值与对象关联
details.bindings 以特征 ID 为 key,说明如何读取该次计算已有的属性。
values[]:每项含field和offset。offset=0为信号所在柱,-1为前一根输入柱。objects:含collection、match、id_field、fields和响应内的container; 图表还提供实际object_key,不要假设它一定等于指标名。context:{columns, data},仅补充同一响应中无法直接读取的必要数值行。时间仍为毫秒。
当前 MACD、RSI、CVD、HMM 提供显式关联。其他指标未声明额外属性关联时, bindings 为空对象,context.data 为空数组;这不影响其特征输出能力。
CVD 按同一实例的 confirmation_bar_time_ms = 信号 open_time 和背离方向匹配 objects.divergences,读取已有 id、strength、start/end、confirmed_at_ms。 图表从 indicator_objects[object_key].divergences 读取。强度不会再复制一份到信号中; 对象 ID 是结果关联,不是通知去重保证。
HMM 的方向变化关联前后两根 hmm_state 或 hmm_context_state;支持变化还关联 hmm_supported。计算接口已返回的数值行不会重复放入 context,但窗口外必要前值会补入。 图表没有完整数值表,因此 context 提供触发事件或成立状态涉及的必要字段。 先按绑定读取同一响应中的数值或 context,不要另发一次请求取前值。
计算元信息
每个指标实例分别返回:
| 字段 | 含义 |
|---|---|
algorithm_version | 当前指标算法版本,不是部署版本 |
effective_params | 补齐默认值后的实际调用参数 |
resolved | 自动选择的实际模式;HMM 的 normalization=auto 会解析为 d1 或 legacy |
signal_versions | 特征 ID 到定义版本的映射;无特征时为空对象 |
input | 实际计算输入的 start_open_time_ms、end_open_time_ms、bars |
output | 本次返回窗口的同名范围字段,可能比输入短 |
interval_ms | 计算上下文的周期时长;未提供时为 null |
as_of_ms | 实时判断使用的截止时刻;BYO 通常为 null |
last_bar_closed | 实际输入末根是否已收盘;BYO 使用调用方声明 |
范围端点均为 K 线开盘毫秒时间,空范围端点为 null、根数为 0。 实际输入范围不承诺连续或已经满足预热条件,也不代表行情永久不变。 相同参数、版本和范围不能替代对原始行情数据的保存;历史修订可能改变结果。 版本的保存、变化检测和迁移由消费端负责。
结构化指标定义
在现有注册表查询中开启结构化定义:
GET /api/indicators/registry?include_schema=true每个指标增加 definition,包含 parameters、outputs、limits、 algorithm_version、effective_params、resolved、signal_versions 和 signal_value_bindings。 它不读取行情,也不返回某个标的的特征值。
按实际参数解析动态字段时使用:
POST /api/indicators/registry/resolve
Content-Type: application/json{
"interval": "4h",
"calc": [
{"name": "ema", "params": {"period": 50}, "id": "ema50"},
{"name": "hmm_regime", "id": "hmm"}
]
}返回 {count, indicators},以计算响应 key 分组:EMA 的输出字段解析为 ema_50, HMM 的实际归一化解析为 legacy。不需要提供 K 线;interval 可选,不提供时不解析依赖周期的自动模式。 calc 最多 100 项,同名同参数多实例仍需用不同 id 消歧。
parameters:参数名为 key,包含声明类型、默认值、是否必填、是否可为空及constraints。constraints提供已明确声明的上下界、枚举或条件要求;validation=native表示仍沿用指标原有校验。parameter_constraints_complete=false:参数约束尚未完整声明,空约束不能理解为接受任意值。 解析成功只表示已声明条件通过,不承诺任意输入行情都能计算成功,不改变原有参数校验规则。outputs[]:字段name/type/nullable/unit,部分字段还含上下界、说明和enum的取值含义。 动态列名随参数解析,不应把默认ema_20写死。unit=price沿用输入行情价格单位,input_volume沿用输入成交量单位;unix_ms为毫秒时间,category为枚举,model_weight不是校准预测概率。limits:指标支持的周期、实时周期、资产类别、成交量要求、受限 venue 及实时特征市场。 周期或资产列表为null表示未追加指标专属限制,仍须通过/api/markets、/api/intervals检查具体 venue;不表示任意市场都提供数据。unsupported_venues为明确不支持的组合。signal_value_bindings:数据无关的原生属性关联定义;实际图表对象 key 以本次signals.details为准。
calculation 和 definition 不包含监控规则、轮询进度、通知或买卖建议。
错误
| HTTP 状态 | 原因 | 处理 |
|---|---|---|
400 | 未知指标、未知特征 ID,或指标与 ID 不对应 | 读取 detail 并修正查询 |
422 | 非法 kind、空参数,或名称/ID 超长 | indicator 最长 128 字符,id 最长 200 字符;使用合法枚举 |
401 | 提供了无效、过期或撤销的 Token | 修正 Token,不降级匿名重试 |
429 | 超过 API 频率限制 | 按 Retry-After 等待,不应每根 K 线都重查目录 |
405 | 使用 POST、PUT、PATCH 或 DELETE | 此接口仅供 GET 查询 |
字段类型和查询参数也可通过 OpenAPI 读取。