本策略基于平均真实范围指标(ATR)以及趋向指标(DMI)的正向指标(DI+)和负向指标(DI-)的交叉来判断买入和卖出时机。该策略属于趋势跟踪策略,通过DI+和DI-的交叉来判断趋势的转折点,ATR用于设置止损和止盈价格。
计算ATR(14):利用过去14天的最高价,最低价和收盘价计算出平均真实波动范围
计算DI+和DI-:
DI+ = 100 * RMA(MAX(UP,0),N) / ATNR
DI- = 100 * RMA(MAX(DOWN,0),N) / ATNR
其中UP为当日最高价和昨日收盘价的差值,DOWN为当日最低价和昨日收盘价的差值,N为参数长度,默认为14,ATNR为上一步计算所得的ATR
判断买入和卖出:
当DI+上穿DI-,产生买入信号
当DI+下穿DI-,产生卖出信号
设置止损止盈:
多单止损价为入场价减去ATR乘以止损倍数
多单止盈价为入场价加上ATR乘以止盈倍数
空单止损价为入场价加上ATR乘以止损倍数
空单止盈价为入场价减去ATR乘以止盈倍数
利用DI+和DI-交叉判断趋势转换点,能够及时捕捉新的趋势方向
ATR作为动态止损止盈指标,能够根据市场波动程度来设定合理的止损止盈点
策略参数较少,容易理解和实现
回测数据显示,该策略具有正向的盈利因子,表现优于买持策略
DI交叉产生误交易风险
止损止盈点过于靠近
-市场出现剧烈波动时,靠近的止损止盈容易被触发,可调整ATR倍数以适应市场波动频率
无法有效处理趋势震荡市
回撤风险
结合移动平均线等指标过滤DI交叉信号,避免在震荡行情中产生误交易
增加仓位管理机制,如固定份额、马丁格尔等方式,以控制回撤并提高盈利性
优化ATR参数,使止损止盈更符合不同交易品种的波动范围
进行参数优化,找到最佳的参数组合,如DI周期、ATR周期和ATR倍数等
增加夜盘和早盘的交易判断逻辑,使策略全天候运行
本策略整体较为简单实用,通过DI的交叉判定买卖时机,并用ATR动态设置止损止盈。策略参数量少,容易 tester 和实盘验证,也方便进行优化调整。但DI交叉对震荡行情判断效果不佳,这也是本策略需要改进的方向。总体来说,本策略表现稳定,适合用作日内短线交易策略。
/*backtest
start: 2022-11-06 00:00:00
end: 2023-11-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_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/
// © TheHulkTrading
//@version=4
strategy("DI Crossing Daily Straregy HulkTrading", overlay=true)
// ATR Multiplier. Recommended values between 1..4
atr_multiplier = input(1, minval=1, title="ATR Multiplier")
//Length of DI. Recommended default value = 14
length = input(14, minval=1, title="Length di")
up = change(high)
down = -change(low)
range = rma(tr, 14)
//DI+ and DI- Calculations
di_plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, length) / range)
di_minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, length) / range)
//Long and short conditions
longCond = crossover(di_plus,di_minus)
shortCond = crossunder(di_plus,di_minus)
//Stop levels and take profits
stop_level_long = strategy.position_avg_price - atr_multiplier*atr(14)
take_level_long = strategy.position_avg_price + 2*atr_multiplier*atr(14)
stop_level_short = strategy.position_avg_price + atr_multiplier*atr(14)
take_level_short = strategy.position_avg_price - 2*atr_multiplier*atr(14)
//Entries and exits
strategy.entry("Long", strategy.long, when=longCond)
strategy.exit("Close Long","Long", stop=stop_level_long, limit = take_level_long)
strategy.entry("Short", strategy.short, when=shortCond)
strategy.exit("Close Short","Short", stop=stop_level_short, limit = take_level_short)