对着 SMAOffset4h.py 从上往下走。跌破买均线再乘偏移才买,涨过卖均线再乘偏移才卖。
社区 SMAOffsetProtectOptV1 的 4h 对照版。时间改 4h,ROI 焊死,只算用到的 EMA。偏移、EWO、RSI 仍是 5 分钟街上 hyperopt 留下的默认,没有按 4h 重搜。
每一项是文件里的原文,不是口诀。先看黑底那几行,再听人话,再答三问。
def EWO(dataframe, ema_length=50, ema2_length=200):
ema1 = ta.EMA(dataframe, timeperiod=ema_length)
ema2 = ta.EMA(dataframe, timeperiod=ema2_length)
return (ema1 - ema2) / dataframe["close"] * 100
快均线减慢均线,再除以收盘、乘 100。量的是两条均线拉开的距离,不是涨跌口号。类外面的小函数,后面会喂 50 和 200。
class SMAOffset4h(IStrategy):
向引擎登记这份 4 小时 SMAOffset。对照选的是类名。
INTERFACE_VERSION = 3
按第三版接口读 enter / exit。
timeframe = "4h"
时钟改成 4 小时。参数还是 5 分钟街上调的,弹性对不上。这正是对照要暴露的错配。
startup_candle_count = 220
先丢掉大约 220 根。最慢的是 EWO 的 200 日 EMA,再留一点余量。
process_only_new_candles = True
只在 4h 收盘时看有没有跌破偏移、涨过偏移。
can_short = False
只做多。涨过卖均线是平多,不是开空。
use_exit_signal = True
涨过卖均线那行 exit_long,引擎会听。主出场是偏移,不是 ROI。
exit_profit_only = False
亏着也能按涨过卖线卖。回踩没弹回来,碰到卖线仍走。
minimal_roi = {"0": 10}
一上车要涨 10 倍才用 ROI。原版 5m 是大约 1% 的短线 ROI,对照把它焊死,让均线偏移自己出场。
stoploss = -0.12
硬止损 12%。接飞刀时的保命地板,不是主卖点。
trailing_stop = False
不用跟踪止盈。出门交给卖均线偏移和地板。
base_nb_candles_buy = 16
base_nb_candles_sell = 49
买用 16 根 EMA,卖用 49 根 EMA。买和卖不是同一条线。这两个数是 5m 默认,原样搬来。
low_offset = 0.978
high_offset = 1.006
买门槛在买均线下方,乘 0.978,大约再便宜 2.2%。卖门槛在卖均线上方,乘 1.006,大约再贵 0.6%。也是 5m 默认。
ewo_high = 5.638
ewo_low = -19.993
拉伸大到 5.638 以上,走「高 EWO + RSI」那一扇。拉伸小到 -19.993 以下,走「低 EWO」那一扇。两道门是 5m hyperopt 留下的小数。
rsi_buy = 61
高 EWO 那条支路还要 RSI 小于 61。低 EWO 那条不问 RSI。61 也是 5m 默认。
fast_ewo = 50
slow_ewo = 200
喂给 EWO 函数的快慢 EMA。50 和 200。决定拉伸量的是哪两条线。
dataframe["ma_buy"] = ta.EMA(dataframe, timeperiod=self.base_nb_candles_buy)
dataframe["ma_sell"] = ta.EMA(dataframe, timeperiod=self.base_nb_candles_sell)
按 16 和 49 算出两条 EMA。名字带 SMA,算的是 EMA。只算用到的,不扫 hyperopt 全区间。
dataframe["EWO"] = EWO(dataframe, self.fast_ewo, self.slow_ewo)
dataframe["rsi"] = ta.RSI(dataframe, timeperiod=14)
把拉伸和 RSI 写进表。RSI 周期写死 14,没有单独属性。
below = dataframe["close"] < (dataframe["ma_buy"] * self.low_offset)
收盘价低于买均线的 0.978 倍,才算回踩够深。下面两扇门都要先过这个 below。
(below & (dataframe["EWO"] > self.ewo_high) & (dataframe["rsi"] < self.rsi_buy) & (dataframe["volume"] > 0))
已经跌破偏移,并且拉伸向上大、RSI 还小于 61、有量。皮筋绷紧但不是超买向下砸穿。
(below & (dataframe["EWO"] < self.ewo_low) & (dataframe["volume"] > 0))
已经跌破偏移,并且拉伸向下大到 -19.993 以下、有量。这条不问 RSI。
dataframe.loc[reduce(lambda x, y: x | y, conditions), "enter_long"] = 1
两扇门任一成立就买。是 OR,不是 AND。所以「高拉伸 + RSI」和「低拉伸」是两条路,不是同时要满足。
(dataframe["close"] > (dataframe["ma_sell"] * self.high_offset))
& (dataframe["volume"] > 0)
收盘价高于卖均线的 1.006 倍,并且有量,才写平多。买看 16 根那条,卖看 49 根这条。
对着这份文件讲。口头就行。不要编回测数字。