This strategy combines Smooth Moving Average with the Stochastic indicator to capture more opportunities in trends. It mainly uses two exponential moving averages with different periods to generate trading signals, together with the crossover of K line and D line in Stochastic indicator for entry timing selection, in order to obtain higher profitability in trends.
The strategy uses 12-period and 26-period smooth moving averages. When the fast line crosses above the slow line from the bottom, go long. When the fast line crosses below the slow line from the top, go short. To filter fake signals, it requires the fast and slow lines to be in the same direction, with the fast line above the slow line for long, and the fast line below the slow line for short.
The crossover of K line and D line in Stochastic indicator is used for entry timing selection. When K line crosses above D line from below the overbought line, go long. When K line crosses below D line from above the oversold line, go short.
Smooth moving average determines the trend direction, while Stochastic indicator filters Noise and selects entry timing. Their combination could obtain more profitable opportunities in trends.
Therefore, this strategy could follow the trend selectively to capture opportunities, obtaining higher profitability.
To reduce those risks, we could set stop loss, or adopt more moderate MA parameters.
The strategy could be further optimized from the follows aspects:
By testing different parameter combinations, better parameters could be found. Also, stop loss strategies could effectively reduce risk and enhance stability.
The strategy integrates the strengths of Smooth Moving Average and Stochastic for trend-following, while selecting better entry timing. It is easy to operate, with controllable risk and great practical value. Its performance could be further improved through continuous testing and optimization. It provides quant traders an efficient and stable trend tracking model.
/*backtest start: 2024-01-18 00:00:00 end: 2024-01-25 00:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // author SoftKill strategy(title="Price EMA with stock", shorttitle="EMA STOCH", overlay=true) src = input(title="Source", type=input.source, defval=close) src_0 = src[0] src_1 = src[1] src_2 = src[2] src_3 = src[3] src_4 = src[4] len50 = input(50, minval=1, title="Length") src50 = input(close, title="Source") out50 = ema(src50, len50) len100 = input(100) src100 = input(close, title="Source") out100 = ema(src100, len100) len1 = input(1, minval=1, title="Length") src1 = input(close, title="Source") out1 = sma(src1, len1) length = input(5, minval=1) OverBought = input(80) OverSold = input(20) smoothK = 3 smoothD = 3 k = sma(stoch(close, high, low, length), smoothK) d = sma(k, smoothD) cu = crossover(k,OverSold) co = crossunder(k,OverBought) sma_down = crossunder(out1, out50) sma_up = crossover(out1,out50) //if (not na(k) and not na(d)) // if (co and k < OverSold) // strategy.entry("StochLE", strategy.long, comment="StochLE") //if (cu and k > OverBought) // strategy.entry("StochSE", strategy.short, comment="StochSE") crossCandle_4 = crossover(src[4],out50) crossCandleUnder_4= cross(src[4],out50) crossCandle_3 = crossover(src[3],out50) crossCandleUnder_3= crossunder(src[3],out50) crossCandle_2 = crossover(src[2],out50) crossCandleUnder_2= crossunder(src[2],out50) crossCandle_1 = crossover(src[1],out50) crossCandleUnder_1= crossunder(src[1],out50) crossCandle_0 = crossover(src[0],out50) crossCandleUnder_0= crossunder(src[0],out50) conditionOver = (crossCandle_4 or crossCandle_3 or crossCandle_2 or crossCandle_1 or crossCandle_0) conditionUnder =(crossCandleUnder_4 or crossCandleUnder_3 or crossCandleUnder_2 or crossCandleUnder_1 or crossCandleUnder_0) touch4 = (cross(low[4],out50) or cross(high[4],out50)) touch3 = (cross(low[3],out50) or cross(high[3],out50)) touch2 = (cross(low[2],out50) or cross(high[2],out50)) touch1 = (cross(low[1],out50) or cross(high[1],out50)) touch = touch1 or touch2 or touch3 or touch4 //and sma_up //and sma_down // Getting inputs fast_length = input(title="Fast Length", type=input.integer, defval=12) slow_length = input(title="Slow Length", type=input.integer, defval=26) src_macd = input(title="Source", type=input.source, defval=close) signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9) sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false) sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false) // Plot colors col_grow_above = #26A69A col_grow_below = #FFCDD2 col_fall_above = #B2DFDB col_fall_below = #EF5350 col_macd = #0094ff col_signal = #ff6a00 // Calculating fast_ma = sma_source ? sma(src_macd, fast_length) : ema(src_macd, fast_length) slow_ma = sma_source ? sma(src_macd, slow_length) : ema(src_macd, slow_length) macd = fast_ma - slow_ma signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length) hist = macd - signal //plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 ) //plot(macd, title="MACD", color=col_macd, transp=0) //plot(signal, title="Signal", color=col_signal, transp=0) // plot((conditionOver or conditionUnder or touch) and src[0] >= out50 and close >= out50 and (cu) and out50 > out100 and hist>=0 , title="Buy", style=plot.style_columns, color=color.lime) // plot((conditionOver or conditionUnder or touch) and src[0] <= out50 and close <= out50 and (co) and out50< out100 and hist<=0 , title="sell", style=plot.style_columns, color=color.red) long_cond = ((conditionOver or conditionUnder or touch) and src[0] >= out50 and close > out50 and (cu) and out50 > out100 and hist>=0) short_cond = ((conditionOver or conditionUnder or touch) and src[0] <= out50 and close < out50 and (co) and out50< out100 and hist<=0) tp=input(0.1) sl=input(0.1) strategy.entry("long",strategy.long, when=long_cond) strategy.entry("short",strategy.short, when=short_cond) strategy.exit("X_long", "long", profit=close * tp / syminfo.mintick, loss=close * sl / syminfo.mintick, when=touch ) strategy.exit("x_short", "short",profit=close * tp / syminfo.mintick,loss=close * sl / syminfo.mintick,when = touch ) // //tp = input(0.0003, title="tp") // tp = 0.0003 // //sl = input(1.0 , title="sl") // sl = 1.0 // strategy.exit("closelong", "long" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closelong") // strategy.exit("closeshort", "short" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closeshort")