v7 · 阶段 C

止损改成 ATR

市场抖得凶,止损放远;市场很静,止损收近。远近用平均抖动来量。

atr_period stop_n=2 stoploss 兜底 use_custom_stoploss

1一句话

止损不要写死 12%。市场抖得凶,止损放远一点;市场很静,止损收近一点。远近用最近的平均抖动来量。

2生活类比

海龟派的尺子叫 N。N 就是最近这段路,价格平均一天晃多少。止损放在入场价下方 2 个 N。路晃得大,安全距离也变大;路很平,你贴得更近。

3搬到这版

量抖动populate_indicators 里算 ATR,当作 N。
按笔算custom_stoploss 用入场时的 N,止损价 = 入场价 - 2N。
开关use_custom_stoploss = True,否则还是固定百分比。
地板策略里的 stoploss 仍要留着,custom 算不出来时用它兜底。
来源想法来自海龟 2N。海龟 4h 版用 20 日 ATR(约 120 根)。这课先讲清 2N,不要抄数字充懂。

4每个新参数

atr_period = 先能讲清再选

用多少根来量「平均晃多少」。N 的窗口。

它是什么
ATR 的周期。算出来的值就是这根 K 附近的平均波动。
不管它会怎样
不管它:没有 N,custom 止损算不出来,退回地板。
拧大 / 拧小 / 拧反了
拧小:N 跟得紧,止损乱跳。拧大:N 更稳,反应慢。海龟原版是 20 日;4h 上 20 日约 120 根。先讲清再选。
stop_n = 2

几个 N 当安全距离。2 就是入场价下方两倍平均抖动。

它是什么
止损距离 = N × 这个倍数。海龟经典是 2N。
不管它会怎样
不管它:等于没用 ATR,还是固定百分比。
拧大 / 拧小 / 拧反了
拧到 3:更能扛,单笔亏更多。拧到 1:更早砍,更容易被震出去。拧成 0 或负数:止损无意义或算反。
stoploss 兜底 = 地板,不是主出场

备用灭火器。主尺子坏了,至少还有一条死线。

它是什么
custom 算不出来时退回的固定止损。海龟 4h 用过 -0.25 当地板。
不管它会怎样
不管它、仍写 -0.99:custom 失败时等于没有地板。
拧大 / 拧小 / 拧反了
拧得比 2N 还近:地板先触发,ATR 白写。拧得太远:只防极端事故。主出场是 2N,不是这条。
use_custom_stoploss = True

打开「每笔按当时的 N 算止损」。

它是什么
True 时走 custom_stoploss。False 时永远用固定百分比。
不管它会怎样
不管它(False):回到 v3 的死 12%。
拧大 / 拧小 / 拧反了
拧成 False:ATR 算了也不用。没有第三档,就是开或关。

5假懂

人们会说:「ATR 止损更先进所以回撤一定更小」
更短的一句:波动大时它故意放宽,回撤可能更大,换来少被震出去。和固定 -12% 比谁先被打掉,数你自己跑。

6你来讲

答得出来,这课才过关。不要用「更科学」代替这三个问题。

  1. N 是什么?2N 是离入场价多远?
  2. 为什么还要留一个固定 stoploss 地板?
  3. 波动突然变大,止损是变宽还是变窄?

7这版代码

只放这版新加的量尺和按笔止损。数字先当骨架,回测结果你自己填。

use_custom_stoploss = True
stoploss = -0.25          # 地板
atr_period = 14           # 先能讲清再改
stop_n = 2.0

# populate_indicators
dataframe["atr"] = ta.ATR(dataframe, timeperiod=self.atr_period)

# custom_stoploss 里(入场那根的 ATR)
stop_price = trade.open_rate - self.stop_n * n
return (stop_price / current_rate) - 1

8过关

能讲清和固定 -12% 比,谁先被打掉、回撤可能差在哪。不编数字。

能指出 custom 失败时,走的是哪一条地板。