
本策略基于平均随机指标进行交易信号判断,属于趋势跟踪策略。该策略通过计算平均随机指标%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