Strategy Stop Loss yang Dinamik

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

img

Ringkasan

Strategi Stop Loss Dinamik adalah strategi perdagangan kuantitatif yang menggunakan mekanisme Stop Loss. Ia menetapkan garis Stop Loss Terakhir berdasarkan teori penjejakan trend untuk mengesahkan Stop Loss dan menyesuaikan Stop Loss Terakhir. Ia digunakan terutamanya untuk mengawal Stop Loss perdagangan tunggal, memaksimumkan kunci keuntungan, dan mengurangkan risiko perdagangan.

Logika Strategi

Inti strategi stop loss trailing dinamik terletak pada menetapkan tiga parameter utama: jarak stop loss awal, jarak stop loss trailing dan jarak pencetus stop loss trailing. Selepas isyarat beli diaktifkan, harga stop loss awal dikira berdasarkan harga masuk dan jarak stop loss awal yang ditetapkan. Kemudian, setiap bar akan menilai sama ada syarat pencetus stop loss trailing dipenuhi. Jika ya, harga stop loss trailing baru akan ditetapkan. Harga stop loss trailing baru dikira berdasarkan harga penutupan semasa dan jarak stop loss trailing. Oleh itu, selagi harga berjalan ke arah yang menguntungkan, garis stop loss trailing akan terus bergerak ke atas untuk mengunci keuntungan. Apabila pembalikan harga mencetuskan garis stop loss trailing, isyarat jual akan dihasilkan.

Strategi ini juga mempunyai stop loss yang lebih rendah. Tidak kira sama ada stop loss yang mengikuti diaktifkan atau tidak, jika harga pecah di bawah stop loss yang lebih rendah, stop loss akan langsung dicetuskan. Stop loss yang lebih rendah berfungsi untuk melindungi daripada jurang harga yang disebabkan oleh peristiwa tiba-tiba. Oleh itu, melalui mekanisme stop loss dinamik dalam bentuk stop loss baris ganda, garis stop loss dapat secara automatik mengesan trend yang menguntungkan, sambil mencegah kerugian yang berlebihan.

Kelebihan

  1. Tetap mengunci keuntungan melalui penangguhan stop loss, mengelakkan memberi ruang retracement yang terlalu banyak.

  2. Mengambil struktur stop loss bergaris dua untuk memastikan garis stop loss dapat segera diikuti, sambil mengelakkan kerugian yang berlebihan.

  3. Menggunakan mekanisme penilaian berterusan untuk pelarasan stop loss dengan operasi mudah dan pelaksanaan mudah.

  4. Parameter boleh dioptimumkan mengikut ciri pasaran dan stok untuk meningkatkan keberkesanan stop loss.

  5. Tidak perlu meramalkan trend pasaran, hanya mengikuti trend.

Risiko

  1. Tetapan parameter yang tidak betul boleh menyebabkan kehilangan berhenti terlalu longgar atau terlalu ketat. Terlalu longgar akan membuat kehilangan berhenti tidak berkesan, sementara terlalu ketat cenderung dihentikan oleh turun naik harga biasa.

  2. Sekiranya jurang harga disebabkan oleh peristiwa tiba-tiba, ia mungkin tidak dapat menghentikan kerugian.

  3. Kos dagangan dan slippage boleh mempengaruhi harga jualan sebenar selepas garis stop loss diaktifkan.

  4. Kemampuan penyesuaian tidak kuat. Ia tidak berfungsi dengan baik pada peringkat tertentu, seperti pergerakan yang terhad.

Tindakan balas:

  1. Adalah disyorkan untuk terus mengoptimumkan parameter berdasarkan hasil backtest dan langsung.
  2. Tetapkan stop loss yang lebih rendah untuk melindungi daripada jurang harga.
  3. Mengambil kos dagangan dan slippage dalam kiraan harga stop loss.
  4. Penggunaan dalam kombinasi dengan penunjuk trend dan volatiliti.

Arahan untuk Pengoptimuman

  1. Sesuaikan garis stop loss yang tertinggal dalam perubahan peratusan, yang dapat mengesan pergerakan harga dengan lebih baik di peringkat harga yang berbeza.

  2. Tambah metrik turun naik untuk menangguhkan kehilangan berhenti apabila menghadapi turun naik yang tinggi, mengelakkan turun naik biasa daripada mencetuskan kehilangan berhenti.

  3. Mengoptimumkan parameter secara automatik melalui pembelajaran mesin. Pilih pulangan kombinasi parameter yang berbeza dalam tempoh baru-baru ini sebagai sampel latihan.

  4. Tambah kriteria kedudukan terbuka dengan mempertimbangkan penunjuk seperti trend, sokongan & rintangan untuk mengelakkan membuka kedudukan di pasaran yang berbeza.

Kesimpulan

Strategi stop loss yang dinamik menetapkan garis stop loss yang mengikuti melalui mekanisme stop loss bergaris ganda untuk mengesahkan stop loss dan menyesuaikan stop loss yang mengikuti berdasarkan perubahan harga. Ia boleh menyesuaikan jarak stop loss secara automatik untuk mengunci keuntungan, mengurangkan pullback dan mengawal kerugian. Dengan operasi yang mudah dan pelaksanaan yang mudah, strategi ini dapat dioptimumkan lagi berdasarkan keadaan pasaran dan digunakan bersama dengan strategi lain untuk prestasi yang lebih baik. Tetapi ia juga mempunyai beberapa batasan. Adalah dinasihatkan untuk memperbaikinya dan mengujinya dengan mencukupi 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 lanjut