EMA harga dengan pengoptimuman stokastik berdasarkan pembelajaran mesin

Penulis:ChaoZhang, Tarikh: 2024-01-26 14:57:08
Tag:

img

Ringkasan

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.

Prinsip Strategi

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.

Kelebihan Strategi

  • Purata bergerak yang lancar sendiri mempunyai ciri trend-mengikuti, mudah untuk mengesan trend
  • Menggunakan Stochastic untuk menapis Bunyi dan meningkatkan keuntungan
  • Gabungan MA pantas dan perlahan membolehkan masuk apabila MA pantas menarik kembali ke MA perlahan, mendapatkan risiko-balasan yang lebih baik
  • Persalinan garis K dan garis D memberikan pengoptimuman masa yang lebih lanjut

Oleh itu, strategi ini boleh mengikuti trend secara selektif untuk merebut peluang, memperoleh keuntungan yang lebih tinggi.

Analisis Risiko

  • Risiko tinggi untuk keluar lebih awal dalam jangka pendek. Isyarat mungkin ditolak atau terperangkap apabila MA cepat menarik kembali ke MA perlahan
  • Oleh kerana ia mengikuti trend, ia tidak dapat menyesuaikan diri dengan cepat dengan pembalikan trend yang drastik, yang membawa kepada kerugian besar.

Untuk mengurangkan risiko itu, kita boleh menetapkan stop loss, atau menggunakan parameter MA yang lebih sederhana.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan lagi dari aspek berikut:

  1. Uji gabungan parameter MA yang berbeza untuk mencari yang optimum
  2. Uji gabungan parameter Stochastic yang berbeza
  3. Tambah strategi stop loss
  4. Tambahkan stop loss dinamik berdasarkan turun naik
  5. Pengoptimuman parameter ujian merentasi produk dan jangka masa yang berbeza
  6. Menggunakan algoritma pembelajaran mesin untuk mengoptimumkan parameter

Dengan menguji kombinasi parameter yang berbeza, parameter yang lebih baik dapat dijumpai. Juga, strategi stop loss dapat mengurangkan risiko dengan berkesan dan meningkatkan kestabilan.

Kesimpulan

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")

Lebih lanjut