Pengoptimuman Portfolio Strategi Purata Pergerakan yang Dilancarkan


Tarikh penciptaan: 2024-01-26 14:57:08 Akhirnya diubah suai: 2024-01-26 14:57:08
Salin: 1 Bilangan klik: 583
1
fokus pada
1617
Pengikut

Pengoptimuman Portfolio Strategi Purata Pergerakan yang Dilancarkan

Gambaran keseluruhan

Strategi ini adalah berdasarkan kombinasi rata-rata bergerak yang licin dengan penunjuk Stochastic, dengan tujuan untuk menangkap lebih banyak peluang dalam trend. Ia menggunakan rata-rata bergerak indeks dari dua tempoh yang berbeza untuk membentuk isyarat strategi, digabungkan dengan persilangan garis K dan garis D dalam penunjuk Stochastic sebagai pilihan masa masuk untuk mengharapkan keuntungan yang lebih tinggi dalam trend.

Prinsip Strategi

Strategi ini menggunakan dua rata-rata bergerak licin 12 kitaran dan 26 kitaran. Apabila garis pantas melintasi garis perlahan dari bawah, lakukan lebih banyak; Apabila garis pantas melintasi garis perlahan dari atas ke bawah, kosongkan. Untuk menyaring isyarat palsu, ia memerlukan garis pantas dan garis perlahan yang sama arah, garis pantas boleh dilakukan lebih banyak di atas garis perlahan, dan garis pantas boleh kosong di bawah garis perlahan.

Garis K dalam penunjuk Stochastic bersalin dengan garis D sebagai pilihan masa masuk. Garis K bersalin dengan garis D dari arah bawah garis superbeli, buat lebih; Garis K bersalin dengan garis D dari arah bawah kawasan superbeli, buat kosong.

Rata-rata bergerak yang lancar menentukan arah trend, penunjuk Stochastic menyaring Noise dan memilih masa masuk. Gabungan mereka dapat memberikan lebih banyak peluang keuntungan dalam trend.

Kelebihan Strategik

  • Strategi purata bergerak yang licin mempunyai ciri-ciri yang lebih baik dan lebih mudah untuk mengesan trend
  • Menggunakan penapis bunyi Stochastic untuk meningkatkan peluang keuntungan
  • Gabungan garis laju dan perlahan, apabila garis laju dipindahkan ke garis perlahan, peluang permainan yang lebih baik dapat diperoleh
  • Garis K dalam penunjuk Stochastic digunakan dalam kombinasi silang dengan Garis D, untuk memilih lebih baik titik masuk

Oleh itu, strategi ini boleh dilakukan secara beransur-ansur dan secara selektif untuk merebut peluang yang menghasilkan kadar keuntungan yang lebih tinggi.

Analisis risiko

  • Risiko berlepas dalam jangka masa pendek lebih tinggi. Apabila talian cepat disalurkan semula ke talian perlahan, ia mungkin ditolak atau terjebak
  • Oleh kerana sifatnya yang berpijak, ia tidak dapat menyesuaikan diri dengan cepat apabila keadaan berubah secara mendadak, dan boleh menyebabkan kerugian yang lebih besar

Untuk mengurangkan risiko ini, kita boleh menetapkan stop loss, atau menggunakan kombinasi parameter purata bergerak yang lebih longgar.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dengan cara berikut:

  1. Uji kombinasi parameter moving average yang berbeza untuk mencari yang terbaik
  2. Uji kombinasi parameter Stochastic yang berbeza
  3. Meningkatkan strategi hentikan kerugian
  4. Peningkatan stop loss dinamik berdasarkan kadar turun naik
  5. Optimumkan kombinasi untuk parameter kitaran yang berbeza untuk menguji pelbagai jenis
  6. Parameter pengoptimuman untuk menguji algoritma pembelajaran mesin

Dengan menguji kombinasi parameter yang berbeza, parameter yang lebih kuat dapat dijumpai; pada masa yang sama, menetapkan strategi stop loss dapat mengurangkan risiko dengan berkesan dan meningkatkan kestabilan strategi.

ringkaskan

Strategi ini menggabungkan kelebihan rata-rata bergerak yang licin dengan penunjuk Stochastic, boleh mengikuti trend secara beransur-ansur, dan memilih masa masuk yang lebih baik. Ia mudah dikendalikan, boleh dikawal risiko, dan mempunyai nilai praktikal yang besar.

Kod sumber strategi
/*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")