买
满足策略的进场条件时下买单。具体用市价还是挂单,取决于该策略的执行模式设置;Trailing Trade 的入场支持在市价与挂单之间切换。
运行模型 · 账户 → 币安账户 → Profile
它不是一个机器人管一个账户的结构。一个操作员账号下可以挂多个币安账户,每个账户又能同时跑多个互相独立的 Profile,每个 Profile 有自己的币种、预算与策略,但共享同一个钱包。下面把层级结构、一次价格更新的完整决策链,以及它靠什么保证重启后不会重复下单,一次讲清楚。
把「谁和谁共享钱」搞清楚,是配置这个机器人时最容易出错、也最容易亏到糊涂的地方。下表按层级拆开,最后一列专门写容易误判的点。
| 层级 | 它是什么 | 各自独立 | 共享 | 注意点 |
|---|---|---|---|---|
| 操作员账号 | 你登录这个实例的单一 master 账号(Better Auth,密码用 argon2id) | 无——官方明确这是单操作员应用,没有邮箱验证也没有二次验证 | 所有币安账户与 Profile 都挂在它下面 | 没有第二把钥匙。忘记密码要走运维命令重置,不是走邮箱找回 |
| 币安账户 | 一个 API Key 对应一个币安账户与一个钱包 | 一套 API Key / Secret、一个交易环境(测试网或实盘)、一份钱包快照 | 都挂在同一个操作员账号下 | 测试网与实盘是完全独立的两个钱包,一个账户只属于其中一种环境 |
| Profile | 一套独立的交易设置:策略 + 币种清单 + 预算 + 自己的持仓状态 | 策略、币种、预算、持仓记录 | 该账户的钱包与余额 | 最容易误解的一条:Profile 之间账本独立,但钱是同一笔,预算要按账户整体额度一起规划 |
| 币种绑定 | 某个 Profile 下允许交易的具体交易对(如 BTCUSDT) | 是否有持仓、是否被 pin 住、按币种覆盖的参数 | 该 Profile 的预算与策略 | 手工添加的币与自动发现的币落在同一层,但来源不同;被 pin 住的币不会被自动剔除 |
| 预算 | 该 Profile 允许动用的额度 | 每个 Profile 各有一份 | 同一个钱包的实际余额 | 多个 Profile 的预算之和完全可以超过钱包余额,官方把额度检查放在买入下单前的一步 |
| 执行进程 | 真正下单的 worker 进程 | 默认 ROLE=all 时与 api、study 跑在同一个容器里 | 服务全部账户与 Profile | 实盘 worker 目前只允许单副本,多副本的扩展虽已合并但处于休眠状态 |
官方把整套机制压缩成一句话:对每个你指定要看的币,反复跑一个很短的循环。这个循环叫 tick,无论你选的是哪一本 rulebook,形状都一样。
币安推送来该币种的最新价格与近期 K 线,进程再读一次这个账户的钱包余额,加上这个 Profile 自己的设置。这一步不产生任何决定,只是把判断依据取齐。要注意的是钱包余额读的是交易所侧的真实快照,不是本地账本里的记数。
你为这个 Profile 选的那一本 rulebook 拿到输入后开始判断——是满足买入条件、满足卖出条件,还是两条都不满足。策略在这一步只输出一个决定,它不负责下单,也不负责检查账户是否还有额度。
结果只有三种,其中「什么都不做」是极常见也完全正常的一种。如果你发现机器人长时间没动静,先不要当成故障——官方排错文档给的第一条建议就是去日志里看每个 tick 决定了什么、依据的是哪些数字。
决定之后由执行器负责向币安下单或撤单,同时做幂等控制;状态按币种版本化写回数据库。这一步是「重启不会重复下单」的关键:决定和落单是两段独立的职责,重启后执行器能凭记录判断这笔单是否已经提交过。
满足策略的进场条件时下买单。具体用市价还是挂单,取决于该策略的执行模式设置;Trailing Trade 的入场支持在市价与挂单之间切换。
满足离场条件时下卖单。离场通常由跟踪止损、技术指标强制离场或权重纠偏触发,各策略不同;官方文档说明卖出始终按能成交的方式执行。
两条条件都不满足时,这个 tick 不做任何交易,只把判断结果写进日志。这是最常见的状态,也是判断「机器人是不是坏了」时需要先排除的正常情况。
官方在 README 里把「reliability-first」写成这个项目的卖点之一。拆开看,它不是靠一把大锁,而是靠几条各自很小的机制组合起来,每条都有自己的边界。
| 机制 | 它解决什么 | 官方怎么描述的边界 |
|---|---|---|
| crash-only worker | 进程崩溃或被杀之后能干净重启,并从上一个已提交的状态继续跑 | 官方原话是 crash-only worker;它意味着崩溃被当作正常路径处理,而不是要靠人工介入恢复 |
| 幂等 job | 同一个任务被重复投递时,不会产生第二次副作用 | 幂等的前提是写入路径已被设计成可重复执行,不是靠「不要重复投递」的约定 |
| 按币种的版本化状态提交 | 并发的两次判断不会用旧状态覆盖新状态 | 官方描述为 version-aware per-symbol 的状态提交,即写回时校验版本,版本已变则本次写入作废 |
| 幂等的客户端订单号 | 同一笔单即使重复提交,交易所侧也只会认成一笔 | 它是「不重复下单」这条承诺在交易所侧的落点 |
| 队列任务键合并 | 相同键的任务会被合并成一次执行,避免同一币种被并发处理 | 执行唯一性主要来自队列的任务标识合并,而不是来自外部锁 |
| 没有分布式锁 | —— | 官方明确把这个列为「刻意不做」的设计:唯一性不靠分布式锁,所以不能用「有锁所以安全」的思路去理解它 |
| 单副本策略 | 把执行进程保持在一份,避免多个副本同时决策 | 实盘 worker 目前只允许 1 个副本;多副本的扩展虽然已经合并进代码,但仍处于休眠状态 |
| 行情存活检测与持仓对账 | 静默断流的行情连接会被强制重连,本地记的持仓数量也会向钱包真实值收敛 | 持仓对账是周期性跑动的,所以刚手工改动过钱包之后短时间内看到的状态可能还没对齐 |
面板里点「New profile」会开一个两步向导:第一步给这个配置起个能认出来的名字,第二步选策略。创建完成时就带着该策略的默认参数,可以直接用;参数之后再在 Profile 自己的页面里调。
名字只影响你自己辨认。官方文档给的例子是「BTC cautious」这类能一眼看出用途的名字——当你同时跑好几个 Profile 时,这会明显减少误操作。
一个 Profile 只能选一本 rulebook。三套之间的差别是「各自假设哪种行情会持续」,不是谁更稳;选错策略比选错参数更影响结果。
策略设置表单由所选策略自身的参数结构渲染,因此你只会看到适用于这套策略的字段,字段标签与该策略的官方参考页一一对应。
除了在 Profile 里手写币种清单,还可以打开自动发现(discovery),让它按一组可配置的阈值自行增减要看的币。要注意它默认是关闭的、而且是按 Profile 单独设置。
在 Profile 的发现设置里填一组阈值,例如同时自动持有的上限、24 小时成交额下限、点差上限、涨幅分位区间、市场宽度下限、最短持有时长与相关性上限。官方文档给的起步例子是:自动持仓上限 3、资产 24 小时成交额下限 5000 万美元、交易对成交额下限 50 万美元、点差上限 0.3%。
扫描按一个很小的基础周期自调度,每个 Profile 再按自己的刷新间隔决定这一轮是否真的执行。执行时先拉一次全市场 24 小时行情,解析计价资产的美元价格,映射到该 Profile 的计价资产范围,再跑流动性、点差与涨幅排名的粗筛。
对入围的候选币种拉取 1 小时 K 线,检查历史长度与趋势确认(趋势强度、价格是否在均线之上、成交量是否参与)。只有走到这一步的候选才计入当轮的考察范围。
把「期望的自动币种集合」与当前集合做差,按并发上限、重新加入冷却时间与最短持有时长决定加哪些、减哪些,然后写入或移除绑定,并记录一条操作日志。变更后会让进程重新订阅,新的币种集合在下一个价格更新时开始生效。
| 环节 | 做什么 | 边界 | 注意点 |
|---|---|---|---|
| 开关粒度 | 按 Profile 单独开启或关闭 | 默认关闭;从未开启过的 Profile 不会被这套机制碰过 | 它是 Profile 级设置,不是账户级或全局开关 |
| 宇宙快照 | 每轮记录一份当时可选币种的快照,供之后回看 | 快照默认保留 180 天 | 快照本身不参与下单,只是可回溯的数据 |
| 流动性双下限 | 分别限制资产 24 小时成交额与所交易交易对自身的成交额 | 两个下限分开设:一个防死盘小币,一个防实际成交时滑点过大 | 只设一个是不够的——两种风险不是同一件事 |
| 涨幅分位带 | 只取涨幅排行前若干百分位,并跳过最热的一小段 | 跳过最热的少数百分点是刻意设计的,避免追已经走完的行情 | 分位区间过窄会导致长期没有新币进入 |
| 市场宽度守卫 | 统计全市场上涨比例,低于阈值时这一轮不新增任何币 | 只影响新增,已持有的币不受影响 | 它是一道整体风险开关,不是选币条件 |
| 相关性上限 | 限制新币与已持币种之间的两两相关性 | 目的是避免「同一个市场因子被重复持有多次」 | 相关性高的多个币在纸面上是分散、在风险上是一注 |
| 资产策略准入 | 按币安自身的资产分类排除稳定币与法币 | 分类以币安为准;若上游分类不可用会中止该轮并显式上报 | 中止时会向操作者报告原因,而不是静默跳过 |
| 它决定什么 | 只决定「这个 Profile 看哪些币」 | 不决定何时买卖——买卖仍由策略自己的条件判断 | 所以被自动加入的币可能长期不动:策略的买入条件没满足 |
这两件事都能做,但都不像改一个输入框那么无害。下面把官方文档里明确写出来的行为边界逐条列出来。
| 项 | 说明 | 注意点 |
|---|---|---|
| 中途切换策略 | 可以改,改完就在新策略下运行 | 切换会把配置重置为新策略的默认值:两套策略的参数之间没有自动换算,换完等于从默认配置重新开始 |
| 换完必须先验证 | 新配置要重新过一遍验证流程才能再上实盘 | 官方文档明确建议换策略后先回测新配置再启用;放行依据是配置本身,不是上一次的验证结果 |
| 按币种覆盖 | 部分字段可以在币种页单独覆盖,其余保持 Profile 级取值 | 哪些字段可覆盖由各策略自己决定,例如动量策略开放了几乎全部字段,但 K 线周期与账户上限不可覆盖 |
| 两份配置的来源 | Profile 级配置与币种级覆盖分别存放,生效的是两者合并后的结果 | 排查配置类问题时两份都要看:一份合法不代表合并结果合法 |
| 配置指纹 | 执行相关的参数会参与构成该配置的指纹 | 改了执行参数,指纹就变,之前那次验证结果不再适用于新配置 |
| 保存时出现告警 | 保存策略配置、加币或启动一次验证都成功了,但提示「订单规模未能验证」 | 这不是保存失败:它表示服务器这次没能从缓存里拿到该币的交易规则或现价,因此跳过了一项检查。改动不会回滚,也不需要重做 |
没有官方给出的固定上限,它是「一个账户下 N 个独立配置」的设计。真正限制你的是钱包余额与交易所的最小下单金额:Profile 越多,切分到每个 Profile 的额度越小,越容易因为低于交易所最小下单额而无法下单。具体上限与约束以官方文档和界面提示为准。
会共用同一个钱包,但各自独立决策。官方文档的措辞是它们共享该账户的钱包、但独立决策。因此风险在于预算叠加:若每个 Profile 都按整个账户可用余额设预算,同时触发买入时就可能撞车。按账户整体额度切分是更稳妥的做法;实际可动用额度以交易所侧余额为准。
可以,这正是这套结构的主要用途:一个稳妥的配置和一个更活跃的配置可以并行跑而互不干扰。每个 Profile 只能选一本 rulebook,但不同 Profile 之间可以选不同的那一本。策略的差别与选择方法见策略页,以官方文档为准。
官方明确回答是:重启后会精确地从上次离开的地方继续,并且不会把同一笔单下两次。它靠的是幂等任务、按币种的版本化状态提交与幂等的客户端订单号,而不是分布式锁。这条保证只针对「重复下单」,不涉及任何交易结果——官方同时声明无法保证获利。
目前不能。实盘 worker 只允许一个副本,多副本相关的扩展虽然已经合并进代码但仍然处于休眠状态;官方对提高回测吞吐给出的做法是把回测角色单独拆出来跑,而不是增加实盘 worker 数量。以官方文档与发布说明为准。
有的,但那属于另一条路线。EasyClaw 本机技能里有加密货币行情、策略研究与图表这类研究能力,不需要服务器、也不需要币安 API Key;不过它没有下单类技能,不能执行交易,binance-trading-bot 与 EasyClaw 之间也没有已证实集成。两条路线分别解决什么任务,见导航栏的「对比」页,并以本站对比页与官方文档为准。