该策略运用了双移动平均线,分别是8周期和21周期的移动平均线。当短期移动平均线上穿长期移动平均线时,做多;当短期移动平均线下穿长期移动平均线时,做空。
该策略还引入了移动平均线的斜率指标来过滤掉一些无趋势的区间,只在趋势较明显的时候产生交易信号。
该策略的核心在于短期移动平均线和长期移动平均线的交叉。短期移动平均线能更快地捕捉价格变化趋势,而长期移动平均线对噪音具有更好的过滤效果。当短期线上穿长期线时显示出多头趋势建立,做多能获利;当短期线下穿长期线时显示出空头趋势建立,做空能获利。
该策略还设置了一个斜率阈值。只有当斜率大于该正阈值时才产生做多信号,只有当斜率小于该负阈值时才产生做空信号。这可以过滤掉一些无明显趋势的区间,让交易信号的质量更高。
具体来说,该策略的交易信号生成逻辑是:
该策略具有以下优势:
该策略也存在一些风险:
针对这些风险,可以从以下几个方面进行优化:
该策略还可从以下几个方向进行优化:
该双移动平均策略总体来说简单实用,通过diffs两个周期的参数捕捉不同的趋势特征,并融合在一起产生交易信号。同时,引入斜率阈值提高了信号质量。该策略可以作为基础策略并进行扩展,还有很大的优化空间和拓展能力。
/*backtest
start: 2024-01-09 00:00:00
end: 2024-01-16 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//written by sixpathssenin
//@version=4
strategy(title="Dual Moving Average",initial_capital=10000,overlay=true)
ma1= sma(close,8)
ma2= sma(close,21)
angleCriteria = input(title="Angle", type=input.integer, defval=7, minval=1, maxval=13)
i_lookback = input(2, "Angle Period", input.integer, minval = 1)
i_atrPeriod = input(10, "ATR Period", input.integer, minval = 1)
i_angleLevel = input(6, "Angle Level", input.integer, minval = 1)
i_maSource = input(close, "MA Source", input.source)
f_angle(_src, _lookback, _atrPeriod) =>
rad2degree = 180 / 3.141592653589793238462643 //pi
ang = rad2degree * atan((_src[0] - _src[_lookback]) / atr(_atrPeriod)/_lookback)
ang
_angle = f_angle(ma2, i_lookback, i_atrPeriod)
plot(ma1,color=#FF0000)
plot(ma2,color=#00FF00)
crosso=crossover(ma1,ma2)
crossu=crossunder(ma1,ma2)
_lookback = 15
f_somethingHappened(_cond, _lookback) =>
bool _crossed = false
for i = 1 to _lookback
if _cond[i]
_crossed := true
_crossed
longcrossed = f_somethingHappened(crosso,_lookback)
shortcrossed = f_somethingHappened(crossu,_lookback)
long = longcrossed and _angle > angleCriteria
short= shortcrossed and _angle < -(angleCriteria)
if(long)
strategy.entry("Long",strategy.long)
if(short)
strategy.entry("short",strategy.short)