本策略运用快速移动平均线和慢速移动平均线构建双轨系统,结合趋势指数ADX进行趋势判断,以及动向指数DMI判断趋势方向,实现在趋势建立后进行趋势追踪,在趋势反转时及时退出,避免追顶杀跌。同时结合时间范围测试,可以回测策略在不同时间段的效果。
快速移动平均线与慢速移动平均线构建双轨系统。当快速移动平均线上穿慢速移动平均线时,为金叉信号,做多入场;当快速移动平均线下穿慢速移动平均线时,为死叉信号,平仓离场。
ADX用于判断趋势的存在与力度。当ADX大于设置关键值时,认为趋势存在且趋势较强。只有在趋势较强时,才产生交易信号。
DMI中的DI+用于判断趋势的方向。当DI+为正时,表示趋势为上升;当DI+为负时,表示趋势为下降。只有判断到符合趋势方向时,才产生交易信号。
结合时间范围测试,可以回测策略在不同时间段的效果,对策略进行验证。
使用双轨系统,可以对突破进行过滤,避免假突破带来损失。
应用ADX判断趋势存在与力度,避免在震荡行情中频繁交易。
利用DMI判断趋势方向,确保符合趋势操作,避免逆势交易。
时间范围测试可以验证策略参数是否对不同行情有效,优化参数设置。
双轨系统容易形成空头陷阱或多头陷阱,需要警惕价格回调甩出停损。
ADX判断存在滞后,可能错过趋势初期机会,可以降低关键值。
DMI判断方向也存在滞后,同样可能错过趋势初期,可以缩短周期参数。
不同时间范围内参数设置可能需要调整,需要优化参数以适应行情。
可以测试不同长度周期的参数组合,找到最佳参数。
可以结合其他指标如布林线进行双重过滤,提高信号质量。
可以添加止损策略,避免亏损扩大。
可以通过机器学习方法自动优化参数设置。
可以结合情绪指标、消息面等更多因素提高策略效果。
本策略整合移动平均线、趋势指数和动向指数的优势,实现了对趋势的判断和追踪。在验证其参数有效性的同时,仍需持续优化以适应更多市场情况,将参数调整、止损策略、多因子综合等进一步深化,从而提高策略稳定性和盈利空间。总体来说,本策略为量化交易提供了一个可靠的趋势跟踪思路。
/*backtest
start: 2023-10-01 00:00:00
end: 2023-10-31 23:59:59
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// author: codachang0726
strategy(title = "(S)MA+ADX+DI+time", shorttitle = "(S)MA+ADX+DI+time", overlay = true)
// === INPUT MA LENGTHS ===
fastMA = input(defval = 7, title = "FastMA", minval = 1, step = 1)
slowMA = input(defval = 14, title = "SlowMA", minval = 1, step = 1)
// === INPUT BACKTEST RANGE ===
fromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromYear = input(defval = 2020, title = "From Year", minval = 1970)
thruMonth = input(defval = 1, title = "Thru Month", minval = 1, maxval = 12)
thruDay = input(defval = 1, title = "Thru Day", minval = 1, maxval = 31)
thruYear = input(defval = 2022, title = "Thru Year", minval = 1970)
// === INPUT SHOW PLOT ===
showDate = input(defval = true, title = "Show Date Range", type = input.bool)
// === FUNCTION EXAMPLE ===
start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window
finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window
window() => true // create function "within window of time"
// === MA LOGIC ===
crossOv = sma(close, fastMA) > sma(close, slowMA) // true when fastMA over slowMA
crossUn = sma(close, fastMA) < sma(close, slowMA) // true when fastMA under slowMA
// DI+ADX
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Period")
keyLevel = input(20, title="Keylevel for ADX")
[diplus, diminus, adx] = dmi(dilen, adxlen)
di = (diplus - diminus)
buy = di > 0 and crossOv and adx > keyLevel
sell = di < 0 and crossUn and adx > keyLevel
buy_time = buy and not buy[1]
sell_time = sell and not sell[1]
// === EXECUTION ===
strategy.entry("L", strategy.long, when = window() and buy_time) // enter long when "within window of time" AND crossover
strategy.close("L", when = window() and sell_time) // exit long when "within window of time" AND crossunder
// === PLOTTING ===
bgcolor(color = showDate and window() ? color.gray : na, transp = 90) // plot "within window of time"
plot(sma(close, fastMA), title = 'FastMA', color = color.yellow, linewidth = 2, style = plot.style_line) // plot FastMA
plot(sma(close, slowMA), title = 'SlowMA', color = color.aqua, linewidth = 2, style = plot.style_line) // plot SlowMA