mcpField
R
revx-strategy

revx-strategy

github.com/revolut-engineering其他7497 次安装1 周前更新
代码仓库

关于 revx-strategy

revx-strategy 是使用 `revx` 命令行在 Revolut X 回测、优化和运行网格交易策略的技能,涵盖交易对约束校验及实盘安全流程,包括下单前确认。

主要功能

  1. 01根据历史蜡烛数据回测网格策略
  2. 02按收益优化参数组合
  3. 03运行实盘网格或使用 dry-run 模拟
  4. 04依据交易对约束校验网格方案
  5. 05设置追踪上移和止损行为

适用场景

  1. 01部署前比较网格设置
  2. 02评估某交易对的历史表现
  3. 03实盘下单前模拟网格
  4. 04经用户确认后运行实盘网格

安装

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

$npx skills add https://github.com/revolut-engineering/revolut-x-api --skill revx-strategy

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

详细介绍

策略:网格机器人(revx strategy grid)

对网格交易策略进行回测、优化和运行。

需要身份验证。 运行这些命令前,请确保已安装并配置 revx。如果任何命令因身份验证相关错误而失败——Auth not configured、No private key found、Authentication failed (401)、Invalid signature、insecure permissions,或缺少 ~/.config/revolut-x/ 下的密钥/配置文件——请立即调用 revx-auth 技能并自行应用修复。不要中断用户并要求他们运行设置。只有需要用户亲自完成的步骤(粘贴 API 密钥、在 Revolut X 个人资料中注册公钥、选择密码短语)才向用户求助。修复后,重试原命令。

交易对使用 BASE-QUOTE 格式,中间以连字符分隔:BTC-USD、ETH-EUR、SOL-USD。


回测

使用历史数据测试网格策略:

revx strategy grid backtest BTC-USD
revx strategy grid backtest BTC-USD --levels 10 --range 10 --investment 1000
revx strategy grid backtest ETH-USD --days 60 --interval 4h
revx strategy grid backtest BTC-USD --split
revx strategy grid backtest BTC-USD --trailing-up --stop-loss 85000
revx strategy grid backtest BTC-USD --json
标志默认值说明
--levels <n>5每侧的网格层数(1-100)
--range <pct>10网格范围,相对中间价上下 +/- %
--investment <amount>1000以计价货币表示的资金
--days <n>3历史数据周期
--interval <res>1mK 线分辨率
--splitoff将投资分配到买入和卖出层级(对于高于起始价格的层级,以市价买入基础货币)
--trailing-upoff当 K 线最高价触及上边界上方第二个几何层级,且网格不再持有任何币时,重建网格
--stop-loss <price>off当价格达到此绝对值时停止回测(必须低于最低网格层级)
--jsonoff以 JSON 格式输出

回测引擎假设: 引擎基于 OHLC K 线运行,无法访问单根 K 线内的逐笔行情数据。每根 K 线内的订单执行顺序由 K 线方向决定:

K 线类型条件假定价格路径执行顺序
看涨open <= close开盘价 → 最低价 → 最高价 → 收盘价执行所有价格 ≥ 最低价的买入订单,然后执行所有价格 ≤ 最高价的卖出订单
看跌open > close开盘价 → 最高价 → 最低价 → 收盘价执行所有价格 ≤ 最高价的卖出订单,然后执行所有价格 ≥ 最低价的买入订单

局限:真实的 K 线内价格走势可能更复杂(例如,多次触及最高价/最低价),回测无法还原这些情况。

回测会在满足条件的单根 K 线最高价触发向上跟踪,前提是网格不再持有任何币;随后使用该 K 线的收盘价重建网格。止损同样会立即生效,因为历史 K 线不包含实时逐笔行情序列。

不会长时间运行——完成后即返回结果。请通过 Bash 工具正常运行。

运行前务必确认以下关键参数:交易对、投资额、层数、范围和分配模式。这些参数会影响资金和策略行为——绝不可在未确认的情况下自行假设。其他参数(天数、周期)可使用默认值,除非用户另有说明。

优化

测试多种参数组合,并按收益排序:

revx strategy grid optimize BTC-USD
revx strategy grid optimize BTC-USD --investment 5000 --days 60
revx strategy grid optimize BTC-USD --levels 5,10,15,20 --ranges 3,5,10 --top 5
revx strategy grid optimize BTC-USD --split
revx strategy grid optimize BTC-USD --trailing-up --stop-loss 85000
标志默认值描述
--levels <csv>3,5,8,10,15要测试的每侧网格层数(每侧 1-100 层)
--ranges <csv>3,5,7,10,12,15,20要测试的区间百分比
--top <n>10要显示的最佳结果数量
--investment <amount>1000以报价货币计的资金
--days <n>3历史数据周期
--interval <res>1mK 线分辨率
--split关闭将投资分配到买入和卖出网格层(对于起始价格上方的网格层,以市价买入基础货币)
--trailing-up关闭当网格不持有任何币时,如果某根 K 线的最高价达到上边界上方第二个几何网格价位,则重建网格
--stop-loss <price>关闭当价格达到此绝对值时,停止每次回测。止损价必须低于每种组合的最低网格价位,否则优化会在运行前失败
--json关闭以 JSON 格式输出

最多支持 200 种参数组合。所有组合都会在任何回测运行前进行验证。如果任一组合违反交易对约束或止损价位置要求,整个优化命令都会失败;不会跳过无效组合。不会长时间运行——命令会完成并返回结果。

运行前务必确认以下关键参数:交易对、投资金额和拆分模式。这些参数会影响资金和策略行为——切勿默默假设用户的选择。其他参数(层数列表、区间列表、天数、间隔、结果数量)可使用默认值,除非用户另有指定。


交易对约束和验证

回测、优化、试运行和实盘运行在执行前,都会构建相同的交易所适配网格计划:

  • 网格价格会按交易对的报价步长取整,并且必须严格递增且互不重复。
  • 每层报价金额会向下取整到报价步长;基础货币数量会向下取整到基础货币步长。
  • 每笔订单都必须满足交易对的最低报价金额以及基础货币数量的最小值和最大值。
  • 拆分模式下,初始市价买入金额和分配给每层的卖出数量都必须符合交易对限制。
  • 止损价必须严格低于对齐后的最低网格价位,且最大清算数量不得超过基础货币订单的最大数量。

无效参数会在模拟或下单前导致失败。优化会先验证所有请求的组合;若其中任意一个无效,整个命令都会失败。增加层数会减少每层资金,因此每侧 100 层的网格可能比层数较少的网格需要更多投资。


运行(实盘交易)

必须由用户确认

**未经用户明确确认,绝不能执行 revx strategy grid run(不带 --dry-run)。**此命令会使用真实资金下达真实订单。

启动实盘网格机器人前,向用户展示确认摘要:

即将启动网格机器人:

  • 交易对:BTC-USD
  • 投资金额:$500
  • 层数:每侧 10 层
  • 区间:+/-5%
  • 模式:实盘(真实订单)

这将下达真实的买入和卖出订单。是否继续?

仅在用户明确批准后执行。--dry-run 无需确认(不会下达真实订单)。

务必先建议试运行

用户要求运行实盘网格机器人时,务必先建议使用 --dry-run 试运行,再进入实盘——除非用户已在当前会话中完成试运行,或明确表示想跳过。

回复示例:

进入实盘前,我建议先试运行,以验证网格设置:

revx strategy grid run BTC-USD --investment 500 --levels 10 --range 5 --dry-run

这会模拟机器人运行,不会下达真实订单。要先进行试运行吗?

如果用户确认要跳过试运行,则继续执行上述实盘确认流程。

缺少参数——务必询问,绝不猜测

CLI 要求使用 --investment 标志,但也要确认用户对所有关键参数的意图:

  1. 交易对 — 哪个交易对?
  2. 投资额 — 投入多少资金?
  3. 层级 — 每侧设置多少个网格层级?(如果用户说“使用默认值”,则默认为 5)
  4. 范围 — 范围百分比是多少?(如果用户说“使用默认值”,则默认为 5%)

如果用户说“在 BTC 上运行网格机器人”,至少要询问投资金额。

运行带有实时仪表板的实时网格机器人:

revx strategy grid run BTC-USD --investment 500
revx strategy grid run BTC-USD --levels 10 --range 5 --investment 1000 --interval 15
revx strategy grid run BTC-USD --investment 500 --split
revx strategy grid run BTC-USD --investment 100 --dry-run
revx strategy grid run BTC-USD --investment 500 --reset
revx strategy grid run BTC-USD --investment 1000 --trailing-up --stop-loss 85000
标志默认值描述
--investment <amount>必填计价货币资金
--levels <n>5每侧的网格层级数(1-100)
--range <pct>5相对于中间价的网格范围 +/- %
--split关闭将投资额拆分到买入和卖出层级(为高于当前价格的层级市价买入基础货币)
--interval <sec>10轮询间隔(秒),范围为 5 到 86400
--dry-run关闭模拟运行,不下真实订单
--reset关闭取消已保存网格的订单并重新开始。旧网格的币仍保留在钱包中
--trailing-up关闭连续 3 次检查达到上边界之上的第二个几何层级后,在网格不持有任何币时重建网格
--stop-loss <price>关闭价格达到此绝对值时卖出所有资产并停止(必须低于最低网格层级)

按 Ctrl+C 结束网格:这会取消未完成的订单、将币保留在钱包中并打印摘要。下次启动时会开始新网格。如果订单尚未确认关闭,下次启动时会先检查该订单。收到停止信号(kill、docker stop、系统关机)时,如果网格持有币或订单尚未确认,程序会取消订单并保留网格。此后或发生崩溃后,下次启动时会恢复网格。

如果无法下单,例如成交后币或现金被转出账户,仪表板会在每次检查时为该订单显示一行及其原因,直到该订单不再处于这种状态。因同一原因等待的同一层级订单会合并显示为一行;机器人已发送但无法确认的订单会显示为尚未确认。机器人尚未发送的卖单会显示为尚未下单。交易所一分钟内仍未列出的订单会显示为尚未列出。“开放买单成交”行会显示开放买单目前买入的数量。有关当前检查的警告(例如订单被拒绝)会优先显示。如果该订单在本次检查结束时仍未恢复,Telegram 会收到一条有关该订单的消息,因此如果重试在同一次检查内成功,则不会发送消息。卖单会在每次检查时重试。买单每分钟重试一次,只要有可用现金就会立即重试。在订单下单成功并随后再次失败之前,不会再发送消息。因现金不足而跳过的买单会合并显示为一行,其中包含等待的订单数量、可用现金和所需总额。补充某个层级时,只会补足其缺少的资金,因此丢失的剩余金额会按其自身金额补足,机器人也会按可用现金尽可能下单。如果买单的回复丢失,机器人会每分钟按订单 ID 查询一次并跟踪该订单。如果两次查询都未找到订单,机器人会使用相同的 ID 重新发送订单;如果订单已存在,交易所会拒绝该订单。如果订单最终被取消或拒绝,机器人会按相同金额重新下单。低于交易所最低限额的剩余金额不会下单。该金额会保留在对应仓位的预算中,并在该仓位卖出时买回;除非这笔回购也低于最低限额。按 Ctrl+C 取消的剩余买单或启动时发现已取消的剩余买单也会如此处理。使用 --split 时,启动时的规模检查会计入市价买单以币支付的 0.09% 手续费,因此如果网格达到交易所最低限额,程序会在买入前拒绝启动。 即使旧网格中持有币或有待处理的卖出,--reset 也会启动一个新网格。它会先取消旧网格的订单,包括已发送但回复丢失的订单,然后删除保存文件。待处理的卖出会被放弃,旧网格买入但未卖出的币会留在钱包中,不属于新网格。如果取消操作未获确认,或无法列出订单,则会保留保存文件,请再次运行。如果交易所未列出某笔订单,系统会用其 ID 标识该订单。此前刚发送的拆分买入或卖出仍可能在几分钟内成交。

如果网格保存文件已损坏,机器人会拒绝启动,以免旧网格的订单和币无人跟踪。新网格无法接管这些订单和币,因此请先在 Revolut X 应用中取消旧网格的未结订单,并决定如何处理其中的币。然后使用 --reset 运行,损坏的文件会被重命名为 <name>.damaged-<time>(绝不会删除),并启动新网格。如果机器人无权读取某个文件,则会报告读取错误,而不是将其视为已损坏。

实盘和模拟运行中的向上跟踪都要求连续出现三个符合条件的价格。低于阈值的价格会重置确认计数。第三个价格出现时,网格还必须未持有任何币,且没有尚未解决的订单提交;否则,重建会等待,并在下一个达到或超过阈值的价格出现时重试。止损仍会在第一个符合条件的价格出现时立即触发。 网格订单是普通限价订单(allow_taker)。如果市场价格已经越过某个订单,例如快速上涨后卖单价格低于市价,或快速下跌后买单价格高于市价,该订单会立即以其价格或更优价格成交,并支付 0.09% 的吃单费。在订单簿中等待成交的订单支付 0% 的挂单费。网格始终与其价位保持对应。买单对应的卖单会将收到的币在上一个价位卖出,数量向下取整至交易所的数量步长。小到无法卖出的剩余数量会随这笔卖单一并平仓,其成本也计入这笔卖单。卖单成交后,会按该档位买入这些币时的数量重新买入该档位;数量为该档持有的全部数量,或部分成交时所占的份额。位于网格中心价格下方的空买入档位会重新挂出买单,即使市价已经低于该价位,该买单也会立即成交。如果交易所对新的网格订单返回 state: "rejected",无论拒单原因为何,都算作该买入档位或仓位的一次拒单。随后,机器人会查询该订单,最长等待 5 秒,将已成交的部分入账,并立即以新的客户端订单 ID 重新发送剩余部分。暂时还无法查询到的订单会继续跟踪,并在后续检查时再次查询。如果 1 分钟后仍然找不到订单,则视为拒单且没有成交,并重新挂出。重启后,处理方式与交易所尚未列出该订单时相同。之后交易所报告为拒单的已跟踪订单,也按相同方式计数。计数会在多次检查间保留,但重启后不会保留。期间发生的其他错误不会重置计数,重新发送的订单被接受也不会重置。只有在之后看到该档位或仓位的订单出现在订单簿中或成交后,计数才会重新开始。第三次拒单时,机器人会卖出所有资产并停止(紧急停止,见下文);如果交易所能在 5 秒内显示最后一笔订单的成交情况,清仓卖出也会将这部分成交入账。清仓过程中发现的拒单不计数,向上追踪时所有计数都会重新开始。其他错误不会立即触发重新发送,而会在后续检查时重试。启动时或运行期间,如果交易所尚未列出某个订单,该订单会继续被跟踪并再次查询。订单缺失 5 分钟后,机器人会使用该订单自己的客户端订单 ID 重新发送,因此交易所不会重复下单。在此之前,取消操作也不会被视为完成。对于较旧的保存记录,如果机器人无法找到订单的客户端订单 ID,则不会重新发送该订单。机器人会发送一条消息;只有在订单缺失满 24 小时后,才会下达新订单,并再发送一条消息。向上追踪会等到这时才开始。启动时,对于已发送但尚未确认的买单或卖单,机器人会使用其客户端订单 ID 在整个网格的订单历史中查询。若订单处于挂单或已成交状态,则会接管该订单;若订单已拒绝或已取消且没有成交,则会使用新 ID 重新下单,买单的数量为其自身的数量。拒单会计入三次拒单限额。找不到的订单会使用原 ID 重新发送。如果发送失败,启动流程会继续并发出提醒。之后,有资金时每分钟重试一次买单,每次检查时重试卖单。如果交易所回复该 ID 已被使用,机器人之后只会查询该订单。恢复被中断的首次下单时,重新发送买单或拆分卖单若失败,也不会阻止启动。运行期间,对于未确认的买单,以及交易所因订单已下达而拒绝重新发送的卖单,同样会每分钟执行一次查询。查询范围从订单首次发送时间往前追溯一天。对于因响应丢失而未确认的拆分市价买单,启动时会以相同方式查询,然后才重新发送。如果交易所有该订单但尚未列出,启动流程会停止,并提示几分钟后重新启动。 **网格中的费用:**费用从每笔订单实际收到的金额中扣除。网格买入以币种支付费用,因此持仓记录的是实际到账的币,成本则是实际花费的报价币。该持仓的卖出数量按净币数确定。网格卖出以报价币支付费用,因此利润为实际到账的报价币减去持仓成本。机器人读取每笔已成交订单的实际费用,并以报价币计入“已付费用”;如果费用以币种支付,则按成交价格换算。在订单簿上挂单的订单支付 0% 的 maker 费用。以下情况支付 0.09% 的 taker 费用:因市场价格已经越过网格订单而立即成交的网格订单、拆分启动市价买单,以及止盈清仓的市价卖单。模拟运行和回测假设网格成交的费用为 0%,拆分买单和止盈清仓的费用为 0.09%。

**卖出全部持仓(止损和紧急停止):**机器人首先在已保存状态中标记止盈清仓。它会完成之前已发出的卖单,并检查已发送但尚未确认的订单,然后取消所有网格订单,并记录期间成交的订单。接着,它会用市价单卖出所有持有的币,每笔订单不超过交易所的最大限额。未成交的卖单最多重试 3 次。下单失败的卖单会保持待处理状态。无法确认已取消订单的币不会被卖出。对于回复丢失的订单(包括拆分买单),机器人会按订单 ID 查询;在找到订单之前,可能由其持有的币既不会被卖出,也不会被核销。如果此类订单、交易所尚未列出的网格订单、未确认的取消或卖出操作,或交易所错误导致卖出受阻,同一次运行中会每隔 30 秒重新检查一次,最长持续 6 分钟。缺失 5 分钟的订单会被视为从未下单,随后继续卖出。低于交易所最低限额的金额会留在钱包中,并记为亏损。全部卖出后,已保存的网格会被删除,因此下次运行无需使用 --reset 即可从头开始。如果止盈清仓无法完成,则会保持待处理状态,提示消息末尾会注明原因,并在下次启动时优先完成,且沿用相同的实盘或模拟运行模式。使用 --reset 会将其丢弃。按 Ctrl+C 不会触发卖出。它会停止上述等待,不发送新的网格订单,并等待已经开始的启动流程完成。在止盈清仓以外的情况下,之后会取消网格订单、保留币并结束网格。在止盈清仓期间,已发出的卖单会完成,但不会开始新的卖单,剩余的止盈清仓将在下次启动时完成。

仪表板最多显示 24 行网格,围绕价格居中展示,并报告隐藏的较高和较低级别数量,以便清晰查看每侧有 100 个级别的网格。

如果已配置 Telegram 连接器(参见 revx-telegram 技能),则会在启动、关闭、成交和盈亏变化时发送通知。

**每个网格仅运行一次:**无论是实盘还是模拟运行,网格运行都会在已保存状态旁创建锁文件(配置文件夹中的 grid_state_<PAIR>.lock)。同一配置文件夹中,同一交易对的第二次运行(包括使用 --reset)会在发送任何内容前被拒绝,前提是第一次运行仍在进行。由崩溃的运行在本机留下的锁会被接管,即使机器已重启也一样。否则,错误会指出需要删除的锁文件。每台运行中的机器或容器使用一个配置文件夹。两个容器如果共享主机名和配置文件夹,仍可能各自启动同一网格,因为双方都看不到对方的进程。切勿启动网格的第二个副本来查看其状态,请改用 revx order open。除非用户确认没有网格进程正在运行,否则切勿删除锁文件。 **服务中断和外部变更:**如果交易所拒绝某个密钥(401 或 403),会立即发送一条 Telegram 消息,告知已掩码处理的密钥;密钥恢复可用时,还会再发送一条。仪表板会说明如何修复,同时未成交的网格订单会继续留在交易所。收到 401 后,使用 revx configure 修复密钥,然后重新启动网格。收到 403 后,在 Revolut X 中修复密钥权限,网格会自动继续运行。因其他原因导致价格或订单数据中断 5 分钟后,网格会发送一条 Telegram 消息;数据恢复后还会再发送一条。期间网格会继续运行。如果某个网格订单在机器人之外被取消(例如在应用中取消),系统会重新下单,仪表板会显示重新下单的数量和时间。如果某个订单在机器人之外被替换,网格会重新下自己的订单。仪表板、重启摘要和停止消息都会说明该替换订单不受跟踪;如果不需要,请使用 revx order cancel 取消。

长时间运行的命令 — Claude 的行为说明

revx strategy grid run(包括 --dry-run)会作为连续轮询循环无限期运行。

处理方式:

  1. 使用 Bash 工具运行命令,并设置 run_in_background: true——这样进程会在后台异步运行,Claude 可以立即继续响应
  2. 定期使用 Read 工具读取后台任务的输出文件以监控状态,并向用户报告关键事件(下单、成交、错误)
  3. 如果用户要求停止,请按 Ctrl+C 的方式结束网格:运行 pkill -INT -f "revx strategy grid run <PAIR>",然后读取输出,直到出现停止摘要。只有在此操作失败时才使用 TaskStop 工具,因为它会保留网格以供下次启动
  4. 每个网格只能运行一个副本。如果用户更想查看实时仪表板(颜色、实时表格,按 Ctrl+C 停止),请提供命令,让他们在自己的终端中运行,而不是在后台启动。切勿两种方式同时使用

示例 — 启动网格机器人:

Bash 工具调用:

{ "command": "revx strategy grid run BTC-USD --investment 500 --levels 10 --range 5", "run_in_background": true }

给用户的回复:

已在后台为 BTC-USD 启动网格机器人。我会定期检查更新;你随时可以让我停止它。

如果你更想自己查看实时仪表板,我可以停止这次运行,然后由你在自己的终端中运行相同的命令。网格一次只能运行一个副本。


何时建议使用分割模式

用户设置网格策略(回测、优化或运行)时,如果尚未指定 --split,请询问是否要使用分割模式。结合以下说明,提供简单的选择:

你想使用分割模式(--split)吗?

  • 不使用分割模式——所有资金都用于当前价格下方的买单。最适合上涨行情,因为你预期价格会跌至买入价位,然后反弹。
  • 使用分割模式——资金分配至买入和卖出价位。在起始价格处进行的市价买入会为上方的卖出仓位提供资金。最适合价格围绕当前水平上下波动的区间震荡行情。

如果用户拿不准,建议同时运行这两种方案进行回测/优化,以比较结果。

用户选择分割模式后,在回测、优化、试运行和实盘中始终一致地使用 --split。


盈亏指标

已实现盈亏 = 每笔已完成卖出的利润总和(卖出收入 − 每档成本)。衡量纯网格交易利润。拆分买入(若使用 --split)本身不产生利润,但其成本(包括以币种支付的 0.09% 手续费)计入所购币种的成本,因此这些币种卖出时会计入盈亏。

总盈亏 =(最终计价币余额 + 最终基础币 × 最终价格)− 初始投资。即投资组合按市值计算的价值变化。结束时不会强制卖出资产。

不使用 --split: 仅为买入档位(低于起始价格)提供资金。在上涨市场中,所有网格交易周期都可能完成,从而使已实现盈亏与总盈亏相等。

使用 --split: 将投资分配到所有档位。起始价格上方的档位通过在起始价格模拟市价买入来建立持仓。这会导致已实现盈亏与总盈亏出现差异,并可在网格范围内的上涨和下跌行情中获利。


常见工作流:先回测,再运行

# 1. Optimize to find best parameters
revx strategy grid optimize BTC-USD --investment 1000 --days 30

# 2. Backtest the top result
revx strategy grid backtest BTC-USD --levels 10 --range 7 --investment 1000

# 3. Dry run first
revx strategy grid run BTC-USD --investment 1000 --levels 10 --range 7 --dry-run

# 4. Go live
revx strategy grid run BTC-USD --investment 1000 --levels 10 --range 7

如果要使用拆分投资进行测试和运行,请在所有步骤中一致使用 --split。


相关技能

技能用途
revx-telegram接收网格机器人事件的 Telegram 通知
revx-market配置网格前查看价格和交易对数据
revx-account查看余额和订单状态
revx-trading手动下单(网格机器人会自动下单)
revx-authAPI 密钥设置与配置

评论

支持 Markdown