Chiến lược này sử dụng cơ chế dừng theo dõi điểm trượt để di chuyển đường dừng theo mức biến động của giá, để thực hiện dừng động. Việc bắt đầu theo dõi dừng khi giá đạt đến mức lợi nhuận được chỉ định nhằm bảo vệ lợi nhuận, đồng thời giảm thiểu khả năng dừng bị kích hoạt quá sớm.
Chiến lược này dựa trên hai đường trung bình để xác định xu hướng vào, tín hiệu vào là đường trung bình nhanh trên đường trung bình chậm.
Một trong những điểm sáng tạo của nó là thiết kế của hệ thống dừng lỗ:
Thiết lập đường bắt đầu dừng lỗ. Bắt đầu theo dõi dừng lỗ khi giá vượt qua đường này.
Đường dừng sẽ theo dõi chuyển động theo tỷ lệ phần trăm trượt được đặt. Nếu thiết lập tỷ lệ trượt 3%, đường dừng sẽ ở dưới 3% giá thấp nhất.
Khi giá đảo ngược theo hướng bất lợi và chạm vào đường dừng theo dõi, dừng lỗ.
Thiết kế này đảm bảo rằng các đường dừng sẽ tự động theo dõi lợi nhuận và giảm khả năng bị dừng khi lợi nhuận vẫn tốt.
Bạn có thể giảm thiểu rủi ro bằng cách:
Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:
Kiểm tra các tham số kết hợp đường nhanh và đường chậm khác nhau
Khả năng dừng theo dõi trực tiếp hoặc đặt các tham số khác nhau cho các giống khác nhau
Tìm tỷ lệ điểm trượt dừng tối ưu cho các giống khác nhau
Thiết lập điều kiện cho việc nhập lại sau khi dừng lỗ
Giới hạn lỗ hổng có thể được nới lỏng thích hợp khi thị trường biến động
Chiến lược này sử dụng phương pháp theo dõi điểm dừng lỗ, thiết lập vị trí dừng lỗ động sau khi bắt đầu. Phương pháp dừng lỗ này có thể tự động điều chỉnh mức dừng lỗ theo biến động của thị trường, để đạt được sự cân bằng giữa bảo vệ lợi nhuận và giảm tổn thất không cần thiết. Tuy nhiên, cần tối ưu hóa tham số cho các đặc điểm của giống, và hỗ trợ bằng cách xác định đường thẳng và các chỉ số kỹ thuật khác để nâng cao độ chính xác của nhập cuộc. Đồng thời, cơ chế nhập lại cũng có thể làm giảm nguy cơ dừng lỗ quá sớm.
/*backtest
start: 2022-09-14 00:00:00
end: 2023-09-20 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
//@author=Daveatt
SystemName = "BEST Trailing Stop Strategy"
TradeId = "BEST"
InitCapital = 100000
InitPosition = 100
InitCommission = 0.075
InitPyramidMax = 1
CalcOnorderFills = true
CalcOnTick = true
DefaultQtyType = strategy.fixed
DefaultQtyValue = strategy.fixed
Precision = 2
Overlay=true
// strategy(title=SystemName, shorttitle=SystemName, overlay=Overlay,
// pyramiding=InitPyramidMax, initial_capital=InitCapital, default_qty_type=DefaultQtyType, default_qty_value=InitPosition, commission_type=strategy.commission.percent,
// commission_value=InitCommission, calc_on_order_fills=CalcOnorderFills, calc_on_every_tick=CalcOnTick, precision=2)
src = close
// Calculate moving averages
fastSMA = sma(close, 15)
slowSMA = sma(close, 45)
// Calculate trading conditions
enterLong = crossover(fastSMA, slowSMA)
enterShort = crossunder(fastSMA, slowSMA)
// trend states
since_buy = barssince(enterLong)
since_sell = barssince(enterShort)
buy_trend = since_sell > since_buy
sell_trend = since_sell < since_buy
change_trend = (buy_trend and sell_trend[1]) or (sell_trend and buy_trend[1])
//plot(buy_trend ? 1 : 0, title='buy_trend', transp=100)
//plot(sell_trend ? 1 : 0, title='sell_trend', transp=100)
// get the entry price
entry_price = valuewhen(enterLong or enterShort, close, 0)
// Plot moving averages
plot(series=fastSMA, color=color.teal)
plot(series=slowSMA, color=color.orange)
// Plot the entries
plotshape(enterLong, style=shape.circle, location=location.belowbar, color=color.green, size=size.small)
plotshape(enterShort, style=shape.circle, location=location.abovebar, color=color.red, size=size.small)
///////////////////////////////
//======[ Trailing STOP ]======//
///////////////////////////////
// use SL?
useSL = input(true, "Use stop Loss")
// Configure trail stop level with input
StopTrailPerc = input(title="Trail Loss (%)", type=input.float, minval=0.0, step=0.1, defval=3) * 0.01
// Will trigger the take profit trailing once reached
use_SL_Trigger = input(true, "Use stop Loss Trigger")
StopTrailTrigger = input(2.0, "SL Trigger (%)",minval=0,step=0.5,type=input.float) * 0.01
StopLossPriceTrigger = 0.0
StopLossPriceTrigger := if (use_SL_Trigger)
if buy_trend
entry_price * (1 + StopTrailTrigger)
else
entry_price * (1 - StopTrailTrigger)
else
-1
var SL_Trigger_Long_HIT = false
SL_Trigger_Long_HIT := useSL and use_SL_Trigger and buy_trend and high >= StopLossPriceTrigger
? true : SL_Trigger_Long_HIT[1]
var SL_Trigger_Short_HIT = false
SL_Trigger_Short_HIT := useSL and use_SL_Trigger and sell_trend and low <= StopLossPriceTrigger
? true : SL_Trigger_Short_HIT[1]
display_long_SL_trigger = useSL and buy_trend and use_SL_Trigger
and SL_Trigger_Long_HIT == false and StopLossPriceTrigger != -1
display_short_SL_trigger = useSL and sell_trend and use_SL_Trigger
and SL_Trigger_Short_HIT == false and StopLossPriceTrigger != -1
display_SL_trigger = display_long_SL_trigger or display_short_SL_trigger
plot(display_SL_trigger ? StopLossPriceTrigger : na, title='SLPriceTrigger', transp=0,
color=color.maroon, style=plot.style_circles, linewidth=3)
// Determine trail stop loss prices
longStopPrice = 0.0, shortStopPrice = 0.0
longStopPrice := if useSL and buy_trend
stopValue = low * (1 - StopTrailPerc)
max(stopValue, longStopPrice[1])
else
0
shortStopPrice := if useSL and sell_trend
stopValue = high * (1 + StopTrailPerc)
min(stopValue, shortStopPrice[1])
else
999999
//////////////////////////////////////////////////////////////////////////////////////////
//*** STOP LOSS HIT CONDITIONS TO BE USED IN ALERTS ***//
//////////////////////////////////////////////////////////////////////////////////////////
cond_long_stop_loss_hit = useSL and buy_trend and crossunder(low, longStopPrice[1])
and (SL_Trigger_Long_HIT or use_SL_Trigger == false)
cond_short_stop_loss_hit = useSL and sell_trend and crossover(high, shortStopPrice[1])
and (SL_Trigger_Short_HIT or use_SL_Trigger == false)
// Plot stop loss values for confirmation
plot(series=useSL and buy_trend and low >= longStopPrice
and (SL_Trigger_Long_HIT or use_SL_Trigger == false)
? longStopPrice : na,
color=color.fuchsia, style=plot.style_cross,
linewidth=2, title="Long Trail Stop")
plot(series=useSL and sell_trend and high <= shortStopPrice
and (SL_Trigger_Short_HIT or use_SL_Trigger == false)
? shortStopPrice : na,
color=color.fuchsia, style=plot.style_cross,
linewidth=2, title="Short Trail Stop")
close_long = cond_long_stop_loss_hit
close_short = cond_short_stop_loss_hit
// Submit entry orders
strategy.entry(TradeId + " L", long=true, when=enterLong)
strategy.close(TradeId + " L", when=close_long)
//if (enterShort)
strategy.entry(TradeId + " S", long=false, when=enterShort)
strategy.close(TradeId + " S", when=close_short)
if change_trend
SL_Trigger_Long_HIT := false
SL_Trigger_Short_HIT := false