钱包是填的数、成交是按规则算的,Freqtrade dry-run 的结果哪些带不到实盘

Freqtrade 的 dry-run(模拟运行)用实时行情跑策略,钱包是配置里填的一个数,订单不会发到交易所,成交由程序按规则算出来。和实盘差得最远的是成交和手续费:市价单按下单那一刻订单簿(盘口上排着的买卖挂单)的挂单量算成交,滑点(成交价比下单时看到的价格差出去的那一截)最多算到 5%;限价单只要价格到了挂单价就记为成交;手续费用的是交易所默认那一档费率,和你账户实际付的可能不一样。
新装好的 Freqtrade 默认就在这个模式里:配置项 dry_run 的默认值是 true,改成 false 并填上交易所的 API 密钥,程序才会动真钱。Freqtrade 文档讲切换实盘的那一小节开头就提醒,一个错的策略可以亏掉全部资金。
Freqtrade 的 dry-run 和回测有什么不同
回测是把历史数据一次读进来,按 K 线一根一根往后过,在每根 K 线上模拟买入和卖出。它对成交的假设很宽:没有自定义出价逻辑时按开盘价进场;只要你要的价格落在那根 K 线的最高价和最低价之间,订单就按这个价成交,不计滑点。
dry-run 和实盘用的是同一条启动命令(freqtrade trade),跑的也是同一个循环:读出还没平仓的交易,算出当前可交易的交易对,下载这些交易对的 K 线,逐个交易对跑策略,更新挂单状态,检查要不要平仓,有空位再看进场信号。两者分开的地方在钱包和订单:实盘读账户的真实余额,把订单发给交易所;dry-run 用模拟钱包,在本地记一笔模拟订单。
所以 dry-run 能看到回测看不到的东西:程序连续运行时的表现,限价单挂出去之后等不等得到成交,以及一段还没发生的行情。回测过完几个月的数据不需要等几个月,dry-run 只能按真实时间走,一天得到一天的结果。Freqtrade 的回测文档里有一句:回测永远替代不了在 dry-run 模式下跑策略。
反过来,dry-run 也有自己的假设。回测假设"价格在 K 线范围内就成交",dry-run 换成了另一套规则,比回测细,但仍然是规则。
Freqtrade 文档列的 8 条 dry-run 注意事项,逐条对到实盘
这 8 条在 Freqtrade 稳定版文档 Configuration 页的 "Considerations for dry-run" 小节,下表第一列是这一小节 2026 年 10 月的内容;手续费的算法见 Bot Basics 页,回测的成交假设见 Backtesting 页。
| dry-run 里的做法 | 实盘里会怎样 | 切换前核对什么 |
|---|---|---|
| 1. 只做只读调用,不改变账户状态;API 密钥可填可不填 | 必须有能下单的密钥。密钥权限不够、订单被交易所拒绝这类错误,dry-run 里一次都碰不到 | 密钥的权限只开到交易需要的那几项;密钥单独放一个配置文件 |
| 2. 钱包余额是模拟的,按 dry_run_wallet 的值算,默认 1000 | 程序读的是账户真实余额,盈亏直接落在这个余额上 | 把模拟钱包改成打算投入的金额,再跑一段 |
| 3. 订单是模拟的,不发到交易所 | 订单要进交易所撮合,可能被拒,可能只成交一部分 | 准备用小金额在实盘验证下单这一步 |
| 4. 市价单按下单瞬间订单簿的挂单量成交,滑点上限 5% | 真实市场没有 5% 这个上限。每单金额相对盘口越大,吃到的价格越差 | 看模拟成交价和下单时的市价差多少,差得大的交易对考虑剔掉 |
| 5. 限价单价格到了挂单价就成交,到不了按挂单超时设置取消 | 价格到了不一定轮到你,同价位排在前面的挂单先成交 | 数一下限价单成交和超时取消各多少笔 |
| 6. 限价单越过市价超过 1% 时转成市价单,立刻按第 4 条成交 | 这样的单在实盘同样会立刻吃单,成交价由当时真实的挂单决定 | 检查策略的出价,别让出价越过市价太多 |
| 7. 开了交易所端止损(止损单提前挂在交易所)时,止损价假定成交 | 止损单触发后的成交价看当时盘口,行情走得快时可能比止损价差 | 估算亏损时,在止损幅度上再留一点余地 |
| 8. 重启后未成交的订单保留,假定离线期间没有成交 | 程序停着的那段时间,挂在交易所的订单照样可能成交 | 重启后对一遍程序记的持仓、挂单和交易所账户里的是否一致 |
市价单那 5%。dry-run 会去看下单瞬间的订单簿,按上面的挂单量来算成交,这比回测的"无滑点"贴近实盘得多。但算出来的滑点封顶在 5%,真实市场没有这个封顶;另外模拟单不会真的吃掉任何挂单,你的单对盘口造成的影响在 dry-run 里是看不到的。
限价单的两条规则。价格到达挂单价,dry-run 就记为成交。真实的订单簿在同一个价位上有先后顺序,价格碰一下就回头时,排在后面的挂单可能一点都没成交。靠挂单进场的策略要重点看这一条:dry-run 里记成"成交"的单,放到实盘可能有一部分没买到。另一条是越价:买单出价高过市价、卖单出价低过市价超过 1%,dry-run 把它当市价单,马上按市价单的规则成交。
钱包和持仓记在本地。dry-run 的余额从 dry_run_wallet 起算,每一笔模拟交易写进本地数据库,程序报出来的余额和持仓都是从这份记录里算的。交易所那边没有任何对应的东西,所以也不存在"程序记的和交易所不一致"这种情况。实盘里这种不一致是会发生的,第 8 条说的重启就是一个入口。
8 条之外还有手续费。Freqtrade 所有的利润计算都含手续费,回测、参数优化和 dry-run 用的是交易所的默认费率(账户等级最低的那一档)。配置里有一个手续费参数可以覆盖它,一般不需要设。账户实际费率和默认档不同的话,每一笔的利润都会和 dry-run 里记的差一点,交易次数多的策略差得更明显。
从 dry-run 切到实盘之前,可以逐项核对的几件事
切换动作本身有两步:把 dry_run 改成 false;填上交易所的 API 密钥。配置里手动填过数据库地址(db_url)的,再换成一个新的,免得 dry-run 的模拟交易记录混进实盘的账里。密钥建议单独放一个配置文件,这个文件和密钥不发给任何人。
最小下单额要单独说一下。交易所对每个交易对有最小下单量或最小金额的限制。Freqtrade 会在这个下限上加一点余量(默认 5%),再把止损幅度算进去,得出它自己的最小每单金额;文档给的范围是,算出来的数不会比真实下限高出 50% 以上。把每单金额调得很小时,要确认它还在这个数之上。
· 模拟钱包改成真实金额。dry_run_wallet 默认是 1000。真实资金和它不一样时,这段 dry-run 的盈亏金额不能直接搬到你的账户上,改成打算投入的数再跑。
· 数限价单。成交多少笔,超时取消多少笔。取消的占比高,说明出价离市价远;成交的那些里,价格刚到就回头的,实盘里未必轮得到你。
· 对手续费。在交易所的费率页查账户当前的实际费率,和默认那一档比。不一样就按实际费率把利润重算一遍,或者填上手续费参数再跑一段。
· 查最小下单额。把打算交易的交易对逐个看一遍,调小后的每单金额低于下限的,先从列表里拿掉。
· 每单金额调小。实盘头一段用小金额,每成交一笔,拿交易所的成交价和手续费跟程序记的数对一遍,对不上就先停下来查。
真实成交价、限价单排不排得到、止损单最后成交在哪,这几样只有真实订单能给出答案。决定上实盘的话,金额调小这一项建议别跳过:同样的偏差,金额小的时候代价也小。
dry-run 收益好看,为什么还说明不了实盘能赚
一段 dry-run 跑下来是正收益,能确认的事有限:程序在这段时间里连续跑住了,策略在实时行情上出了信号,按模拟规则记的账是正的。
· 成交价。市价单的模拟滑点有 5% 的封顶,模拟单也不影响盘口。
· 限价单的成交率。到价即成交是规则,实盘要排队。
· 止损能按价成交。交易所端止损在 dry-run 里是假定成交的。
· 别的行情。它只覆盖运行的那一段,这段是涨、是跌还是横盘,结果就带着这段行情的样子。
· 下单这条路走得通。密钥权限、订单被拒、请求超时,dry-run 里都没有经过。
交易笔数少的时候还要多看一眼。比如一共十几笔交易,其中两三笔大赚,整段曲线就很好看;换一段行情,这两三笔未必还在。dry-run 按真实时间走,想攒够笔数只能多等。
比较稳的用法是把 dry-run 当一道筛子。回测好看、dry-run 明显变差的策略,可以回头查回测那套宽松的成交假设,这样的策略不用上实盘。dry-run 也过得去、你又决定上实盘的,它证明不了的那几样只能靠小金额的真实订单去看,这一步照样可能亏钱。
接着读:参数定下来之后开模拟盘,拿到的是一段没法提前看的数据,这层意思在 样本外检验怎么切数据 里讲过;上了实盘之后,程序停过一阵再起来为什么要重新核对持仓,写在 自动下单程序的九类故障先查什么 里;实盘里下单请求发出去却迟迟没有回应,读 下单请求超时后先查单。