做市商保护 (MMP)
面向做市商的成交窗口限制与自动撤单行为。
概述
MMP 通过以下方式保护做市商免受快速不利成交的影响:
- 在滚动时间窗口内跟踪累计成交指标
- 在超出限制时撤销订单
- 自动撤销同一钱包+标的资产下所有其他启用了 MMP 的订单
配置
设置 MMP 配置
接口:POST /mmp-config
请求:SetMmpConfigRequest
{
"wallet": "0x...",
"currency": "BTC",
"interval_ms": 60000,
"frozen_time_ms": 300000,
"qty_limit": 1000000,
"delta_limit": 10.0,
"vega_limit": 5.0,
"enabled": true,
"nonce": 1,
"signature": "0x..."
}
字段:
wallet:钱包地址currency:标的资产货币(例如"BTC"、"ETH")interval_ms:滚动窗口长度(毫秒)frozen_time_ms:触发后的冻结时长(毫秒)qty_limit:可选的数量限制(合约单位)delta_limit:可选的 Delta 限制vega_limit:可选的 Vega 限制enabled:该钱包+货币是否启用 MMP
响应:ApiResponse<MmpConfigData>
获取 MMP 配置
接口:GET /mmp-config?wallet=...¤cy=...
查询参数:
wallet(必填)currency(可选过滤条件)
响应:MmpConfigResponse
{
"success": true,
"data": [
{
"wallet_address": "0x...",
"currency": "BTC",
"interval_ms": 60000,
"frozen_time_ms": 300000,
"qty_limit": 1000000,
"delta_limit": 10.0,
"vega_limit": 5.0,
"enabled": true
}
]
}
删除 MMP 配置
接口:DELETE /mmp-config
请求:DeleteMmpConfigRequest
{
"wallet": "0x...",
"currency": "BTC",
"nonce": 1,
"signature": "0x..."
}
响应:ApiResponse<String>
重置 MMP 状态
接口:POST /mmp-config/reset
请求:ResetMmpRequest
{
"wallet": "0x...",
"currency": "BTC",
"nonce": 1,
"signature": "0x..."
}
响应:ApiResponse<String>
说明:重置 MMP 成交窗口状态(清除累计指标,解除货币冻结)。
MMP 行为(务必理解)
成交处理顺序
MMP 评估在成交之后进行(POST-FILL):
- 引擎先撮合并接受成交
- 然后 MMP 检查累计指标
- 如果超出限制:
- MMP 触发
- 当前活动订单的剩余数量停止处理
- 订单变为
CANCELED,撤销原因为"MMP triggered during fill processing" - 引擎发出
MmpTriggered事件 - 引擎自动撤销同一钱包+标的资产下所有其他启用了 MMP 的未成交订单
影响:在 MMP 触发之前,您可能收到超出所配置阈值的成交。
触发条件
只要任一已配置的限制被突破,MMP 即触发:
- 数量限制:
cumulative_qty > qty_limit - Delta 限制:
|cumulative_delta| > delta_limit - Vega 限制:
|cumulative_vega| > vega_limit
累计指标在滚动窗口(interval_ms)内计算。
撤单行为
当 MMP 触发时:
- 活动订单:剩余数量停止处理,订单变为
CANCELED,撤销原因为"MMP triggered during fill processing" - 其他订单:同一钱包+标的资产下所有其他启用了 MMP 的未成交订单会被自动撤销,撤销原因为
"Order canceled by MMP trigger"
注意:仅撤销启用了 MMP 的订单。mmp_enabled=false 的订单不受影响。
冻结行为
MMP 触发后:
- 该货币被冻结
frozen_time_ms毫秒 - 冻结期间,新的成交可能被拒绝(取决于具体实现)
成交指标计算
数量
- 来源:成交
size(合约单位) - 累计:滚动窗口内所有成交之和
Delta
- 来源:根据成交合约代码和 GreeksCache 计算
- 累计:滚动窗口内所有成交 Delta 之和
Vega
- 来源:根据成交合约代码和 GreeksCache 计算
- 累计:滚动窗口内所有成交 Vega 之和
滚动窗口
窗口淘汰
超过 interval_ms 时长的成交会自动从窗口中移除:
- 淘汰机制定期运行(后台任务)
- 随着旧成交的移除,累计指标相应递减
窗口重置
通过 POST /mmp-config/reset 重置 MMP 状态:
- 清除窗口内所有成交
- 将累计指标重置为零
- 解除货币冻结
MMP 事件
MmpTriggered 事件
内部事件(当前不会转发给 WS 客户端):
MmpTriggeredMessage {
wallet: WalletAddress,
currency: String,
reason: String, // "qty_limit" | "delta_limit" | "vega_limit"
}
最佳实践
配置
- 设置合适的限制:根据您的风险承受能力和典型成交规模设定
- 使用按货币区分的配置:按标的资产分别配置(BTC、ETH 等)
- 监控 MMP 触发情况:高频触发可能表明限制配置不当或市场环境不利
订单管理
- 有选择地启用 MMP:仅对需要保护的订单设置
mmp_enabled=true - 保持货币一致:确保同一标的资产的所有订单使用 MMP 配置中相同的货币
- 处理 MMP 撤单:实现检测 MMP 触发撤单的逻辑,并调整报价
监控
- 跟踪 MMP 触发:监控撤销原因为
"MMP triggered during fill processing"和"Order canceled by MMP trigger"的订单 - 审查成交窗口:通过 MMP 配置检查累计指标(当前未通过 API 公开)
- 调整限制:如果 MMP 触发过于频繁,提高限制;如果触发过少,降低限制
常见问题
MMP 触发过于频繁
原因:
- 相对于典型成交规模,限制设置过低
- 市场环境不利
- 高频报价导致大量成交
解决方案:
- 提高
qty_limit、delta_limit或vega_limit - 增大
interval_ms以允许窗口内容纳更多成交 - 降低报价频率
MMP 不触发
原因:
- 限制设置过高
- 订单未启用 MMP(
mmp_enabled=false) - 货币不匹配(MMP 配置的货币 != 订单标的资产)
解决方案:
- 降低限制
- 确认订单上
mmp_enabled=true - 确认 MMP 配置的货币与订单标的资产一致
意外撤单
现象:订单以 "Order canceled by MMP trigger" 为原因被撤销,但您并未预料到。
原因:同一钱包+标的资产下的另一笔订单触发了 MMP。
解决方案:当某笔订单触发时,审查同一标的资产下所有启用了 MMP 的订单。