本策略基于平均随机指标进行交易信号判断,属于趋势跟踪策略。该策略通过计算平均随机指标%K和%D的移动平均值,在它们发生金叉时做多,发生死叉时做空,属于典型的趋势跟踪策略。
计算平均随机指标%K和%D的值。其中%K是根据一定周期内的收盘价计算出的随机值的移动平均,反映当前价格与一定周期内的最高价和最低价的相对位置。%D是%K的移动平均,用于确认趋势。
对%K和%D分别进行指数平滑移动平均(EMA),得到平均随机指标的平均值_avg_k和_avg_d。
判断交易信号:
买入信号:当_avg_k上穿_avg_d,且_avg_d < 20时,做多
卖出信号:当_avg_k下穿_avg_d,且_avg_d > 80时,做空
持仓管理:
多单止损:当_avg_d > 80时平仓
空单止损:当_avg_d < 20时平仓
允许同向订单最大3个,属于加仓策略
使用双重均线判断金叉死叉,可以有效过滤假突破,提高信号质量
应用平均随机指标,能够有效跟踪价格趋势
结合超买超卖区间判断,可以避免在震荡行情中频繁交易
允许加仓,可以在趋势行情中获得更多收益
止损策略可以控制单笔损失
双均线交易策略容易产生频繁交易,如果交易费用过高会影响盈利
使用固定止损点可能会过早止损退出趋势
加仓次数过多可能会导致亏损扩大
不能有效判断趋势反转点,在趋势反转时可能出现较大亏损
需要优化参数周期,不同周期效果差异很大
可以考虑引入趋势判断指标,避免逆势交易
动态调整止损点,让止损更贴合趋势
优化加仓策略,例如每单递增加仓手数
结合其他指标判断趋势反转,提前退出利润
针对不同品种分别测试参数优化,提高参数适应性
本策略整体来说是一个典型的趋势跟踪策略,使用平均随机指标判断趋势方向,在趋势出现时进行加仓交易。策略优势是跟踪能力强,适合趋势行情,但需要注意防止逆势交易。通过引入趋势判断、优化止损策略、控制加仓次数等方式可以进一步优化,在参数选取合适的前提下,可以获得不错的跟踪效果。
/*backtest start: 2022-10-19 00:00:00 end: 2023-10-25 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 //1. AVG Stochastic Calculate //1.1 AVG %K is calculated by apply EMA with smooth K period on Average of Original Stochastic %k & %d //+ avg_k=ema((%k+%d)/2,smoothK) //1.2 AVG %D is calculated by apply EMA with %d period on AVG %K //+ avg_d=ema(avg_k,periodD) //2. Parameter //+ %K Length: 21 //+ %K Smoothing: 3 //+ %D Smoothing: 3 //+ Symbol: BTC/USDT //+ Timeframe: M30 //+ Pyramiding: Maximum 3 orders at the same direction. //3. Signal //3.1 Buy Signal //+ Entry: AVG %K crossover AVG %D and AVG %D < 20 //+ Exit: AVG %D > 80 //3.2 Sell Signal //+ Entry: AVG %K crossunder AVG %D and AVG %D > 80 //+ Exit: AVG %D < 20 strategy(title="AVG Stochastic Strategy [M30 Backtesting]", overlay=true, pyramiding=3) periodK = input.int(21, title="%K Length", minval=1) smoothK = input.int(3, title="%K Smoothing", minval=1) periodD = input.int(3, title="%D Smoothing", minval=1) k = ta.sma(ta.stoch(close, high, low, periodK), smoothK) d = ta.sma(k, periodD) _avg_k=ta.ema(math.avg(k,d),smoothK) _avg_d=ta.ema(_avg_k,periodD) up= _avg_k[1]<_avg_d[1] and _avg_k>_avg_d and _avg_d<20 dn= _avg_k[1]>_avg_d[1] and _avg_k<_avg_d and _avg_d>80 var arr_val=0 if up arr_val:=1 strategy.entry("Long", strategy.long) if dn arr_val:=-1 strategy.entry("Short", strategy.short) if up[1] or dn[1] arr_val:=0 plotarrow(arr_val,title="Signal",colorup=color.green,colordown=color.red) if _avg_d>80 strategy.close("Long") if _avg_d<20 strategy.close("Short") //EOF