关于 moomoo-grid-strategy
这是一项使用 moomoo OpenAPI 设计和实现单一标的网格交易程序的技能。它规定参数校验、价格与订单计算、状态保存及订单核对循环,默认使用模拟交易环境。
主要功能
- 01计算按百分比或价差设置的网格
- 02校验费用、资金、价位和网格参数
- 03保存网格参数与运行状态
- 04持续核对订单和持仓
- 05默认使用模拟交易
适用场景
- 01检查网格参数是否通过校验
- 02为单只股票或 ETF 构建网格程序
- 03重启后沿用网格基准价
- 04成交或断连后核对订单
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ moomooopen/ moomoo-agent-hub --skill moomoo-grid-strategy安装后在 Claude Code 中输入/moomoo-grid-strategy确认已加载。
详细介绍
moomoo 网格策略实现
用户已经可以使用 moomoo OpenAPI llms.md 下单、修改和取消订单,以及查询行情。本技能将这些操作整合为一个网格程序:参数是否可执行、各档价格如何计算、重启后基准价与订单如何保持一致,以及程序必须在何时停止。
打开用户的 OpenAPI llms.md,查找路径、字段名称和枚举值(公开索引:https://open.moomoo.com/zh-cn/llms.txt),打开匹配的页面,然后发送请求。本文件不复制请求正文。调用使用 webapi.moomoo.com 产品线。
1. 第一版范围
- 一个带市场前缀的股票或 ETF 标的:
HK.00700、US.AAPL、SH.600519、SZ.000001 - 基准价网格,按百分比设定间距(仅在用户明确要求时才使用价差)
- 当日有效的限价单。网格通过对账循环在不同交易日重新挂单
- 市场:香港、美国、上海、深圳
- 交易环境:模拟交易。仅在用户于当前对话中明确提出后(例如「使用实盘」),才切换到实盘交易页面。保留文档要求的二次确认和交易密码。不得将密码、AppKeys、私钥或令牌写入代码库,也不得在日志中输出
不在范围内:区间网格、跌破下限后增加数量、期权、期货、加密货币、多个标的、市价单,以及忽略费用报价获利。
2. 实现顺序
按以下顺序执行。第一步失败时立即停止。
- 收集参数。通过股票基础信息端点的
lot_size读取每手股数。如果找不到,则询问用户。不要猜测为 100。 - 执行第 5 节中的六项检查。任何一项为 FAIL:说明修正方法和公式。不要编写交易代码,也不要下单。
- 只有 WARN 时:先展示参数卡和警告。用户接受后才能编写代码。
- 编写程序。结构参照第 6 节,行为参照第 7 节。使用用户现有项目的语言。如果没有项目,只询问一次。若用户未回答,则使用 Go。
- 执行第 9 节中的验收检查。若测试失败,不要告诉用户程序已准备就绪。
- 用户要求运行时,只连接模拟账户。
3. 参数
| 字段 | 含义 | 省略时 |
|---|---|---|
| Symbol | 带市场前缀 | 必须询问。不要替用户选择标的 |
| 初始基准价 | 网格中心 P0 | 使用最新行情快照中的价格。写入状态文件后,重启时只读取该值 |
| 移动类型 | 百分比或价差 | 百分比 |
| 下跌买入、上涨卖出 | 用户指定的 1.5% 在公式中为 0.015 | 若至少有 120 根日线,则使用平均日波幅 × 0.67;否则询问 |
每侧档数 N | 上下各 N 档,范围为 3–50 | 5,且仍须通过检查 |
| 每档手数 | 正整数 | 1 手,并在输出中说明 |
| 预算 | 可选 | 若未提供,仅报告所需资金,并将 G3 标记为“未检查预算” |
| 回撤止损 | 相对于网格持仓成本的比例,可选 | 询问一次。若用户拒绝,则不设置,并在输出中说明 |
百分比:P_down[i] = P0 / (1+a)^i,P_up[i] = P0 × (1+b)^i。价差:P_down[i] = P0 − i×d,P_up[i] = P0 + i×d。a、b 和 d 均为小数。买入价向下舍入至最小价位,卖出价向上舍入至最小价位。舍入后,间距不得小于用户要求的间距。
每档股数 = 每档手数 × lot_size。每档金额 A = 每档股数 × P0。往返宽度 w = min(a, b)。费用按 w 计算,避免不对称网格低估成本。
4. 最小价格变动单位
基础信息中没有最小变动单位字段。请使用下表确定订单价格和 G1,并在输出中说明这是常见的现金股票最小变动单位表。实盘前请核对交易所当前的最小变动单位表。
香港:根据报价所属的价格区间确定:
| 价格上限(不含) | 最小变动单位 |
|---|---|
| 0.25 | 0.001 |
| 0.50 | 0.005 |
| 10 | 0.01 |
| 20 | 0.02 |
| 100 | 0.05 |
| 200 | 0.10 |
| 500 | 0.20 |
| 1000 | 0.50 |
| 2000 | 1 |
| 5000 | 2 |
| 9995 | 5 |
| 以上 | 5 |
美国:价格低于 1 时使用 0.0001,否则使用 0.01。上海和深圳:0.01。如果市场不在此表中,请停止并说明原因。
5. 六项检查
费率为数量级参考值。请在输出中注明“实盘前请核对券商当前的收费标准”。请勿将其用于对账。
| 市场 | 单边费率 | 每笔订单固定费用 | 日内往返交易 |
|---|---|---|---|
| 香港 | 0.14% | 15 HKD | 允许 |
| 美国 | 0.005% | 1 USD | 允许 |
| 上海 / 深圳 | 0.026%,卖出另收 0.05% 印花税 | 5 CNY | 不允许。卖出数量不得超过可卖数量 |
G1 最小变动单位占比 = tick / (P0 × w)。≤ 10% 为 PASS,10%–20% 为 WARN,> 20% 为 FAIL。若为 FAIL,请将网格宽度提高到 tick / (P0 × 0.1) 以上,或更换标的。
G2 费用占毛利润的比例 = (2 × one-side rate × A + stamp-duty rate × A + 2 × fixed fee) / (A × w)。≤ 25% 为 PASS,25%–40% 为 WARN,> 40% 为 FAIL。
G3 所需资金 = 所有买入层级的 price × shares per level 之和 × 1.15。若存在预算且所需资金 ≤ 预算,则为 PASS。否则为 FAIL,并写明资金缺口。没有预算时,仅报告所需资金,并将结果标记为“未检查”。
G4 使用过去 120 个交易日收盘价的 P10 和 P90。下界为最低买入层级,上界为最高卖出层级。覆盖双向时为 PASS,仅覆盖一侧时为 WARN,均未覆盖时为 FAIL。如果日线数据少于 120 根,则标记为“未检查”。同时报告 N × w:当其低于 10% 时,注明半年内可能出现单边突破。
G5 = w / average daily range。平均日振幅为过去 120 个交易日 (high − low) / close 的中位数。0.5–0.7 为 PASS;0.4–0.5 或 0.7–0.8 为 WARN;< 0.4 或 ≥ 0.8 为 FAIL。若日线数据不足 120 根,则标记为“未检查”。
G6:当 N < 3 或 N > 50 时为 FAIL;当 N > 10 时为 WARN;否则为 PASS。
使用历史 K 线接口的日线数据,并确保复权方式一致。数据不足时,可跳过 G4 和 G5。结果必须注明“未检查”。不得填入估算值并标记为 PASS。
数学自检(香港费用近似值,lot_size = 100):HK.00700,基准价格 410.40,间距 1%,5 个层级,1 手。最小变动单位 = 0.20。G1 = 4.9%,PASS;G2 = 35.3%,WARN;5 个买入层级的名义金额约为 199,000 HKD,所需资金约为 229,000 HKD。在编写交易循环之前,程序中的纯函数必须与这组数字一致。
6. 将程序拆分为四个部分
- 网格:价位、六项检查和所需资金。不访问网络。
- 状态文件:本地 JSON。字段至少包括标的、变动类型、下行间距、上行间距、层数、手数、每手股数、基准价、是否已停止、停止原因、启动时账户中已有的股数、是否已记录该股数,以及保存时间。
- 券商适配器:仅封装
llms.md中有关账户、资金、持仓、下单、撤单、未完成订单、订单详情、行情快照、行情推送和成交推送的页面。字段遵循这些页面的定义。 - 循环:启动时对账,然后在收到推送或定时器触发时唤醒并再次对账。
基准价规则:
- 对于给定的一组参数,首次启动时将基准价写入状态文件。
- 后续启动时,如果标的、变动类型、间距、层数和手数未变,则继续使用文件中的基准价。
- 如果参数发生变化,则停止下单。告知用户旧基准价与新参数不匹配,并等待用户决定。不要悄悄根据最新价格重新计算。
- 如果状态为已停止,且用户尚未明确表示继续,则只查询订单。不要下新单。
订单标记使用简短的 ASCII 字符:g1b、g1s。数字表示层级,b 表示买入,s 表示卖出。下单前,检查订单页面上的 remark 长度限制。只取消标的相同且标记属于此策略的未完成订单。保留账户中的其他订单。
启动时读取持仓,并将当时已有的股数记录在状态文件中。不要为这些股数下卖单,也不要将其成本用于回撤检查。网格持仓 = 当前持仓 − 启动时已有的股数,最低为 0。
7. 对账循环
报价推送和成交推送只会唤醒循环。断线、收到重复推送或部分成交后,下一次订单查询和持仓查询会决定要下哪些订单。还应每隔约 20 秒进行一次对账。遇到限流错误时,应退避,且本轮不要下替代订单。
如果价格低于最低买入档位或高于最高卖出档位:记录停止原因,撤销此策略的未完成订单,保留持仓,并保存状态。不要向下或向上增加档位。
用户设置回撤止损时:根据仍持有股份的买入档位价格估算网格持仓成本。不要使用账户的综合成本。当 (成本 − 最新价格) / 成本 达到阈值时,停止并保留持仓。
每个档位每次对账最多只能更改一个订单。如果该方向已有一个完全相同的未完成订单(方向、价格、数量和标记均相同),则保留该订单。如果同一档位和方向有两个订单,则撤销多余的订单,并在下一轮决定是否替换。
对于档位 i(i 从 1 到 N):
- 买入价格为第
i个较低档位的价格。卖出价格为第i个较高档位的价格。数量为每档股数。 - 此档位净持仓 = 此档位已成交买入股数 − 已成交卖出股数。部分成交按已成交数量计算。已撤销的剩余数量不计入持仓。
- 净持仓 > 0:撤销此档位的买入订单,并按可卖数量下达卖出订单。卖出数量向下取整为整手。不得超过每档股数或可卖数量。如果可卖数量不足,则等待下一轮。
- 净持仓回到 0 且此档位已有卖出成交时:在最新价格上涨穿过此档位的卖出价格之前,不要再次下达买入订单。
- 净持仓为 0 且允许新买入时:买入价格必须低于最新价格。若不满足,则撤销挂单中的买入订单,且不要下达新订单。
- 卖出前检查可卖数量。当天在上海或深圳买入的股份暂不可视为可卖。
进程退出时,撤销此策略的未完成订单,保留持仓,并写入状态文件。
8. 交给用户前先展示以下内容
编写代码或下单之前,先展示以下四个区块。如果任何一项检查结果为 FAIL,不要在第一个区块中写“开始实现”。
- 参数卡片:标的、基准价、变动类型、两种间距、档位数、每手股数、每档手数、预算、回撤止损、模拟或实盘。列出每一个默认值。
- 检查表:G1–G6 的数值和 PASS / WARN / FAIL / 未检查。
- 计算依据:对于每个并非来自用户原话的数字,给出一行公式。
- 风险:此参数集最可能如何亏损(价格跌至下限时,每个买入档位与下限之间的价差乘以每档股数);哪些项目尚未检查;下一步是更改参数、先运行测试,还是连接模拟账户。
此技能用于生成并约束程序。它不预测收益,也不取代用户的交易决策。
9. 验收
将这些检查编写为不访问网络的测试。只有全部通过后,才能说程序已编写完成。
- 第 5 节中的
HK.00700自检:G1、G2 和所需资金均匹配。 - 买入价格向下取整,卖出价格向上取整。取整后的价格比原始价格离基准价格更远。
- 使用相同参数再次读取状态文件后,基准价格保持不变。
- 参数变更不会生成新的基准价格。
- 对账后,同一层级、同一方向上标记相同的两个未结订单只保留一个。
- 某一层级的买单全部成交后,下一轮会在该层级的卖出价挂出卖单,不会将订单移到接近成交价的位置。
- 最新价格跌破最低买入层级后,状态会停止,且不会生成新的买单。
- 启动时已持有的股份不会生成卖单。
- 当沪市或深市的可卖数量为 0 时,不挂出卖单。
用户明确要求运行时,使用模拟账户的账户、资金、持仓和订单页面。只有用户表示使用实盘账户(例如「使用实盘」)后,才会发生实盘下单。
10. 直接拒绝
遇到以下请求时,说明原因并停止:
- 层级数量低于 3 或高于 50
- 某项检查仍为 FAIL,但用户要求照常下单
- 在跌破下限后增加每手股数或向下添加层级
- 将沪市或深市的网格设计为当日买入、当日卖出
- 跳过费用计算,或只在最后从总利润中扣除一笔预估费用
- 因为一次回测表明止损错过了部分利润,就移除越界止损
- 撤销或修改未带有此策略标记的订单
- 要求在对话中提供、复述或写入交易密码或密钥