进阶 · 代码逐项

一目均衡 · 代码逐项

对着 Ichimoku4h.py 从上往下走。云转绿且价在云上买,反过来卖。不用迟行线。

Ichimoku4h.py 4h 20/60/120/30 无 chikou

1怎么走

社区云交叉逻辑,周期按 4h 放大成 20 / 60 / 120 / 30。文件只把转换线、基准线、两条先行带和云的颜色写进表。迟行线不写,因为它会看未来。

2逐项

每一项是文件里的原文,不是口诀。先看黑底那几行,再听人话,再答三问。

class Ichimoku4h(IStrategy)
class Ichimoku4h(IStrategy):

向引擎登记这份 4 小时一目。对照选的是类名。

它是什么
策略类。
不管它会怎样
没有这个类,回测选不中。
拧大 / 拧小 / 拧反
改名以后配置里的策略名要对上。
INTERFACE_VERSION = 3
    INTERFACE_VERSION = 3

按第三版接口读 enter / exit。

它是什么
接口版本号。
不管它会怎样
版本对不上,进出场字段对不齐。
拧大 / 拧小 / 拧反
拧成 2:新字段名会被旧约定忽略。
timeframe = "4h"
    timeframe = "4h"

每根 K 是 4 小时。下面四个周期是按这根时钟从 9/26/52/26 放大的。

它是什么
采样间隔。
不管它会怎样
落成 1d 或 5m,20/60/120 的含义全变。
拧大 / 拧小 / 拧反
拧周期不同时改四个参数:云不再是「4h 版经典一目」。
startup_candle_count = 200
    startup_candle_count = 200

先丢掉大约 200 根。注释写了:滞后线 120 加位移 30,再留一点余量。

它是什么
暖机根数。云算稳之前不交易。
不管它会怎样
暖机短于 150,前面一段先行带是空的,交叉条件不成立或用半残的云。
拧大 / 拧小 / 拧反
拧到 50:云还没成形就开算。拧到 2000:白白丢掉很长一段。
process_only_new_candles = True
    process_only_new_candles = True

只在 4h 收盘时看云有没有翻色。云本来就慢,不在未收盘的 K 上抢跑。

它是什么
只处理收盘。
不管它会怎样
未收盘就判交叉,云会在一根 K 里闪绿闪红。
拧大 / 拧小 / 拧反
拧成 False:盘中刺穿先行带就会提前下手。
can_short = False
    can_short = False

只做多。云转红是平多,不是开空。

它是什么
空仓开关。关着。
不管它会怎样
有人看见云红就想做空。这份没有 enter_short。
拧大 / 拧小 / 拧反
拧成 True:还要自己写空头条件,开关本身不会开空。
use_exit_signal = True
    use_exit_signal = True

云转红那行 exit_long,引擎会听。主出场是云,不是 ROI。

它是什么
出信号门开着。
不管它会怎样
门关着,云翻红也不卖,只剩 -12% 地板。
拧大 / 拧小 / 拧反
拧成 False:结构派少了主出场。
exit_profit_only = False
    exit_profit_only = False

亏着也能按云翻红卖。结构翻了就走,不等解套。

它是什么
出信号是否只许盈利时触发。这里不限制。
不管它会怎样
拧成 True:云已经转红,浮亏还在扛,回撤会更深。
拧大 / 拧小 / 拧反
拧反 True:和「结构翻了就走」相反。
ignore_roi_if_entry_signal = False
    ignore_roi_if_entry_signal = False

如果 ROI 真的碰到了,入场信号不能把它按住。这版 ROI 几乎焊死,这行很少派上用场。

它是什么
入场信号是否压住 ROI。这里不压。
不管它会怎样
这版 ROI 是 10 倍,本来就碰不到。这行是接口占位。
拧大 / 拧小 / 拧反
拧成 True:只在 ROI 真开门时才有差别。这版几乎没差别。
minimal_roi = {"0": 10}
    minimal_roi = {"0": 10}

一上车要涨 10 倍才用 ROI。注释写了:几乎关掉 ROI,让云翻色自己出场。

它是什么
ROI 表。门槛抬到几乎碰不到。
不管它会怎样
默认小 ROI 会先于云翻红把仓平了,慢结构还没说话。
拧大 / 拧小 / 拧反
拧小:闹钟先响,一目变成短线。
stoploss = -0.12
    stoploss = -0.12

硬止损 12%。注释写了:只防暴跌,主出场仍是云翻红。

它是什么
暴跌地板,不是主卖点。
不管它会怎样
没有地板,云还没翻,暴跌会把回撤拉穿。
拧大 / 拧小 / 拧反
拧到 -0.03:地板比云更敏,结构派还没翻你就走了。拧到 -0.99:暴跌几乎不防。
trailing_stop = False
    trailing_stop = False

不用跟踪止盈。出场交给云和地板。

它是什么
跟踪止损开关。关着。
不管它会怎样
开着会在回撤里提前剪掉慢结构。
拧大 / 拧小 / 拧反
拧成 True:和云抢出场。
四个周期 20 / 60 / 120 / 30
    conversion_line_period = 20
    base_line_periods = 60
    laggin_span = 120
    displacement = 30

经典 9 / 26 / 52 / 26 按 4h 放大。转换 20,基准 60,滞后 120,位移 30。变量名就是文件里的拼法,基准带 s,滞后写成 laggin。

它是什么
一目四件套的长度。位移是云往前画多少根。
不管它会怎样
改回 9/26/52:那是日线经典,在 4h 上云会变得很敏,不再是这版对照。
拧大 / 拧小 / 拧反
四个一起拧大:云更慢。一起拧小:更像短线。只改其中一个:线和云对不齐。
ichimoku() 一次算完
        ichi = ichimoku(
            dataframe,
            conversion_line_period=self.conversion_line_period,
            base_line_periods=self.base_line_periods,
            laggin_span=self.laggin_span,
            displacement=self.displacement,
        )

调用 technical 库的一目函数,把上面四个周期喂进去,得到一包线。

它是什么
指标入口。后面只从这包里取用到的列。
不管它会怎样
不调用,后面 tenkan、云都没有来源。
拧大 / 拧小 / 拧反
周期跟上面四个属性。另写一套手算,和库的位移约定可能不一致。
tenkan / kijun
        dataframe["tenkan"] = ichi["tenkan_sen"]
        dataframe["kijun"] = ichi["kijun_sen"]

转换线和基准线写进表。这版买卖条件没用这两列,但算云的时候库已经用过它们。

它是什么
一目的快线和慢线。存了,入场没问它们。
不管它会怎样
不存也不影响这版买卖,因为条件只看先行带和云色。
拧大 / 拧小 / 拧反
若把交叉改成 tenkan 上穿 kijun:策略就从「云翻色」退回「线交叉」。
senkou_a / senkou_b
        dataframe["senkou_a"] = ichi["senkou_span_a"]
        dataframe["senkou_b"] = ichi["senkou_span_b"]

两条先行带写进表。它们围出云,交叉就是云翻色。

它是什么
云的上沿和下沿。
不管它会怎样
不管它们,后面 crossed_above 和价在云上云下都没得比。
拧大 / 拧小 / 拧反
位移拧了,两条带会往前或往后挪,交叉时点会变。
cloud_green / cloud_red
        dataframe["cloud_green"] = ichi["cloud_green"]
        dataframe["cloud_red"] = ichi["cloud_red"]

库算好的云色。绿是 A 在 B 上,红是反过来。买卖各认一种颜色。

它是什么
结构的立场。颜色不是价格位置。
不管它会怎样
只看交叉、不问颜色:交叉瞬间和云色可能还没对齐。
拧大 / 拧小 / 拧反
只用颜色不用交叉:云早就是绿的也会反复买。这版要「转绿」那一下。
没有 chikou
        dataframe["cloud_green"] = ichi["cloud_green"]
        dataframe["cloud_red"] = ichi["cloud_red"]
        return dataframe

云色写完就还表。没有 chikou 这一行。文件头注释写了:technical 库明确写了迟行线看未来,不能回测。

它是什么
故意缺席的零件。把今天收盘画到若干根之前,回测会碰到还没发生的价。
不管它会怎样
加回来数字会好看,实盘对不齐。对照页写过不能用。
拧大 / 拧小 / 拧反
为了「完整的一目」加回去:完整不是目标,不偷看才是。
入场:A 上穿 B
                (crossed_above(dataframe["senkou_a"], dataframe["senkou_b"]))

先行带 A 从下往上穿过 B。云由红转绿的那一下,不是「已经是绿」。

它是什么
翻色的边沿。crossed_above 只在交叉那根为真。
不管它会怎样
改成 senkou_a > senkou_b:云绿着的每一根都在喊买,不是转绿。
拧大 / 拧小 / 拧反
反过来 B 上穿 A 当买:你在云转红时开多,逻辑反了。
入场:收盘在两根先行带之上
                & (dataframe["close"] > dataframe["senkou_a"])
                & (dataframe["close"] > dataframe["senkou_b"])

价格要站在云的上方。两条都高于,才算在云上,不是夹在雾里。

它是什么
位置确认。颜色是立场,位置是你站哪边。
不管它会怎样
不管它:云刚转绿但价格还在雾里,你提前上车。
拧大 / 拧小 / 拧反
改成只比其中一条:可能还在云里。要求离云很远:信号更少,行情已走完。
入场:cloud_green 且有量
                & (dataframe["cloud_green"] == True)
                & (dataframe["volume"] > 0)

交叉那根还要云已经是绿,并且这根有量。几条门是 AND,缺一条就不买。

它是什么
颜色确认加零量过滤。
不管它会怎样
去掉绿:只靠交叉,个别棒交叉和颜色可能不一致。去掉量:零量棒也可能进。
拧大 / 拧小 / 拧反
改成 cloud_red:和上穿 A 矛盾,几乎买不到。
出场:B 上穿 A
                (crossed_above(dataframe["senkou_b"], dataframe["senkou_a"]))

先行带 B 从下往上穿过 A。云由绿转红的那一下。

它是什么
翻红的边沿。
不管它会怎样
改成 senkou_b > senkou_a:云红着的每一根都在喊卖。
拧大 / 拧小 / 拧反
仍用 A 上穿 B 当卖:买卖同一边,逻辑反了。
出场:收盘在两根先行带之下
                & (dataframe["close"] < dataframe["senkou_a"])
                & (dataframe["close"] < dataframe["senkou_b"])

价格要掉到云的下方。两条都低于,才算在云下。

它是什么
位置确认,和入场对称。
不管它会怎样
不管它:云转红但价格还在云上,你提前下车或该走不走。
拧大 / 拧小 / 拧反
只比一条:可能还在雾里就卖。
出场:cloud_red 且有量
                & (dataframe["cloud_red"] == True)
                & (dataframe["volume"] > 0)

交叉那根还要云已经是红,并且有量。和入场一样,几条门 AND。

它是什么
颜色确认加零量过滤。
不管它会怎样
去掉红:只靠交叉。去掉量:零量棒也可能卖。
拧大 / 拧小 / 拧反
改成 cloud_green:和 B 上穿 A 矛盾,几乎卖不出。

3假懂

人们会说:「一目很完整,转换线、基准线、迟行线都该用上。」
更短的一句:文件里 tenkan 和 kijun 存了,买卖没问。chikou 根本没写。这版只认云的交叉、颜色和价格位置。完整不是目标,不看未来才是。

4你来讲

对着这份文件讲。口头就行。不要编回测数字。

  1. 四个周期为什么是 20/60/120/30,不是 9/26/52/26?改回经典数,在 4h 上变的是什么?
  2. 入场为什么既要 crossed_above,又要 cloud_green,又要收盘高于两条先行带?少一条各会怎样?
  3. 文件为什么不写 chikou?「看未来」四个字,你怎么对着这一列的缺席讲?