EMA harga dengan optimasi stokastik berdasarkan pembelajaran mesin

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

img

Gambaran umum

Strategi ini menggabungkan Smooth Moving Average dengan indikator Stochastic untuk menangkap lebih banyak peluang dalam tren. Ini terutama menggunakan dua rata-rata bergerak eksponensial dengan periode yang berbeda untuk menghasilkan sinyal perdagangan, bersama dengan persilangan garis K dan garis D dalam indikator Stochastic untuk pemilihan waktu masuk, untuk mendapatkan profitabilitas yang lebih tinggi dalam tren.

Prinsip Strategi

Strategi ini menggunakan rata-rata bergerak mulus 12 periode dan 26 periode. Ketika garis cepat melintasi di atas garis lambat dari bawah, pergi panjang. Ketika garis cepat melintasi di bawah garis lambat dari atas, pergi pendek. Untuk menyaring sinyal palsu, dibutuhkan garis cepat dan lambat berada di arah yang sama, dengan garis cepat di atas garis lambat untuk panjang, dan garis cepat di bawah garis lambat untuk pendek.

Crossover dari garis K dan garis D dalam indikator Stochastic digunakan untuk pemilihan waktu masuk. Ketika garis K melintasi di atas garis D dari bawah garis overbought, pergi panjang. Ketika garis K melintasi di bawah garis D dari di atas garis oversold, pergi pendek.

Rata-rata bergerak halus menentukan arah tren, sementara indikator Stochastic menyaring Noise dan memilih waktu masuk.

Keuntungan dari Strategi

  • Rata-rata bergerak halus itu sendiri memiliki karakteristik tren-mengikuti, mudah untuk melacak tren
  • Menggunakan Stochastic untuk menyaring Noise dan meningkatkan profitabilitas
  • Kombinasi MA cepat dan lambat memungkinkan masuk ketika MA cepat menarik kembali ke MA lambat, mendapatkan risiko-balasan yang lebih baik
  • Crossover dari jalur K dan jalur D memberikan optimasi waktu lebih lanjut

Oleh karena itu, strategi ini dapat mengikuti tren secara selektif untuk menangkap peluang, mendapatkan profitabilitas yang lebih tinggi.

Analisis Risiko

  • Risiko tinggi keluar prematur dalam jangka pendek. Sinyal dapat ditolak atau terjebak ketika MA cepat menarik kembali ke MA lambat
  • Karena mengikuti tren, ia tidak dapat beradaptasi dengan cepat dengan pembalikan tren drastis, menyebabkan kerugian besar.

Untuk mengurangi risiko tersebut, kita bisa mengatur stop loss, atau mengadopsi parameter MA yang lebih moderat.

Arahan Optimasi

Strategi ini dapat dioptimalkan lebih lanjut dari aspek berikut:

  1. Uji kombinasi yang berbeda dari parameter MA untuk menemukan yang optimal
  2. Uji kombinasi yang berbeda dari parameter Stochastic
  3. Tambahkan strategi stop loss
  4. Tambahkan stop loss dinamis berdasarkan volatilitas
  5. Optimalisasi parameter uji di berbagai produk dan kerangka waktu
  6. Menggunakan algoritma pembelajaran mesin untuk mengoptimalkan parameter

Dengan menguji kombinasi parameter yang berbeda, parameter yang lebih baik dapat ditemukan. Juga, strategi stop loss dapat secara efektif mengurangi risiko dan meningkatkan stabilitas.

Kesimpulan

Strategi ini mengintegrasikan kekuatan Smooth Moving Average dan Stochastic untuk mengikuti tren, sambil memilih waktu masuk yang lebih baik. Ini mudah dioperasikan, dengan risiko yang dapat dikendalikan dan nilai praktis yang besar. Kinerja dapat ditingkatkan lebih lanjut melalui pengujian dan optimalisasi terus-menerus. Ini memberikan pedagang kuant model pelacakan tren yang efisien 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 banyak