mcpField
M
moomoo-grid-strategy

moomoo-grid-strategy

github.com/moomooopen开发2166 次安装3 天前更新
代码仓库

关于 moomoo-grid-strategy

这是一项使用 moomoo OpenAPI 设计和实现单一标的网格交易程序的技能。它规定参数校验、价格与订单计算、状态保存及订单核对循环,默认使用模拟交易环境。

主要功能

  1. 01计算按百分比或价差设置的网格
  2. 02校验费用、资金、价位和网格参数
  3. 03保存网格参数与运行状态
  4. 04持续核对订单和持仓
  5. 05默认使用模拟交易

适用场景

  1. 01检查网格参数是否通过校验
  2. 02为单只股票或 ETF 构建网格程序
  3. 03重启后沿用网格基准价
  4. 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. 实现顺序

按以下顺序执行。第一步失败时立即停止。

  1. 收集参数。通过股票基础信息端点的 lot_size 读取每手股数。如果找不到,则询问用户。不要猜测为 100。
  2. 执行第 5 节中的六项检查。任何一项为 FAIL:说明修正方法和公式。不要编写交易代码,也不要下单。
  3. 只有 WARN 时:先展示参数卡和警告。用户接受后才能编写代码。
  4. 编写程序。结构参照第 6 节,行为参照第 7 节。使用用户现有项目的语言。如果没有项目,只询问一次。若用户未回答,则使用 Go。
  5. 执行第 9 节中的验收检查。若测试失败,不要告诉用户程序已准备就绪。
  6. 用户要求运行时,只连接模拟账户。

3. 参数

字段含义省略时
Symbol带市场前缀必须询问。不要替用户选择标的
初始基准价网格中心 P0使用最新行情快照中的价格。写入状态文件后,重启时只读取该值
移动类型百分比或价差百分比
下跌买入、上涨卖出用户指定的 1.5% 在公式中为 0.015若至少有 120 根日线,则使用平均日波幅 × 0.67;否则询问
每侧档数 N上下各 N 档,范围为 3–505,且仍须通过检查
每档手数正整数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.250.001
0.500.005
100.01
200.02
1000.05
2000.10
5000.20
10000.50
20001
50002
99955
以上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,不要在第一个区块中写“开始实现”。

  1. 参数卡片:标的、基准价、变动类型、两种间距、档位数、每手股数、每档手数、预算、回撤止损、模拟或实盘。列出每一个默认值。
  2. 检查表:G1–G6 的数值和 PASS / WARN / FAIL / 未检查。
  3. 计算依据:对于每个并非来自用户原话的数字,给出一行公式。
  4. 风险:此参数集最可能如何亏损(价格跌至下限时,每个买入档位与下限之间的价差乘以每档股数);哪些项目尚未检查;下一步是更改参数、先运行测试,还是连接模拟账户。

此技能用于生成并约束程序。它不预测收益,也不取代用户的交易决策。

9. 验收

将这些检查编写为不访问网络的测试。只有全部通过后,才能说程序已编写完成。

  • 第 5 节中的 HK.00700 自检:G1、G2 和所需资金均匹配。
  • 买入价格向下取整,卖出价格向上取整。取整后的价格比原始价格离基准价格更远。
  • 使用相同参数再次读取状态文件后,基准价格保持不变。
  • 参数变更不会生成新的基准价格。
  • 对账后,同一层级、同一方向上标记相同的两个未结订单只保留一个。
  • 某一层级的买单全部成交后,下一轮会在该层级的卖出价挂出卖单,不会将订单移到接近成交价的位置。
  • 最新价格跌破最低买入层级后,状态会停止,且不会生成新的买单。
  • 启动时已持有的股份不会生成卖单。
  • 当沪市或深市的可卖数量为 0 时,不挂出卖单。

用户明确要求运行时,使用模拟账户的账户、资金、持仓和订单页面。只有用户表示使用实盘账户(例如「使用实盘」)后,才会发生实盘下单。

10. 直接拒绝

遇到以下请求时,说明原因并停止:

  • 层级数量低于 3 或高于 50
  • 某项检查仍为 FAIL,但用户要求照常下单
  • 在跌破下限后增加每手股数或向下添加层级
  • 将沪市或深市的网格设计为当日买入、当日卖出
  • 跳过费用计算,或只在最后从总利润中扣除一笔预估费用
  • 因为一次回测表明止损错过了部分利润,就移除越界止损
  • 撤销或修改未带有此策略标记的订单
  • 要求在对话中提供、复述或写入交易密码或密钥

评论

支持 Markdown