
Strategi Tracking Stop Loss adalah strategi perdagangan kuantitatif yang menggunakan mekanisme Tracking Stop Loss. Strategi ini adalah berdasarkan teori trend tracking, menetapkan garis tracking stop loss, mewujudkan pengesahan stop loss dan tracking adjustment stop loss.
Inti dari strategi stop loss dinamik adalah menetapkan tiga parameter utama: jarak berhenti awal, jarak berhenti dan jarak berhenti. Apabila isyarat membeli dicetuskan, harga berhenti awal dikira berdasarkan harga beli dan jarak berhenti awal yang ditetapkan. Kemudian setiap K-line akan menilai sama ada syarat untuk mematikan berhenti telah dipenuhi, dan jika ia berlaku, ia akan menetapkan harga berhenti baru.
Strategi ini juga mempunyai stop loss yang rendah, tidak kira sama ada anda memulakan tracking stop loss atau tidak, jika harga jatuh ke stop loss yang rendah, anda akan berhenti secara langsung. Stop loss yang rendah digunakan untuk mencegah harga melompat dari peristiwa yang tidak dijangka. Oleh itu, strategi stop loss tracking dinamik menggunakan mekanisme stop loss dinamik dalam bentuk dua baris ke atas dan ke bawah, yang membolehkan garis stop loss untuk secara automatik mengikuti pergerakan yang menguntungkan, dan pada masa yang sama mencegah kerugian yang berlebihan.
Mengelakkan peluang untuk membayar balik dengan mengesan kerugian dan terus mengunci keuntungan.
Menggunakan struktur hentian dua baris atas dan bawah, kedua-dua memastikan hentian hentian dapat diikuti tepat pada masanya, dan mencegah kerugian yang berlebihan.
Menggunakan mekanisme penghakiman berterusan untuk penyesuaian henti rugi, operasi mudah dan mudah dilaksanakan.
Parameter boleh disesuaikan mengikut ciri-ciri pasaran dan saham individu untuk mengoptimumkan kesan hentikan kerugian.
Tidak perlu meramalkan apa yang akan berlaku di pasaran, anda boleh mengikut trend.
Penetapan parameter yang tidak betul boleh menyebabkan penutupan terlalu longgar atau terlalu ketat. Terlalu longgar tidak dapat menghentikan kerugian dengan berkesan, dan terlalu ketat mudah diserang oleh turun naik harga biasa.
Keadaan yang tidak dijangka menyebabkan harga melonjak, yang boleh menyebabkan hentian tidak berkesan, dan harus disertai dengan langkah-langkah perlindungan lain.
Bayaran dagangan dan slippage mungkin memberi kesan kepada harga jual sebenar selepas triggering garis stop loss.
Ia tidak mempunyai daya adaptasi yang kuat dan tidak berfungsi dengan baik pada tahap tertentu, seperti di kawasan gegaran.
Kaedah pencegahan:
Mengubah garis hentian ke arah perubahan peratusan membolehkan anda lebih baik mengesan perubahan harga saham di bawah tahap harga yang berbeza.
Tambah indikator kadar turun naik untuk menilai turun naik yang besar dan berhenti dari penjejakan henti, untuk mengelakkan turun naik biasa yang mencetuskan henti.
Menggunakan kaedah pembelajaran mesin untuk mengoptimumkan parameter secara automatik.
Meningkatkan penilaian syarat untuk membuka kedudukan, menggabungkan trend, penyokong dan penentangan, dan lain-lain, untuk mengelakkan membuka kedudukan dalam keadaan yang bergolak.
Strategi hentian hentian dinamik melalui mekanisme hentian dua baris, menetapkan garis hentian hentian, mewujudkan pengesahan hentian dan penyesuaian hentian. Anda boleh menyesuaikan jarak hentian secara automatik mengikut perubahan harga, untuk mengunci keuntungan, mengurangkan pengembalian dan kawalan kerugian.
/*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)
/////////////////////////////////////////////////////////////