Strategi ini menggabungkan purata bergerak licin dengan penunjuk Stochastic untuk menangkap lebih banyak peluang dalam trend. Ia terutamanya menggunakan dua purata bergerak eksponensial dengan tempoh yang berbeza untuk menjana isyarat perdagangan, bersama-sama dengan persilangan garis K dan garis D dalam penunjuk Stochastic untuk pemilihan masa kemasukan, untuk mendapatkan keuntungan yang lebih tinggi dalam trend.
Strategi ini menggunakan purata bergerak lancar 12 tempoh dan 26 tempoh. Apabila garis pantas melintasi di atas garis perlahan dari bawah, pergi panjang. Apabila garis pantas melintasi di bawah garis perlahan dari atas, pergi pendek. Untuk menapis isyarat palsu, ia memerlukan garis pantas dan perlahan berada dalam arah yang sama, dengan garis pantas di atas garis perlahan untuk panjang, dan garis pantas di bawah garis perlahan untuk pendek.
Penyambungan garis K dan garis D dalam penunjuk Stochastic digunakan untuk pemilihan masa kemasukan. Apabila garis K melintasi di atas garis D dari bawah garis overbought, pergi panjang. Apabila garis K melintasi di bawah garis D dari atas garis oversold, pergi pendek.
Purata bergerak yang lancar menentukan arah trend, manakala penunjuk Stochastic menapis Noise dan memilih masa kemasukan.
Oleh itu, strategi ini boleh mengikuti trend secara selektif untuk merebut peluang, memperoleh keuntungan yang lebih tinggi.
Untuk mengurangkan risiko itu, kita boleh menetapkan stop loss, atau menggunakan parameter MA yang lebih sederhana.
Strategi ini boleh dioptimumkan lagi dari aspek berikut:
Dengan menguji kombinasi parameter yang berbeza, parameter yang lebih baik dapat dijumpai. Juga, strategi stop loss dapat mengurangkan risiko dengan berkesan dan meningkatkan kestabilan.
Strategi ini mengintegrasikan kekuatan Smooth Moving Average dan Stochastic untuk mengikuti trend, sambil memilih masa kemasukan yang lebih baik. Ia mudah dikendalikan, dengan risiko yang boleh dikawal dan nilai praktikal yang besar. Prestasinya boleh ditingkatkan dengan ujian dan pengoptimuman berterusan. Ia menyediakan pedagang kuant model penjejakan trend yang cekap dan stabil.
/*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")