Sumber daya yang dimuat... Pemuatan...

Strategi Perdagangan Saham Quant Menggabungkan Rata-rata Bergerak Eksponensial dengan Stop Loss Trailing dan Stop Loss Persentase

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

img

Gambaran umum

Inti dari strategi ini adalah menggunakan crossover rata-rata bergerak eksponensial sebagai sinyal perdagangan, dikombinasikan dengan trailing stop loss dan persentase stop loss untuk mengunci keuntungan dan mengendalikan risiko.

Logika Strategi

  1. Menghitung EMA cepat dan EMA lambat, dengan periode EMA cepat adalah 20 hari dan periode EMA lambat adalah 50 hari.

  2. Setelah masuk, atur stop loss trailing berdasarkan arah holding, misalnya 7% untuk posisi long dan 7% untuk posisi short.

  3. Pada saat yang sama, tetapkan harga stop loss berdasarkan harga masuk dan arah kepemilikan, misalnya 2% di bawah harga masuk untuk perdagangan panjang dan 2% di atas harga masuk untuk perdagangan pendek.

  4. Bandingkan harga stop trailing dan harga stop loss, gunakan yang lebih dekat dengan harga pasar sebagai stop loss akhir untuk perdagangan ini, kirimkan perintah stop loss.

Keuntungan

  1. Sederhana dan mudah untuk menerapkan sinyal perdagangan rata-rata bergerak.

  2. Mengikuti stop loss mengunci keuntungan sejauh mungkin, sementara menghindari kerugian yang tidak perlu dari sinyal palsu.

  3. Persentase stop loss intuitif dan mudah disesuaikan untuk mengontrol kerugian maksimum per perdagangan.

  4. Menggabungkan trailing stop dan stop tetap kedua kunci dalam keuntungan dan mengontrol risiko.

Risiko dan Tindakan Balap

  1. Rata-rata bergerak dapat menghasilkan sinyal palsu dengan mudah, menambahkan filter lebih lanjut seperti volume.

  2. Trailing berhenti kadang-kadang memicu terlalu awal, relaksasi persentase trailing sedikit.

  3. Pengaturan stop loss tetap yang tidak benar bisa terlalu agresif atau konservatif, perlu menguji dan menyesuaikan parameter persentase.

  4. Mekanis stop loss exit bisa kehilangan peluang pembalikan pasar, menggabungkan indikator teknis untuk menilai stop trigger.

Arahan Optimasi

  1. Cobalah kombinasi EMA yang berbeda untuk menemukan keseimbangan yang optimal.

  2. Tambahkan indikator seperti volume untuk menyaring sinyal palsu.

  3. Uji lebih banyak saham untuk menemukan persentase stop loss yang tepat.

  4. Cobalah stop adaptif yang menyesuaikan dengan kondisi pasar.

  5. Sertakan indikator seperti RSI untuk menentukan waktu stop loss.

Ringkasan

Strategi ini mengintegrasikan sinyal perdagangan rata-rata bergerak, trailing stop dan stop persentase. Melalui optimasi parameter, dapat mencapai keuntungan yang stabil dengan pengendalian risiko yang ketat di berbagai saham dan komoditas, yang layak untuk diteliti dan terus ditingkatkan untuk pedagang kuantitas.


/*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 banyak