运行模型 · 账户 → 币安账户 → Profile

binance-trading-bot 的账户与 Profile:一笔交易是怎么被决定和下出去的

它不是一个机器人管一个账户的结构。一个操作员账号下可以挂多个币安账户,每个账户又能同时跑多个互相独立的 Profile,每个 Profile 有自己的币种、预算与策略,但共享同一个钱包。下面把层级结构、一次价格更新的完整决策链,以及它靠什么保证重启后不会重复下单,一次讲清楚。

层级:操作员 → 币安账户 → Profile决策单位:一次价格更新 = 一个 tick依据官方 configure / strategies / reliability 文档(2026-09-17 核验)

一次 tick 的决策链

币安行情更新WebSocket 推送该币种最新价与 K 线
取输入最新价 / 近期 K 线 / 钱包余额 / Profile 设置
策略规则判定读你为这个 Profile 选的那一本 rulebook
执行器落单幂等下单,再按 symbol 版本化提交状态
一次价格更新的决策链示意图(依据官方 strategies / architecture 文档绘制)。决策与落单是分开的两段:策略只负责决定,Executor 负责落单与幂等,因此崩溃重启后会续跑而不会重复下单。
Structure

三层结构:哪些是独立的,哪些是共享的

把「谁和谁共享钱」搞清楚,是配置这个机器人时最容易出错、也最容易亏到糊涂的地方。下表按层级拆开,最后一列专门写容易误判的点。

层级它是什么各自独立共享注意点
操作员账号你登录这个实例的单一 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 目前只允许单副本,多副本的扩展虽已合并但处于休眠状态
共享钱包意味着风险也是共享的:两个 Profile 各自的计算都不会看到对方的仓位,但它们花的是同一个账户里的钱。若两个 Profile 的预算都按「整个账户可用余额」来设定,一旦同时触发买入,可能出现实际可动用额度被一个 Profile 先占掉、另一个 Profile 下单失败或被交易所拒绝的情况。稳妥做法是按账户整体额度切分,而不是各自都按全额设定。
Tick lifecycle

一次价格更新到一笔订单:四步走完

官方把整套机制压缩成一句话:对每个你指定要看的币,反复跑一个很短的循环。这个循环叫 tick,无论你选的是哪一本 rulebook,形状都一样。

  1. 取输入:把这一次判断需要的材料凑齐

    币安推送来该币种的最新价格与近期 K 线,进程再读一次这个账户的钱包余额,加上这个 Profile 自己的设置。这一步不产生任何决定,只是把判断依据取齐。要注意的是钱包余额读的是交易所侧的真实快照,不是本地账本里的记数。

  2. 跑规则:由策略决定该做什么

    你为这个 Profile 选的那一本 rulebook 拿到输入后开始判断——是满足买入条件、满足卖出条件,还是两条都不满足。策略在这一步只输出一个决定,它不负责下单,也不负责检查账户是否还有额度。

  3. 三分支:买、卖,或者什么都不做

    结果只有三种,其中「什么都不做」是极常见也完全正常的一种。如果你发现机器人长时间没动静,先不要当成故障——官方排错文档给的第一条建议就是去日志里看每个 tick 决定了什么、依据的是哪些数字。

  4. 落单与落库:交给执行器,并留下可复盘的记录

    决定之后由执行器负责向币安下单或撤单,同时做幂等控制;状态按币种版本化写回数据库。这一步是「重启不会重复下单」的关键:决定和落单是两段独立的职责,重启后执行器能凭记录判断这笔单是否已经提交过。

满足策略的进场条件时下买单。具体用市价还是挂单,取决于该策略的执行模式设置;Trailing Trade 的入场支持在市价与挂单之间切换。

满足离场条件时下卖单。离场通常由跟踪止损、技术指标强制离场或权重纠偏触发,各策略不同;官方文档说明卖出始终按能成交的方式执行。

什么都不做

两条条件都不满足时,这个 tick 不做任何交易,只把判断结果写进日志。这是最常见的状态,也是判断「机器人是不是坏了」时需要先排除的正常情况。

怎么确认它真的在跑:面板顶部的账户健康条会显示执行进程最近有没有心跳,以及今天是否有 Profile 因风控断路器被暂停。健康条每一枚芯片的含义与处置动作,见风控页。
Reliability

重启不重复下单靠的是什么

官方在 README 里把「reliability-first」写成这个项目的卖点之一。拆开看,它不是靠一把大锁,而是靠几条各自很小的机制组合起来,每条都有自己的边界。

机制它解决什么官方怎么描述的边界
crash-only worker进程崩溃或被杀之后能干净重启,并从上一个已提交的状态继续跑官方原话是 crash-only worker;它意味着崩溃被当作正常路径处理,而不是要靠人工介入恢复
幂等 job同一个任务被重复投递时,不会产生第二次副作用幂等的前提是写入路径已被设计成可重复执行,不是靠「不要重复投递」的约定
按币种的版本化状态提交并发的两次判断不会用旧状态覆盖新状态官方描述为 version-aware per-symbol 的状态提交,即写回时校验版本,版本已变则本次写入作废
幂等的客户端订单号同一笔单即使重复提交,交易所侧也只会认成一笔它是「不重复下单」这条承诺在交易所侧的落点
队列任务键合并相同键的任务会被合并成一次执行,避免同一币种被并发处理执行唯一性主要来自队列的任务标识合并,而不是来自外部锁
没有分布式锁——官方明确把这个列为「刻意不做」的设计:唯一性不靠分布式锁,所以不能用「有锁所以安全」的思路去理解它
单副本策略把执行进程保持在一份,避免多个副本同时决策实盘 worker 目前只允许 1 个副本;多副本的扩展虽然已经合并进代码,但仍处于休眠状态
行情存活检测与持仓对账静默断流的行情连接会被强制重连,本地记的持仓数量也会向钱包真实值收敛持仓对账是周期性跑动的,所以刚手工改动过钱包之后短时间内看到的状态可能还没对齐
实践含义:这套机制保证的是「不会因为重启而把同一笔单下两次」,它不保证任何交易结果。官方同时声明无法保证是否能够获利,并明确不建议投入真实资金——可靠性机制与交易风险是两件互不相干的事。
Create a profile

建一个 Profile 只要两步

面板里点「New profile」会开一个两步向导:第一步给这个配置起个能认出来的名字,第二步选策略。创建完成时就带着该策略的默认参数,可以直接用;参数之后再在 Profile 自己的页面里调。

binance-trading-bot 新建交易 Profile 的向导界面截图
新建 Profile 向导(来源:项目官方文档 docs/assets/screenshots/get-started/profile-wizard.png,Apache-2.0)。官方声明指南内截图均为种子演示数据,非真实账户。

第一步:命名

名字只影响你自己辨认。官方文档给的例子是「BTC cautious」这类能一眼看出用途的名字——当你同时跑好几个 Profile 时,这会明显减少误操作。

第二步:选策略

一个 Profile 只能选一本 rulebook。三套之间的差别是「各自假设哪种行情会持续」,不是谁更稳;选错策略比选错参数更影响结果。

创建之后:调参

策略设置表单由所选策略自身的参数结构渲染,因此你只会看到适用于这套策略的字段,字段标签与该策略的官方参考页一一对应。

Coin discovery

币种可以手工列,也可以让它自己找

除了在 Profile 里手写币种清单,还可以打开自动发现(discovery),让它按一组可配置的阈值自行增减要看的币。要注意它默认是关闭的、而且是按 Profile 单独设置。

  1. 打开并设置阈值

    在 Profile 的发现设置里填一组阈值,例如同时自动持有的上限、24 小时成交额下限、点差上限、涨幅分位区间、市场宽度下限、最短持有时长与相关性上限。官方文档给的起步例子是:自动持仓上限 3、资产 24 小时成交额下限 5000 万美元、交易对成交额下限 50 万美元、点差上限 0.3%。

  2. 周期扫描并做粗筛

    扫描按一个很小的基础周期自调度,每个 Profile 再按自己的刷新间隔决定这一轮是否真的执行。执行时先拉一次全市场 24 小时行情,解析计价资产的美元价格,映射到该 Profile 的计价资产范围,再跑流动性、点差与涨幅排名的粗筛。

  3. 拉 K 线做确认

    对入围的候选币种拉取 1 小时 K 线,检查历史长度与趋势确认(趋势强度、价格是否在均线之上、成交量是否参与)。只有走到这一步的候选才计入当轮的考察范围。

  4. 与当前集合求差并应用

    把「期望的自动币种集合」与当前集合做差,按并发上限、重新加入冷却时间与最短持有时长决定加哪些、减哪些,然后写入或移除绑定,并记录一条操作日志。变更后会让进程重新订阅,新的币种集合在下一个价格更新时开始生效。

环节做什么边界注意点
开关粒度按 Profile 单独开启或关闭默认关闭;从未开启过的 Profile 不会被这套机制碰过它是 Profile 级设置,不是账户级或全局开关
宇宙快照每轮记录一份当时可选币种的快照,供之后回看快照默认保留 180 天快照本身不参与下单,只是可回溯的数据
流动性双下限分别限制资产 24 小时成交额与所交易交易对自身的成交额两个下限分开设:一个防死盘小币,一个防实际成交时滑点过大只设一个是不够的——两种风险不是同一件事
涨幅分位带只取涨幅排行前若干百分位,并跳过最热的一小段跳过最热的少数百分点是刻意设计的,避免追已经走完的行情分位区间过窄会导致长期没有新币进入
市场宽度守卫统计全市场上涨比例,低于阈值时这一轮不新增任何币只影响新增,已持有的币不受影响它是一道整体风险开关,不是选币条件
相关性上限限制新币与已持币种之间的两两相关性目的是避免「同一个市场因子被重复持有多次」相关性高的多个币在纸面上是分散、在风险上是一注
资产策略准入按币安自身的资产分类排除稳定币与法币分类以币安为准;若上游分类不可用会中止该轮并显式上报中止时会向操作者报告原因,而不是静默跳过
它决定什么只决定「这个 Profile 看哪些币」不决定何时买卖——买卖仍由策略自己的条件判断所以被自动加入的币可能长期不动:策略的买入条件没满足
计价资产不在发现设置里:它是 Profile 上的一个一等属性(官方默认 USDT),在 Profile 设置页修改,修改后由扫描任务自动重新加载。改成新计价资产时,旧计价资产的既有持仓会被保留而不是强制卖出。
Overrides and switches

按币种覆盖与中途换策略,各有各的坑

这两件事都能做,但都不像改一个输入框那么无害。下面把官方文档里明确写出来的行为边界逐条列出来。

说明注意点
中途切换策略可以改,改完就在新策略下运行切换会把配置重置为新策略的默认值:两套策略的参数之间没有自动换算,换完等于从默认配置重新开始
换完必须先验证新配置要重新过一遍验证流程才能再上实盘官方文档明确建议换策略后先回测新配置再启用;放行依据是配置本身,不是上一次的验证结果
按币种覆盖部分字段可以在币种页单独覆盖,其余保持 Profile 级取值哪些字段可覆盖由各策略自己决定,例如动量策略开放了几乎全部字段,但 K 线周期与账户上限不可覆盖
两份配置的来源Profile 级配置与币种级覆盖分别存放,生效的是两者合并后的结果排查配置类问题时两份都要看:一份合法不代表合并结果合法
配置指纹执行相关的参数会参与构成该配置的指纹改了执行参数,指纹就变,之前那次验证结果不再适用于新配置
保存时出现告警保存策略配置、加币或启动一次验证都成功了,但提示「订单规模未能验证」这不是保存失败:它表示服务器这次没能从缓存里拿到该币的交易规则或现价,因此跳过了一项检查。改动不会回滚,也不需要重做
两份配置分别存在哪里profiles.config ← Profile 级策略配置 profile_symbols.override_config ← 该币种上的覆盖配置(生效的是两者合并后的结果)
排查时的顺序:先确认 Profile 级配置合法,再确认该币种的覆盖里没有越界的取值——一份合法的 Profile 配置,正是非法覆盖最容易藏身的地方。具体自查语句见排错页。
FAQ

关于账户与 Profile 的常见问题

一个币安账户能跑几个 Profile?

没有官方给出的固定上限,它是「一个账户下 N 个独立配置」的设计。真正限制你的是钱包余额与交易所的最小下单金额:Profile 越多,切分到每个 Profile 的额度越小,越容易因为低于交易所最小下单额而无法下单。具体上限与约束以官方文档和界面提示为准。

两个 Profile 会不会抢同一笔钱?

会共用同一个钱包,但各自独立决策。官方文档的措辞是它们共享该账户的钱包、但独立决策。因此风险在于预算叠加:若每个 Profile 都按整个账户可用余额设预算,同时触发买入时就可能撞车。按账户整体额度切分是更稳妥的做法;实际可动用额度以交易所侧余额为准。

不同 Profile 能用不同策略吗?

可以,这正是这套结构的主要用途:一个稳妥的配置和一个更活跃的配置可以并行跑而互不干扰。每个 Profile 只能选一本 rulebook,但不同 Profile 之间可以选不同的那一本。策略的差别与选择方法见策略页,以官方文档为准。

重启之后会不会重复下单?

官方明确回答是:重启后会精确地从上次离开的地方继续,并且不会把同一笔单下两次。它靠的是幂等任务、按币种的版本化状态提交与幂等的客户端订单号,而不是分布式锁。这条保证只针对「重复下单」,不涉及任何交易结果——官方同时声明无法保证获利。

能不能多开几个 worker 提高处理速度?

目前不能。实盘 worker 只允许一个副本,多副本相关的扩展虽然已经合并进代码但仍然处于休眠状态;官方对提高回测吞吐给出的做法是把回测角色单独拆出来跑,而不是增加实盘 worker 数量。以官方文档与发布说明为准。

我只想看看数据、不想搭这套账户与 Profile 结构,有更省事的办法吗?

有的,但那属于另一条路线。EasyClaw 本机技能里有加密货币行情、策略研究与图表这类研究能力,不需要服务器、也不需要币安 API Key;不过它没有下单类技能,不能执行交易,binance-trading-bot 与 EasyClaw 之间也没有已证实集成。两条路线分别解决什么任务,见导航栏的「对比」页,并以本站对比页与官方文档为准。

结构清楚了,接下来该挑策略

Profile 建好之后,真正影响它怎么动的是你选的那一本 rulebook。先看清三套策略各自假设哪种行情,再去配置参数。