v6 · 阶段 C

加上日线过滤

4 小时图上的金叉,只在日线图也向上时才买。

informative 1d sma_1d ffill 后缀 _1d

1一句话

4 小时图上的金叉,只在日线图也向上时才买。大方向不对,小周期的交叉先忍住。

2生活类比

你在小区里看风向(4 小时图),出门前先看市里的天气预报(日线)。小区一阵南风,但全市在刮北风,这阵南风多半站不住。

3搬到这版

多要一张图informative_pairs 声明要 1d。
算日线在日线表上算 sma_1d,再 merge_informative_pair 并到 4h 表。
列名并过来的列会带 _1d 后缀,比如 close_1d。
不偷看只沿用已经收盘的日线。正在走的今天,还不能当「日线已经向上」。
入场更挑金叉还在,但多一个条件:日线均线方向向上。

4每个新参数

informative_timeframe = "1d"

多看一张更慢的天气预报。

它是什么
除了策略自己的 4h,再要一份日线数据来做大方向过滤。
不管它会怎样
不管它:只活在 4h 里,震荡会反复打脸。这是从 Supertrend 拆来的零件。
拧大 / 拧小 / 拧反了
拧成 1w:更钝,过滤更狠,买得更少。拧成 1h:不是大周期,滤不了 4h 的噪音。
sma_1d 周期 = 先能讲清再选

市里那条更慢的平均线,用多少天来算。

它是什么
日线上那条均线的窗口。用来判断大方向向上还是向下。
不管它会怎样
不管它:没有日线方向,过滤写不出来。
拧大 / 拧小 / 拧反了
拧小:更敏感,过滤变松。拧大:更稳,买得更少。先讲清「它在滤什么」,再改数字。
ffill = True

日线一天只更新一次。中间 6 根 4h,沿用上一根已经收盘的日报。

它是什么
merge 时向前填:用最近一根已有的日线值,填满 4h 的空行。
不管它会怎样
不管它(False):大多数 4h 行日线是空的,条件失效,等于没过滤。
拧大 / 拧小 / 拧反了
拧反去「向后填」:会用到下一根还没走完的日线,那是偷看。保持 ffill,并且只信已收盘的日线。
列名后缀 _1d

两张表并到一起,日线列要改姓,免得和 4h 的 close 撞名。

它是什么
merge 之后,日线的 close 变成 close_1d,均线变成 sma_1d。
不管它会怎样
不管它:你可能拿 4h 的 close 去当日报价,过滤是假的。
拧大 / 拧小 / 拧反了
写错名字:条件永远不成立,或比错列。入场前先打印列名看一眼。

5假懂

人们会说:「加上日线就会少亏」
更短的一句:日线过滤是少做逆大势的金叉。牛市里少买假交叉,熊市里更少开仓。漏掉的是「日线还没转、4h 先金叉」的那段。

6你来讲

答得出来,这课才过关。具体笔数、回撤你自己和 v3 比,这页不填。

  1. 为什么日线列要带 _1d?不带会怎样?
  2. ffill 填的是已经收盘的日线,还是正在走的今天?
  3. merge 时怎样才算不偷看?

7这版代码

只放日线怎么要、怎么并、怎么当过滤。金叉那几行还在,多一个日线条件。

def informative_pairs(self):
    pairs = self.dp.current_whitelist()
    return [(pair, "1d") for pair in pairs]

# 在 populate_indicators 里
inf = self.dp.get_pair_dataframe(pair=metadata["pair"], timeframe="1d")
inf["sma_1d"] = ta.SMA(inf, timeperiod=50)
dataframe = merge_informative_pair(
    dataframe, inf, self.timeframe, "1d", ffill=True
)
# 之后用 dataframe["sma_1d"]、dataframe["close_1d"]
# 入场再加:close_1d > sma_1d(日线向上)

8过关

能讲清和裸金叉比,笔数、回撤、收益会朝哪变。具体数自己跑,这页不代填。

能指着 merge 那一行,说明为什么 ffill=True 不是偷看。