mcpField
F
futu-grid-strategy

futu-grid-strategy

github.com/futunnopen其他4598 次安装5 天前更新
代码仓库

关于 futu-grid-strategy

为 Futu OpenAPI 用户提供网格策略实现规范的技能,涵盖参数校验、价格计算、状态管理和订单协调。它限定为单只股票或 ETF、限价单及模拟交易,并规定检查未通过时不得编写或下单。

主要功能

  1. 01计算网格价位与资金需求
  2. 02执行六项参数检查
  3. 03保存并校验策略状态
  4. 04协调订单与持仓
  5. 05支持模拟交易流程

适用场景

  1. 01为单只股票或 ETF 构建网格程序
  2. 02检查间距、费用与资金是否适用
  3. 03程序重启后对账并恢复策略状态

MCP 相关

输入未说明与 MCP 的关系。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/futunnopen/futu-agent-hub --skill futu-grid-strategy

安装后在 Claude Code 中输入/futu-grid-strategy确认已加载。

详细介绍

Futu 网格策略实现

用户已经可以通过 Futu OpenAPI llms.md 下单、改单、撤单和查询报价。本技能将这些操作整合为一个网格程序:参数是否可运行、各档价格如何计算、重启后基准价与订单如何对齐,以及程序何时必须停止。

打开用户的 OpenAPI llms.md,查看路径、字段名和枚举值(公开索引:https://open.futunn.com/zh-cn/llm/llms.md),打开相应页面,然后发送请求。本文件不复制请求正文。调用发往 webapi.futunn.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. 参数

字段含义省略时
标的带市场前缀必须询问。不要替用户选择标的
初始基准价网格中心 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