对着 Supertrend4h.py 从上往下走。三条 4h 加日线都向上买,主线翻空卖。
4h 上算快、中、慢三条 Supertrend,再把日线那条并进来。买要四条都 up。卖只看中线 st_mid 是否 down,不等三条凑齐。
每一项是文件里的原文,不是口诀。先看黑底那几行,再听人话,再答三问。
class Supertrend4h(IStrategy):
向引擎登记这份 4 小时 Supertrend。对照选的是类名。
INTERFACE_VERSION = 3
按第三版接口读 enter / exit,后面 informative 合并也走这套。
timeframe = "4h"
主图是 4 小时。三条快中慢都画在这张图上。
informative_timeframe = "1d"
再要一根日线。大天气不对,4h 再整齐也不出门。
startup_candle_count = 80
先丢掉大约 80 根 4h。慢线 21、日线还要并进来,前面一段方向是空的。
process_only_new_candles = True
只在 4h 收盘时看四条线翻没翻。Supertrend 穿越本就跟收盘走。
can_short = False
只做多。主线翻空是平多,不是开空。
use_exit_signal = True
st_mid == down 那行 exit_long,引擎会听。
exit_profit_only = False
亏着也能按主线翻空卖。假趋势可以认赔。
ignore_roi_if_entry_signal = False
入场信号不压 ROI。这版 ROI 几乎焊死,这行很少派上用场。
minimal_roi = {"0": 10}
一上车要涨 10 倍才用 ROI。注释写了:几乎关掉 ROI,让 Supertrend 翻向来平仓。
stoploss = -0.12
硬止损 12%。注释写了:只防暴跌,不替代指标出场。
trailing_stop = False
不用跟踪止盈。出场交给主线和地板。
st_fast_period = 10
st_fast_mult = 2
st_mid_period = 14
st_mid_mult = 3
st_slow_period = 21
st_slow_mult = 4
快 10/2,中 14/3,慢 21/4。注释写了:倍数越大,线离价格越远,越不容易翻。三条都要算,买的时候三条都要 up。
st_1d_period = 10
st_1d_mult = 3
日线用经典 10、3,确认大方向。买的时候它也要 up。
def informative_pairs(self):
pairs = self.dp.current_whitelist()
return [(pair, self.informative_timeframe) for pair in pairs]
白名单里每个币,再要一份日线数据。引擎按这个列表去拉 1d。
def _st_dir(self, dataframe: DataFrame, period: int, multiplier: float, name: str) -> pd.Series:
_value, stx = ftt.supertrend(dataframe, period=period, multiplier=multiplier)
return pd.Series(stx, index=dataframe.index, name=name).fillna("")
调用 technical 的 supertrend,丢掉轨道数值,只留下 STX 方向。空值填成空字符串,后面和 "up" / "down" 比才不会是空。
cols = [
self._st_dir(dataframe, self.st_fast_period, self.st_fast_mult, "st_fast"),
self._st_dir(dataframe, self.st_mid_period, self.st_mid_mult, "st_mid"),
self._st_dir(dataframe, self.st_slow_period, self.st_slow_mult, "st_slow"),
]
dataframe = pd.concat([dataframe] + cols, axis=1)
算出 st_fast / st_mid / st_slow 三列,横着拼回主表。列名就是后面 == "up" 要比的名字。
informative = self.dp.get_pair_dataframe(
pair=metadata["pair"], timeframe=self.informative_timeframe
)
informative["st_1d"] = self._st_dir(
informative, self.st_1d_period, self.st_1d_mult, "st_1d"
)
另取这份币的日线表,在日线上算一条 Supertrend,列名先叫 st_1d。
dataframe = merge_informative_pair(
dataframe, informative, self.timeframe, self.informative_timeframe, ffill=True
)
把日线并进 4h。合并后列名变成 st_1d_1d。ffill=True:一天里的六根 4h,都沿用这根日线收盘后的方向。
(dataframe["st_fast"] == "up")
& (dataframe["st_mid"] == "up")
& (dataframe["st_slow"] == "up")
快、中、慢都向上,才承认 4 小时这边同意。三行是一个意思:四人里的三个小的举手。
& (dataframe["st_1d_1d"] == "up")
& (dataframe["volume"] > 0)
日线那一票也要向上,并且这根 4h 有量。列名是合并后的 st_1d_1d,不是 st_1d。
(dataframe["st_mid"] == "down")
& (dataframe["volume"] > 0)
主线(经典 14,3)翻空就走。注释写了:不等三条卖点凑齐,官方卖点偏晚。有量才写。
对着这份文件讲。口头就行。不要编回测数字。