本策略通过组合使用双重叠加平均线指标和Stochastic指标来识别趋势反转的机会,实现高效的短线交易。当价格进入超买超卖区域时策略选择做空;当价格进入超卖区域时策略选择做多,以捕捉中短线趋势的反转。
该策略主要基于双重叠加平均线和Stochastic指标的组合使用。
双重叠加平均线由快速移动平均线、慢速移动平均线和超慢速移动平均线组成。当快速移动平均线上穿慢速移动平均线时,视为买入信号;当快速移动平均线下穿慢速移动平均线时,视为卖出信号。双重叠加平均线能识别出中短线趋势的反转点。
Stochastic指标包含K值和D值,K值表示当前收盘价相对N天内的最高价和最低价的位置,D值是K值的M日简单移动平均。当K值和D值都超过80时为超买区,小于20时为超卖区。Stochastic指标能识别出短期的超买超卖区域。
本策略通过结合双重叠加平均线和Stochastic指标,在Stochastic指标显示超买或超卖区域时,treeview看是否与双重平均线信号一致,如果一致则选择该点进行反转交易,以期捕捉短线趋势的转折点。
该策略具有以下优势:
组合使用双重叠加平均线和Stochastic指标,能够同时识别出中短线和短线的趋势转折点。
利用Stochastic指标的超买超卖信号选择更有效的双叠加平均线反转交易机会。
交易策略规则清晰,容易实施。
可调整的交易时间和月份参数,适应不同品种和时间段。
设置止损来控制风险。
该策略也存在一些风险:
双重叠加平均线可能产生假突破,Stochastic指标也可能出现失效的异同K线形态,导致交易信号错误。可适当调整参数,或者增加其他指标进行组合验证。
只基于技术指标,没有考虑基本面因素,在重大经济事件发生时容易失败。可加入经济事件风险控制。
难以把握移动平均线反转的精确时点,可能出现止损过小或过大的问题。应优化止损策略。
参数设定不当可能导致交易频率过高或信号效果不佳。应针对不同品种和周期进行参数优化测试。
仅适合短线交易,不适合长线持有。应控制仓位规模。
该策略可以从以下几个方面进行优化:
测试更多指标的组合,如KDJ、MACD等,增强信号的有效性。
加入交易量指标分析,避免虚假突破。
优化双平均线参数,识别更精确的反转时点。
优化止损策略,降低止损被触发的可能。
增加经济事件风险控制模块,避免重大事件对交易的影响。
利用机器学习技术自动优化参数,提高参数的适应性。
在更多品种和周期进行回测,寻找最佳的应用方向。
本策略通过双重叠加平均线和Stochastic异同K线形态的组合运用,实现了在中短线趋势反转点进行交易的目的。相比单一使用某个指标,该策略能提高 trades 盈利能力,且策略规则清晰易操作。但该策略也存在一定的风险,需要对参数及止损进行优化,并且加入更多验证指标和风控手段。总体来说,本策略为一种可靠、适中频率的短线交易策略。
/*backtest start: 2022-10-26 00:00:00 end: 2023-10-26 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy(title="Intraday Stochiastic Strategy", shorttitle="Intraday Stochiastic Strategy", overlay=true, initial_capital = 1000) //WORKS FOR BTCUSD M30 //OBVERVED GOOD PERFORMANCES FOR SELL MODE M15 : US30USD / UK100GBP / JP225USD / SPX500USD / BCOUSD / EURGBP //Best Forex Hours are 7-21 //0 is Long Position //1 is Short Position //2 No position mode=input(1, maxval=2, title="Mode") lossLimit=input(10000, maxval=10000, title="Loss Limit") hourStart=input(2, maxval=24, title="Hour Start") hourStop=input(13, maxval=24, title="Hour Stop") //Month selected for back testing. 0 is maximum number of months monthSelected = input(0, maxval=12, title="Month Selected") ///////////////////////////////////////////////// fast = 20, slow = 50, ultraSlow = 200 fastMA = sma(close, fast) slowMA = sma(close, slow) ultraSlowMA = sma(close, ultraSlow) colorFast = red colorSlow = black colorUltraSlowMA = purple if(timeframe.period == "1" or timeframe.period == "3" or timeframe.period == "5" or timeframe.period == "15" or timeframe.period == "30" or timeframe.period == "45" or timeframe.period == "60" or timeframe.period == "120" or timeframe.period == "180" or timeframe.period == "240") fastMA := ema(close, fast) slowMA := ema(close, slow) ultraSlowMA := ema(close, ultraSlow) colorFast := orange colorSlow := gray colorUltraSlowMA := blue p1 = plot(fastMA, color=colorFast) p2 = plot(slowMA, color=colorSlow, linewidth=2) p3 = plot(ultraSlowMA, color=colorUltraSlowMA, linewidth=3) fill(p1, p2, color = fastMA > slowMA ? green : red) //////////////////////////////////////////////// ema150 = 200 ema150MA = ema(close, ema150) smooth = input(3, minval=1), K = input(14, minval=1), D=input(3,minval=1) hh=highest(high,K) ll=lowest(low,K) k = sma((close-ll)/(hh-ll)*100, smooth) d = sma(k, 3) //plot(k, color=blue) //plot(d, color=red) //h0 = hline(80) //h1 = hline(20) //fill(h0, h1, color=purple, transp=95) //plot(hour*100, color=red, linewidth=2) stochiasticHigh = 80 stochiasticLow = 20 data = close < ema150MA and k>stochiasticHigh and d>stochiasticHigh and close>open plotshape(data, style=shape.triangledown, location=location.belowbar, color=red) data2 = close > ema150MA and k<stochiasticLow and d<stochiasticLow and close<open plotshape(data2, style=shape.triangleup, location=location.abovebar, color=green) isData = 0 isData := isData[1] if(isData == 0) if(data) if(mode==1 and hour>hourStart and hour<hourStop and (monthSelected==0 or month==monthSelected)) //DOW hours : 2-13 strategy.entry("SCALP SHORT", strategy.short) isData := 1 else if(k<stochiasticLow and d<stochiasticLow) if(mode==1) strategy.close_all(when = true) isData := 0 isData2 = 0 isData2 := isData2[1] if(isData2 == 0) if(data2) if(mode==0 and hour>hourStart and hour<hourStop and (monthSelected==0 or month==monthSelected)) strategy.entry("SCALP LONG", strategy.long) isData2 := 1 else if(k>stochiasticHigh and d>stochiasticHigh) if(mode==0) strategy.close_all(when = true) isData2 := 0 strategy.exit("STOP LOSS", "SCALP LONG", loss=lossLimit) strategy.exit("STOP LOSS", "SCALP SHORT", loss=lossLimit)