该策略是基于21日和55日移动均线的交叉来产生买入和卖出信号,同时结合超级趋势指标来过滤假信号的趋势跟踪策略。
代码首先定义了21日线(EMA1)和55日线(EMA2)的移动均线。当EMA1上穿EMA2时产生买入信号;当EMA1下穿EMA2时产生卖出信号。
为了过滤假信号,代码加入了超级趋势指标。超级趋势指标基于平均真实波幅ATR,结合价格的最近高点和低点来判断趋势方向。代码中设定当价格在上轨之上为上升趋势,在下轨之下为下降趋势。
这样,只有在趋势为上升时EMA1上穿EMA2才产生买入信号;只有在趋势为下降时EMA1下穿EMA2才产生卖出信号。通过超级趋势指标过滤,可以避免趋势转换时产生的假信号。
此外,代码中还添加了200日线和233日线来判断长期趋势,只有在长期趋势方向一致时才产生交易信号。
双移动均线结合超级趋势指标,可以有效识别趋势方向,过滤假信号。
通过调整移动均线参数,可以调整策略的敏感性,适应不同市场环境。
添加长期均线判断,可以避免长短趋势不一致带来的风险。
规则清晰易懂,参数调整容易,适合量化交易。
可视化的买卖信号,操作清晰。
双移动均线策略容易在趋势转折点产生错误信号。需要注意识别潜在转折。
移动均线参数设置不当可能错过趋势或者产生过多错误信号。需要针对不同市场调整参数。
交易频率可能较高,需要关注交易成本控制。
超级趋势指标参数需要优化,否则可能过滤掉正确信号或者留存错误信号。
长期均线判断可能滞后产生信号,需要合理把握趋势转换的时机。
测试不同移动均线组合,寻找最佳参数。
优化超级趋势指标的参数,平衡过滤效果和延迟。
添加其他辅助指标,例如成交量指标,进一步验证信号。
结合情绪指标、消息面等更多因素判断潜在转折点。
采用machine learning方法动态优化参数。
该策略整合双移动均线和超级趋势指标的优点,既可以发掘趋势,又可以过滤错误信号。通过参数调优和辅助指标验证,可以持续改进策略效果。虽存在一定风险,但可通过风险管理手段控制。该策略适合用量化方式进行程序化交易。
/*backtest
start: 2022-09-21 00:00:00
end: 2023-09-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © bhavikmota
//@version=4
strategy("EMA & Supertrend", overlay = true)
//length = input(9, minval=1)
//ema1 = ema(close, length)
//ema2 = ema(ema1, length)
//ema3 = ema(ema2, length)
//shortest = ema(close, 20)
//short = ema(close, 50)
//longer = ema(close, 100)
//longest = ema(close, 200)
//for Ema1
len1 = input(21, minval=1)
//src1 = input(close)
ema1 = ema(close,len1)
plot(ema1, color=color.red, linewidth=1)
//for Ema2
len2 = input(55, minval=1)
//src2 = input(close)
ema2 = ema(close,len2)
plot(ema2, color=color.green, linewidth=1)
//for Ema3
len3 = input(200, minval=1)
//src3 = input(close)
ema3 = ema(close,len3)
plot(ema3, color=color.blue, linewidth=1)
//for Ema4
len4 = input(233, minval=1)
//src4 = input(close)
ema4 = ema(close,len4)
plot(ema4, color=color.black, linewidth=1)
Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=true)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
alertcondition(buySignal, title="SuperTrend Buy", message="SuperTrend Buy!")
alertcondition(sellSignal, title="SuperTrend Sell", message="SuperTrend Sell!")
changeCond = trend != trend[1]
alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")
//Trading logic
Enterlong = crossover(ema1,ema2) or (close>ema1 and close>ema2 and ema1>ema2) and close>ema4// positive ema crossover
Exitlong = crossunder(close,ema2) // candle closes below supertrend
Entershort = crossunder(ema1,ema2) or (close<ema1 and close<ema2 and ema2<ema1) and close<ema4// negative ema crossover
Exitshort = crossover(close,ema2) // candle closes above supertrend
//Execution Logic - Placing Order
start = timestamp(2008,1,1,0,0)
if time>= start
strategy.entry("long", strategy.long, when=Enterlong)
strategy.close("long",when=Exitlong)
//strategy.entry("short",strategy.short,100,when=Entershort)
//strategy.close("short",when=Exitshort)