Chiến lược dừng lỗ theo dõi động

Tác giả:ChaoZhang, Ngày: 2023-12-29 10:42:27
Tags:

img

Tổng quan

Chiến lược dừng lỗ theo dõi động là một chiến lược giao dịch định lượng sử dụng cơ chế dừng lỗ theo dõi. Nó thiết lập một đường dừng lỗ theo dõi dựa trên lý thuyết theo dõi xu hướng để xác nhận dừng lỗ và điều chỉnh dừng lỗ theo dõi. Nó chủ yếu được sử dụng để kiểm soát dừng lỗ của một giao dịch duy nhất, tối đa hóa việc khóa lợi nhuận và giảm rủi ro giao dịch.

Chiến lược logic

Cốt lõi của chiến lược dừng lỗ kéo dài động nằm trong việc thiết lập ba thông số chính: khoảng cách dừng lỗ ban đầu, khoảng cách dừng lỗ kéo dài và khoảng cách kích hoạt dừng lỗ kéo dài. Sau khi tín hiệu mua được kích hoạt, giá dừng lỗ ban đầu được tính dựa trên giá nhập cảnh và khoảng cách dừng lỗ ban đầu đã thiết lập. Sau đó, mỗi thanh sẽ đánh giá xem điều kiện kích hoạt dừng lỗ kéo dài có được đáp ứng hay không. Nếu có, một giá dừng lỗ kéo dài mới sẽ được thiết lập. Giá dừng lỗ kéo dài mới được tính dựa trên giá đóng hiện tại và khoảng cách dừng lỗ kéo dài. Do đó, miễn là giá chạy theo hướng thuận lợi, đường dừng lỗ kéo dài sẽ tiếp tục di chuyển lên để khóa lợi nhuận. Khi sự đảo ngược giá kích hoạt đường dừng lỗ kéo dài, một tín hiệu bán sẽ được tạo ra.

Chiến lược này cũng có mức dừng lỗ thấp hơn. Bất kể việc dừng lỗ sau được kích hoạt hay không, nếu giá phá vỡ dưới mức dừng lỗ thấp hơn, stop loss sẽ được kích hoạt trực tiếp. Stop loss thấp hơn phục vụ để bảo vệ chống lại các khoảng cách giá do các sự kiện đột ngột gây ra. Do đó, thông qua cơ chế dừng lỗ năng động dưới dạng stop loss hai đường, đường dừng lỗ có thể tự động theo dõi xu hướng thuận lợi, trong khi ngăn ngừa thua lỗ quá mức.

Ưu điểm

  1. Tiếp tục khóa lợi nhuận thông qua việc dừng lỗ, tránh cho quá nhiều không gian khôi phục.

  2. Dùng cấu trúc dừng lỗ hai đường để đảm bảo đường dừng lỗ có thể theo dõi kịp thời, đồng thời ngăn ngừa tổn thất quá mức.

  3. Sử dụng một cơ chế đánh giá liên tục để điều chỉnh dừng lỗ với hoạt động đơn giản và dễ thực hiện.

  4. Các thông số có thể được tối ưu hóa theo đặc điểm thị trường và cổ phiếu để cải thiện hiệu quả dừng lỗ.

  5. Không cần dự đoán xu hướng thị trường, chỉ cần theo xu hướng.

Rủi ro

  1. Các thiết lập tham số không chính xác có thể dẫn đến stop loss quá lỏng lẻo hoặc quá chặt chẽ.

  2. Trong trường hợp chênh lệch giá do các sự kiện đột ngột, nó có thể không ngăn chặn tổn thất.

  3. Chi phí giao dịch và trượt có thể ảnh hưởng đến giá bán thực tế sau khi đường dừng lỗ được kích hoạt.

  4. Khả năng thích nghi không mạnh. Nó không hoạt động tốt trong một số giai đoạn nhất định, chẳng hạn như các chuyển động giới hạn phạm vi.

Các biện pháp đối phó:

  1. Nên tối ưu hóa các thông số liên tục dựa trên các kết quả backtest và thực tế.
  2. Đặt mức dừng lỗ thấp hơn để bảo vệ chống lại khoảng cách giá.
  3. Xem xét chi phí giao dịch và trượt khi tính giá dừng lỗ.
  4. Sử dụng kết hợp với các chỉ số xu hướng và biến động.

Hướng dẫn tối ưu hóa

  1. Điều chỉnh đường dừng lỗ cuối cùng theo tỷ lệ thay đổi phần trăm, có thể theo dõi tốt hơn các biến động giá trên các mức giá khác nhau.

  2. Thêm các chỉ số biến động để đình chỉ dừng lỗ sau khi đối mặt với biến động cao, tránh biến động bình thường từ việc kích hoạt dừng lỗ.

  3. Tự động tối ưu hóa các tham số thông qua máy học. Chọn trả về các kết hợp tham số khác nhau trong thời gian gần đây như các mẫu đào tạo.

  4. Thêm tiêu chí vị trí mở với việc xem xét các chỉ số như xu hướng, hỗ trợ và kháng cự để tránh mở vị trí trong các thị trường khác nhau.

Kết luận

Chiến lược dừng lỗ theo dõi động thiết lập các đường dừng lỗ theo dõi thông qua một cơ chế dừng lỗ hai đường để xác nhận dừng lỗ và điều chỉnh dừng lỗ theo dõi dựa trên sự thay đổi giá. Nó có thể tự động điều chỉnh khoảng cách dừng lỗ để khóa lợi nhuận, giảm pullback và kiểm soát lỗ. Với hoạt động đơn giản và dễ thực hiện, chiến lược này có thể được tối ưu hóa hơn nữa dựa trên điều kiện thị trường và được sử dụng cùng với các chiến lược khác để có hiệu suất tốt hơn. Nhưng nó cũng có một số hạn chế.


/*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)
/////////////////////////////////////////////////////////////




Thêm nữa