第 3 章 · 04 minimalroi 与 stoploss 本节摘要:信号决定「何时进」,而风控决定「何时出」——哪怕信号没出场。本节讲透 freqtrade 的两个最基础也最重要的风控工具: (最小投资回报表,达到目标利润自动平仓)与 (止损比例)。 不是单一数字,而是一张「时间-收益阶梯表」,持有越久门槛越低; 是兜底的「硬止损」,触及即平。两者与第 03 节的出场信号、第 4 章的追踪止损共同构成出场逻辑,且都能被配置文件覆盖。读完本节,你能为策略设计一套合理的「见好就收 + 兜底止损」组合,并理解配置覆盖的优先级。 内容来源:原项目源码 、文档 ,汉化并套用体系化模板。 ⚠️ 风险提示:没有止损的策略不是策略,是赌注。哪怕回测再好看,实盘黑天鹅会让单笔亏损无下限。
本节摘要:信号决定「何时进」,而风控决定「何时出」——哪怕信号没出场。本节讲透 freqtrade 的两个最基础也最重要的风控工具:
minimal_roi(最小投资回报表,达到目标利润自动平仓)与stoploss(止损比例)。minimal_roi不是单一数字,而是一张「时间-收益阶梯表」,持有越久门槛越低;stoploss是兜底的「硬止损」,触及即平。两者与第 03 节的出场信号、第 4 章的追踪止损共同构成出场逻辑,且都能被配置文件覆盖。读完本节,你能为策略设计一套合理的「见好就收 + 兜底止损」组合,并理解配置覆盖的优先级。
内容来源:原项目源码
freqtrade/templates/sample_strategy.py、文档docs/strategy-101.md,汉化并套用体系化模板。
⚠️ 风险提示:没有止损的策略不是策略,是赌注。哪怕回测再好看,实盘黑天鹅会让单笔亏损无下限。任何实盘策略都必须配置合理的
stoploss。
阅读完本节,你应当能够:
minimal_roi 阶梯表的解读规则。stoploss 兜底止损。ignore_roi_if_entry_signal、exit_profit_only 调整行为。minimal_roi 不是单一数字,而是一张字典,键是「进场后第 N 分钟」,值是「达到该收益率就平仓」:
minimal_roi = { "0": 0.04, # 进场 0 分钟后:盈利 4% 就平 "30": 0.02, # 进场 30 分钟后:盈利 2% 就平 "60": 0.01, # 进场 60 分钟后:盈利 1% 就平 # "120": 0.0, # 进场 120 分钟后:盈利 0%(保本)就平 }
解读规则:
💡 核心心法:这个设计的本质是「承认市场不可预测」——刚进场时你对这笔交易最有信心(要 4%);如果持仓 2 小时还没达成目标,说明行情没你想的那样,不如保本走人(0%)。它把「时间衰减」编码进了出场逻辑。
minimal_roi = { "0": 0.10, # 立即:要 10% "20": 0.05, # 20 分钟后:5% "40": 0.0, # 40 分钟后:保本就走 }
适合高频(5m 以下)的「打一枪就跑」策略。
minimal_roi = { "0": 0.05, "120": 0.03, "360": 0.01, "720": 0.0, # 12 小时保本 }
适合 1h 或更长周期、趋势跟随的策略。
minimal_roi = {"0": 100} # 设个不可能达到的大数
或干脆:
minimal_roi = {} # 空 dict,完全不用 ROI 出场
完全依赖出场信号或止损——只在你真的信任出场信号时才这么做。
stoploss = -0.10 # 亏损 10% 自动平仓
含义:进场后,相对入场价的浮亏达到 10%,无条件平仓。
注意几点:
stoploss 永远是负数(因为是亏损比例)。写 -0.10 表示 10% 止损。⚠️ 止损不是「保险丝」是「断路器」:止损成交那一刻,亏损已经发生——它不能防止亏损,只能限制亏损不再扩大。设 -10% 不代表最多亏 10%,实盘滑点可能让实际成交在 -11% 甚至更低(尤其剧烈下跌时)。
这三种出场是**「或」关系**——任意一个触发就平仓:
| 出场来源 | 触发条件 | 典型用途 |
|---|---|---|
minimal_roi |
浮盈达到当前阶梯门槛 | 见好就收、锁定利润 |
stoploss |
浮亏达到止损比例 | 兜底、防黑天鹅 |
populate_exit_trend |
出场信号列 exit_long=1 |
策略主动出场 |
custom_exit(第 4 章) |
自定义回调返回非空 | 复杂逻辑出场 |
custom_stoploss(第 4 章) |
自定义止损回调 | 动态/追踪止损 |
理解「或」关系很重要——你不需要在策略里重复检查止损条件。你只管写信号出场,引擎会自动叠加 ROI 和止损。
# 即使达到 ROI,但如果仍有入场信号,不平仓(忽略 ROI) ignore_roi_if_entry_signal = True # 仅在盈利时才用出场信号(避免亏损时被信号平在最低点) exit_profit_only = False # 是否使用 populate_exit_trend 的出场信号 use_exit_signal = True
ignore_roi_if_entry_signal=True:达到 ROI 本该平仓,但如果此刻仍有进场信号,就再等等——适合趋势跟随(避免被小回调洗下车)。exit_profit_only=True:出场信号只在盈利时才生效,亏损时只能靠止损/ROI。避免「信号让你亏着平」。use_exit_signal=False:完全不用信号出场,只靠 ROI + 止损。💡 新人的默认选择:三个开关都保持默认(
use_exit_signal=True、exit_profit_only=False、ignore_roi_if_entry_signal=False)。先让三种出场各司其职,熟悉后再做精细调整。
这是新手最常踩的坑:minimal_roi 和 stoploss 既可以写在策略里(类属性),也可以写在配置 JSON 里。JSON 优先。
// config.json { "minimal_roi": { "0": 0.05, "60": 0.02 }, "stoploss": -0.15 }
含义:即使你的策略文件里写了 stoploss = -0.10,实盘/回测用的都是 JSON 里的 -0.15。
⚠️ 常见排查:「我改了策略里的 stoploss 怎么不生效?」——八成是配置 JSON 里有同名字段覆盖了。检查
config.json的stoploss和minimal_roi,删掉或同步即可。回测时用--config指定的文件会覆盖策略。
实战经验法则:
stake_amount 占总资金 5%,那 stoploss 应 ≤ -20%。minimal_roi 键是「进场后第 N 分钟」,值是「达到该收益率就平」;持有越久门槛越低,本质是把时间衰减压进出场。ignore_roi_if_entry_signal(ROI 时若有信号再等)、exit_profit_only(仅盈利时用信号)、use_exit_signal(开/关信号出场)。minimal_roi、stoploss 覆盖策略类属性;排查「改了不生效」先看 JSON。下一节,我们把前三节学的指标、信号、风控串起来,精读官方 sample_strategy 的完整代码,跑通你的第一个完整策略。