Strategi trailing stop loss dinamis


Tanggal Pembuatan: 2023-12-29 10:42:27 Akhirnya memodifikasi: 2023-12-29 10:42:27
menyalin: 0 Jumlah klik: 872
1
fokus pada
1617
Pengikut

Strategi trailing stop loss dinamis

Ringkasan

Strategi tracking stop loss adalah strategi trading kuantitatif yang menggunakan mekanisme tracking stop loss. Strategi ini didasarkan pada teori tracking trend, mengatur tracking stop loss line, melakukan konfirmasi stop loss dan tracking stop loss adjustment.

Prinsip Strategi

Inti dari strategi tracking stop loss adalah menetapkan tiga parameter utama: jarak stop loss awal, jarak stop loss tracking, dan jarak stop loss tracking. Setelah sinyal pembelian dipicu, harga stop loss awal dihitung berdasarkan harga pembelian dan jarak stop loss awal yang ditetapkan.

Strategi ini juga dilengkapi dengan stop loss rendah, terlepas dari apakah stop loss pelacakan dimulai atau tidak, jika harga jatuh ke stop loss rendah, maka stop loss akan langsung dihentikan. Stop loss rendah digunakan untuk mencegah harga melompat dari peristiwa yang tidak terduga.

Keunggulan Strategis

  1. Dengan melacak stop loss terus-menerus untuk mengunci keuntungan, hindari memberi kesempatan yang terlalu banyak untuk mengembalikan.

  2. Dengan menggunakan struktur stop loss dua baris atas dan bawah, dapat memastikan bahwa stop loss dapat ditindaklanjuti pada waktu yang tepat, dan juga mencegah kerugian yang berlebihan.

  3. Menggunakan mekanisme penilaian berkelanjutan untuk penyesuaian stop loss, operasi sederhana, mudah untuk diterapkan.

  4. Parameter dapat disesuaikan sesuai dengan karakteristik pasar dan saham individu untuk mengoptimalkan efek stop loss.

  5. Tidak perlu memprediksi ke mana arah pasar, Anda bisa mengikuti tren.

Risiko Strategis

  1. Penetapan parameter yang tidak tepat dapat menyebabkan stop loss terlalu longgar atau terlalu ketat. Terlalu longgar tidak dapat menghentikan stop loss secara efektif, dan terlalu ketat mudah terkena fluktuasi harga biasa.

  2. Kejadian yang tidak terduga yang menyebabkan harga melonjak, dapat menyebabkan stop loss tidak efektif, dan harus dikombinasikan dengan langkah-langkah perlindungan lainnya.

  3. Biaya transaksi dan slippage dapat mempengaruhi harga jual yang sebenarnya setelah triggering Stop Loss Line.

  4. Adaptasi tidak kuat, tidak bekerja dengan baik pada tahap tertentu, misalnya di zona gempa.

Tanggapan:

  1. Disarankan untuk terus mengoptimalkan parameter berdasarkan hasil pengujian ulang dan hard disk.
  2. Bisa diatur lebih lebar dari stop loss yang lebih rendah untuk mencegah lompatan udara.
  3. Biaya transaksi dan dampak slippage harus dipertimbangkan dalam menghitung harga stop loss.
  4. Indikator penilaian tren dan fluktuasi dapat digunakan.

Arah optimasi strategi

  1. Mengubah tracking stop loss line menjadi perubahan persentase, dapat lebih baik untuk melacak perubahan harga saham di berbagai tingkat harga.

  2. Tambahkan indikator volatilitas untuk menilai pergerakan besar dan menghentikan pelacakan stop loss untuk menghindari pergerakan biasa yang memicu stop loss.

  3. Mengoptimalkan parameter secara otomatis menggunakan metode pembelajaran mesin.

  4. Meningkatkan penilaian kondisi untuk membuka posisi, menggabungkan indikator seperti tren, resistensi dukungan, dan lain-lain, untuk menghindari membuka posisi dalam kondisi goncangan.

Meringkaskan

Strategi Stop Loss Tracking yang dinamis menggunakan mekanisme Stop Loss Dua Lini, mengatur garis Tracking Stop Loss, untuk mencapai konfirmasi Stop Loss dan Tracking Stop Loss Adjustment. Strategi ini dapat secara otomatis menyesuaikan jarak Stop Loss sesuai dengan perubahan harga, untuk mengunci keuntungan, mengurangi pengembalian dan mengendalikan kerugian. Strategi ini sederhana dan mudah diimplementasikan, dapat mengoptimalkan parameter sesuai dengan kondisi pasar, dan lebih efektif digunakan dengan kombinasi strategi lainnya.

Kode Sumber Strategi
/*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)
/////////////////////////////////////////////////////////////