Strategi Dagangan Saham Quant Menggabungkan Purata Bergerak Eksponensial dengan Stop Loss Trailing dan Peratusan Stop Loss

Penulis:ChaoZhang, Tarikh: 2024-01-03 16:25:54
Tag:

img

Ringkasan

Inti strategi ini adalah menggunakan persimpangan purata bergerak eksponensial sebagai isyarat perdagangan, digabungkan dengan stop loss dan peratusan stop loss untuk mengunci keuntungan dan mengawal risiko. Strategi ini mudah dilaksanakan dan boleh digunakan untuk saham dan produk kewangan lain untuk perdagangan kuantitatif.

Logika Strategi

  1. Mengira EMA pantas dan EMA perlahan, dengan tempoh EMA pantas adalah 20 hari dan tempoh EMA perlahan adalah 50 hari. Membuat isyarat beli apabila EMA pantas melintasi EMA perlahan, dan isyarat jual apabila EMA pantas melintasi EMA perlahan.

  2. Selepas masuk, tetapkan stop loss mengikut hala tuju pegangan, contohnya 7% untuk kedudukan panjang dan 7% untuk kedudukan pendek.

  3. Pada masa yang sama, tetapkan harga stop loss berdasarkan harga kemasukan dan hala tuju pegangan, contohnya 2% di bawah harga kemasukan untuk perdagangan panjang dan 2% di atas harga kemasukan untuk perdagangan pendek.

  4. Bandingkan harga hentian dan harga hentian kerugian, gunakan yang lebih dekat dengan harga pasaran sebagai hentian kerugian akhir untuk perdagangan ini, hantar pesanan hentian kerugian.

Kelebihan

  1. Sederhana dan mudah untuk melaksanakan isyarat perdagangan purata bergerak.

  2. Mengikuti stop loss mengunci keuntungan sejauh mungkin, sambil mengelakkan kerugian yang tidak perlu daripada isyarat palsu.

  3. Peratusan stop loss adalah intuitif dan mudah diselaraskan untuk mengawal kerugian maksimum setiap perdagangan.

  4. Menggabungkan trailing stop dan berhenti tetap kedua-dua kunci dalam keuntungan dan kawalan risiko.

Risiko dan Tindakan Balas

  1. Purata bergerak boleh menghasilkan isyarat palsu dengan mudah, menambah penapis tambahan seperti jumlah.

  2. Penghentian penghantaran kadang-kadang mencetuskan terlalu awal, santai peratusan penghantaran sedikit.

  3. Tetapan stop loss tetap yang tidak betul boleh menjadi terlalu agresif atau konservatif, perlu menguji dan menyesuaikan parameter peratusan.

  4. Penarikan stop loss mekanikal boleh terlepas peluang pembalikan pasaran, menggabungkan penunjuk teknikal untuk menilai pemicu berhenti.

Arahan pengoptimuman

  1. Cuba kombinasi EMA yang berbeza untuk mencari keseimbangan yang optimum.

  2. Tambah penunjuk seperti kelantangan untuk menapis isyarat palsu.

  3. Uji lebih banyak saham untuk mencari peratusan stop loss yang sesuai.

  4. Cuba berhenti adaptif yang menyesuaikan dengan keadaan pasaran.

  5. Sertakan penunjuk seperti RSI untuk menentukan masa berhenti kerugian.

Ringkasan

Strategi ini mengintegrasikan isyarat perdagangan purata bergerak, hentian dan hentian peratusan. Melalui pengoptimuman parameter, ia dapat mencapai keuntungan yang stabil dengan kawalan risiko yang ketat di pelbagai saham dan komoditi, yang bernilai penyelidikan dan peningkatan berterusan untuk peniaga kuantiti.


/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © wouterpruym1828

//@version=5
strategy(title=" Combining Trailing Stop and Stop loss (% of instrument price)",
     overlay=true, pyramiding=1, shorttitle="TSL&SL%")

//INDICATOR SECTION

// Indicator Input options+
i_FastEMA = input.int(title = "Fast EMA period", minval = 0, defval = 20)
i_SlowEMA = input.int(title = "Slow EMA period", minval = 0, defval = 50)
     
// Calculate moving averages
fastEMA = ta.ema(close, i_FastEMA)
slowEMA = ta.ema(close, i_SlowEMA)

// Plot moving averages
plot(fastEMA, title="Fast SMA", color=color.blue)
plot(slowEMA, title="Slow SMA", color=color.orange)




//STRATEGY SECTION  

// Calculate trading conditions
buy  = ta.crossover(fastEMA, slowEMA)
sell = ta.crossunder(fastEMA, slowEMA)

// STEP 1:
// Configure trail stop loss level with input options (optional)

longTrailPerc = input.float(title="Long Trailing Stop (%)", minval=0.0, step=0.1, defval=7) * 0.01

shortTrailPerc = input.float(title="Short Trailing Stop (%)", minval=0.0, step=0.1, defval=7) * 0.01

//Configure stop loss level with input options (optional)

longStopPerc = input.float(title="Long Stop Loss (%)", minval=0.0, step=0.1, defval=2)*0.01

shortStopPerc = input.float(title="Short Stop Loss (%)", minval=0.0, step=0.1, defval=2)*0.01


// STEP 2:
// Determine trail stop loss prices
longTrailPrice = 0.0, shortTrailPrice = 0.0

longTrailPrice := if (strategy.position_size > 0)
    stopValue = high * (1 - longTrailPerc)
    math.max(stopValue, longTrailPrice[1])
else
    0

shortTrailPrice := if (strategy.position_size < 0)
    stopValue = low * (1 + shortTrailPerc)
    math.min(stopValue, shortTrailPrice[1])
else
    999999

// Determine stop loss prices
entryPrice = 0.0

entryPrice := strategy.opentrades.entry_price(strategy.opentrades - 1)


longLossPrice = entryPrice * (1 - longStopPerc)

shortLossPrice = entryPrice * (1 + shortStopPerc)


// Plot stop loss values for confirmation

plot(series=(strategy.position_size > 0) ? longTrailPrice : na,
     color=color.fuchsia, style=plot.style_cross,
     linewidth=2, title="Long Trail Stop")
plot(series=(strategy.position_size < 0) ? shortTrailPrice : na,
     color=color.fuchsia, style=plot.style_cross,
     linewidth=2, title="Short Trail Stop")

plot(series=(strategy.position_size > 0) ? longLossPrice : na,
     color=color.olive, style=plot.style_cross,
     linewidth=2, title="Long Stop Loss")
plot(series=(strategy.position_size < 0) ? shortLossPrice : na,
     color=color.olive, style=plot.style_cross,
     linewidth=2, title="Short Stop Loss")

// Submit entry orders
if (buy)
    strategy.entry("Buy", strategy.long)

if (sell)
    strategy.entry("Sell", strategy.short)


//Evaluating trailing stop or stop loss to use

longStopPrice = longTrailPrice < longLossPrice ? longLossPrice : longTrailPrice

shortStopPrice = shortTrailPrice > shortLossPrice ? shortLossPrice : shortTrailPrice

// STEP 3:
// Submit exit orders for stop price

if (strategy.position_size > 0)
    strategy.exit(id="Buy Stop", stop=longStopPrice)

if (strategy.position_size < 0)
    strategy.exit(id="Sell Stop", stop=shortStopPrice)


Lebih lanjut