Strategi Stop Loss yang Dinamis

Penulis:ChaoZhang, Tanggal: 2023-12-29 10:42:27
Tag:

img

Gambaran umum

Strategi stop loss trailing yang dinamis adalah strategi perdagangan kuantitatif yang memanfaatkan mekanisme stop loss trailing. Ini menetapkan garis stop loss trailing berdasarkan teori pelacakan tren untuk mengkonfirmasi stop loss dan menyesuaikan stop loss trailing.

Logika Strategi

Inti dari strategi stop loss trailing dinamis terletak pada pengaturan tiga parameter utama: jarak stop loss awal, jarak stop loss trailing dan jarak trigger stop loss trailing. Setelah sinyal beli dipicu, harga stop loss awal dihitung berdasarkan harga masuk dan jarak stop loss awal yang ditetapkan. Kemudian, setiap bar akan menilai apakah kondisi trigger stop loss trailing terpenuhi. Jika ya, harga stop loss trailing baru akan ditetapkan. Harga stop loss trailing baru dihitung berdasarkan harga penutupan saat ini dan jarak stop loss trailing. Dengan demikian, selama harga berjalan ke arah yang menguntungkan, garis stop loss trailing akan terus bergerak ke atas untuk mengunci keuntungan. Ketika pembalikan harga memicu garis stop loss trailing, sinyal jual akan dihasilkan.

Strategi ini juga memiliki stop loss yang lebih rendah. Tidak peduli apakah stop loss trailing diaktifkan atau tidak, jika harga pecah di bawah stop loss yang lebih rendah, stop loss akan langsung dipicu. Stop loss yang lebih rendah berfungsi untuk melindungi dari kesenjangan harga yang disebabkan oleh peristiwa mendadak. Oleh karena itu, melalui mekanisme stop loss dinamis dalam bentuk stop loss double-line, garis stop loss dapat secara otomatis melacak tren yang menguntungkan, sambil mencegah kerugian yang berlebihan.

Keuntungan

  1. Tetap mengunci keuntungan melalui stop loss, menghindari memberikan terlalu banyak ruang retracement.

  2. Mengadopsi struktur stop loss dua baris untuk memastikan garis stop loss dapat segera ditindaklanjuti, sementara mencegah kerugian yang berlebihan.

  3. Menggunakan mekanisme penilaian terus menerus untuk penyesuaian stop loss dengan operasi sederhana dan penerapan yang mudah.

  4. Parameter dapat dioptimalkan sesuai dengan karakteristik pasar dan saham untuk meningkatkan efektivitas stop loss.

  5. Tidak perlu memprediksi tren pasar, hanya mengikuti tren.

Risiko

  1. Pengaturan parameter yang tidak benar dapat mengakibatkan stop loss yang terlalu longgar atau terlalu ketat.

  2. Dalam hal kesenjangan harga yang disebabkan oleh peristiwa tiba-tiba, mungkin tidak dapat menghentikan kerugian.

  3. Biaya perdagangan dan slippage dapat mempengaruhi harga penjualan yang sebenarnya setelah garis stop loss dipicu.

  4. Kemampuan beradaptasi tidak kuat. Tidak bekerja dengan baik pada tahap tertentu, seperti gerakan yang terbatas.

Pengendalian:

  1. Disarankan untuk terus mengoptimalkan parameter berdasarkan hasil backtest dan live.
  2. Atur stop loss yang lebih luas dan lebih rendah untuk melindungi dari kesenjangan harga.
  3. Perhatikan biaya perdagangan dan slippage saat menghitung harga stop loss.
  4. Penggunaan dalam kombinasi dengan indikator tren dan volatilitas.

Arahan untuk Optimalisasi

  1. Sesuaikan garis stop loss trailing dalam perubahan persentase, yang dapat lebih baik melacak pergerakan harga di berbagai tingkat harga.

  2. Menambahkan metrik volatilitas untuk menangguhkan stop loss saat menghadapi volatilitas tinggi, menghindari fluktuasi normal dari memicu stop loss.

  3. Optimalkan parameter secara otomatis melalui pembelajaran mesin. Pilih pengembalian kombinasi parameter yang berbeda dalam periode terakhir sebagai sampel pelatihan.

  4. Tambahkan kriteria posisi terbuka dengan mempertimbangkan indikator seperti tren, dukungan & resistensi untuk menghindari posisi terbuka di berbagai pasar.

Kesimpulan

Strategi stop loss trailing dinamis menetapkan garis stop loss trailing melalui mekanisme stop loss double-line untuk mengkonfirmasi stop loss dan menyesuaikan stop loss trailing berdasarkan perubahan harga. Ini dapat secara otomatis menyesuaikan jarak stop loss untuk mengunci keuntungan, mengurangi pullback dan mengendalikan kerugian. Dengan operasi yang sederhana dan penerapan yang mudah, strategi ini dapat lebih dioptimalkan berdasarkan kondisi pasar dan digunakan bersama dengan strategi lain untuk kinerja yang lebih baik. Tetapi juga memiliki beberapa keterbatasan. Adalah disarankan untuk memperbaikinya dan mengujinya dengan cukup sebelum menerapkannya dalam perdagangan langsung.


/*backtest
start: 2023-11-28 00:00:00
end: 2023-12-17 00:00:00
period: 1h
basePeriod: 15m
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/
// © Thumpyr
//@version=5

/////////////////////////////////////////////////////////////////////////////////////////////
// Comment out Strategy Line and remove // from Indicator line to turn into Indicator  //////
// Do same for alertConidction at bottom                                               //////
/////////////////////////////////////////////////////////////////////////////////////////////
strategy("PCT Trailing Stoploss-Strategy", shorttitle="PCT Trailing Stoploss- Strategy", overlay=true)
//indicator(title="PCT Trailing Stoploss- Indicator", shorttitle="PCT Trailing Stoploss - Indicator", timeframe="", timeframe_gaps=true, overlay=true)//

sellLow=input.float(.035, minval=0, title="Stop Loss Loss: 1% = .01", group="Sell Settings")
trailStopArm=input.float(.0065, minval=0, title="Trailing Stop Arm: 1%=.01", group="Sell Settings")
trailStopPct=input.float(.003, minval=0, title="Trailing Stop Trigger: 1%=.01 ", group="Sell Settings")

/////////////////////////////////////////////////
//               Indicators                    //
/////////////////////////////////////////////////
ema1Len = input.int(14, minval=1, title=" ema 1 Length", group="Trend Line Settings")
ema1Src = input(close, title="ema 1 Source", group="Trend Line Settings")
ema1 = ta.ema(ema1Src, ema1Len)
plot(ema1, title="EMA", color=color.blue)

ema2Len = input.int(22, minval=1, title=" ema 2 Length", group="Trend Line Settings")
ema2Src = input(close, title="ema 2 Source", group="Trend Line Settings")
ema2 = ta.ema(ema2Src, ema2Len)
plot(ema2, title="EMA", color=color.orange)

ema3Len = input.int(200, minval=1, title=" ema 3 Length", group="Trend Line Settings")
ema3Src = input(close, title="ema 2 Source", group="Trend Line Settings")
ema3 = ta.ema(ema3Src, ema3Len)
plot(ema3, title="EMA", color=color.gray)


/////////////////////////////
////   Buy Conditions    ////
/////////////////////////////

alertBuy = ta.crossover(ema1,ema2) and close>ema3

////////////////////////////////////////////////////////////////////
////   Filter redundant Buy Signals if Sell has not happened    ////
////////////////////////////////////////////////////////////////////
var lastsignal = 0
showAlertBuy = 0
if(alertBuy and lastsignal !=1)
    showAlertBuy  := 1
    lastsignal      := 1
buyAlert= showAlertBuy > 0


//////////////////////////////////////////////////////////////////
////          Track Conditions at buy Signal                  ////
//////////////////////////////////////////////////////////////////

alertBuyValue = ta.valuewhen(buyAlert, close,0)
alertSellValueLow = alertBuyValue - (alertBuyValue*sellLow)

////////////////////////////////////////////////////////////
/////            Trailing Stop                         /////
////////////////////////////////////////////////////////////
var TSLActive=0         //Check to see if TSL has been activated
var TSLTriggerValue=0.0 //Initial and climbing value of TSL
var TSLStop = 0.0       //Sell Trigger
var TSLRunning =0       //Continuously check each bar to raise TSL or not

//  Check if a Buy has been triggered and set initial value for TSL //
if buyAlert
    TSLTriggerValue := alertBuyValue+(alertBuyValue*trailStopArm)
    TSLActive := 0
    TSLRunning :=1
    TSLStop := TSLTriggerValue - (TSLTriggerValue*trailStopPct)
    

//  Check that Buy has triggered and if Close has reached initial TSL//  
//  Keeps from setting Sell Signal before TSL has been armed w/TSLActive//
beginTrail=TSLRunning==1 and TSLActive==0 and close>alertBuyValue+(alertBuyValue*trailStopArm) and ta.crossover(close,TSLTriggerValue)
if beginTrail
    TSLTriggerValue :=close
    TSLActive :=1
    TSLStop :=TSLTriggerValue - (TSLTriggerValue*trailStopPct)
    
//  Continuously check if TSL needs to increase and set new value //    
runTrail= TSLActive==1 and (ta.crossover(close,TSLTriggerValue) or close>=TSLTriggerValue)
if runTrail
    TSLTriggerValue :=close
    TSLStop :=TSLTriggerValue - (TSLTriggerValue*trailStopPct)
    
//  Verify that TSL is active and trigger when close cross below TSL Stop//
TSL=TSLActive==1 and (ta.crossunder(close,TSLStop) or (close[1]>TSLStop and close<TSLStop)) 

// Plot point of inital arming of TSL//
TSLTrigger=TSLActive==1 and TSLActive[1]==0
plotshape(TSLTrigger, title='TSL Armed', location=location.abovebar, color=color.new(color.blue, 0), size=size.small, style=shape.cross, text='TSL Armed')


////////////////////////////////////////////////////////////
// Plots used for troubleshooting and verification of TSL //
////////////////////////////////////////////////////////////
//plot(TSLActive,"Trailing Stop", color=#f48fb1)
//plot(TSLRunning,"Trailing Stop", color=#f48fb1)
//plot(TSLTriggerValue,"Trailing Stop Trigger", color.new(color=#ec407a, transp = TSLRunning==1 ? 0 : 100))
//plot(TSLStop,"Trailing Stop", color.new(color=#f48fb1, transp = TSLRunning==1 ? 0 : 100))//


////////////////////////////////////////////////////////////
/////             Sell Conditions                    ///////
////////////////////////////////////////////////////////////
Sell1 = TSL
Sell2 = ta.crossunder(close,alertSellValueLow)

alertSell= Sell1 or Sell2
////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////
////        Remove Redundant Signals                    ////
////////////////////////////////////////////////////////////
showAlertSell = 0
if(alertSell and lastsignal != -1)
    showAlertSell := 1
    lastsignal      := -1
sellAlert= showAlertSell > 0

if sellAlert
    TSLActive :=0
    TSLRunning :=0

/////////////////////////////////////////
//  Plot Buy and Sell Shapes on Chart  //
/////////////////////////////////////////
plotshape(buyAlert, title='Buy', location=location.belowbar, color=color.new(color.green, 0), size=size.small, style=shape.triangleup, text='Buy')
plotshape(sellAlert, title='Sell', location=location.abovebar, color=color.new(color.red, 0), size=size.small, style=shape.triangledown, text='Sell')

/////////////////////////////////////////////////////////////////////////////////////////////
//                        Remove // to setup for Indicator                                 //
/////////////////////////////////////////////////////////////////////////////////////////////
//Alerts
//alertcondition(title='Buy Alert', condition=buyAlert, message='Buy Conditions are Met')
//alertcondition(title='Sell Alert', condition=sellAlert, message='Sell Conditions are Met')
/////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////
////  Comment out this section if setup as Indicator    ////
////////////////////////////////////////////////////////////
longCondition = buyAlert
if (longCondition)
    strategy.entry("Buy", strategy.long)
    alert(message='Buy', freq=alert.freq_once_per_bar_close)
    
shortCondition = sellAlert
if (shortCondition)
    strategy.close_all(sellAlert,"Sell")
    alert(message='Sell', freq=alert.freq_once_per_bar_close)
/////////////////////////////////////////////////////////////




Lebih banyak