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

Tác giả:ChaoZhang, Ngày: 2023-12-21 15:58:54
Tags:

img

Tổng quan

Chiến lược này xác định hướng xu hướng dựa trên các ngọn nến hàng ngày, và sử dụng các điểm cao hoặc thấp mới được hình thành bởi các ngọn nến 15 phút như giá dừng lỗ hoặc giá dừng lỗ, để điều chỉnh động dừng lỗ và khóa thêm lợi nhuận.

Chiến lược logic

  1. So sánh giá đóng của nến hàng ngày với giá cao nhất và thấp nhất của nến hàng ngày trước để xác định hướng xu hướng. Nếu giá đóng cao hơn giá cao nhất ngày trước, nó được định nghĩa là xu hướng tăng. Nếu giá đóng thấp hơn giá thấp nhất ngày trước, nó được định nghĩa là xu hướng giảm.

  2. Khi trong xu hướng tăng, mua dài khi giá đóng của nến 15 phút cao hơn giá cao nhất của nến 15 phút trước. Khi trong xu hướng giảm, mua ngắn khi giá đóng của nến 15 phút thấp hơn giá thấp nhất của nến 15 phút trước.

  3. Đặt giá thấp nhất của nến 15 phút trước đó là giá dừng lỗ sau khi mua dài. Đặt giá cao nhất của nến 15 phút trước đó là giá dừng lỗ sau khi mua ngắn.

  4. Khi ngọn nến 15 phút tạo ra mức cao hoặc thấp mới một lần nữa, điều chỉnh giá dừng lỗ phù hợp. Điều chỉnh mức thấp mới sau khi đi dài. Điều chỉnh mức cao mới sau khi đi ngắn. Điều này nhận ra mức dừng lỗ động.

Phân tích lợi thế

Ưu điểm lớn nhất của chiến lược này là nó có thể điều chỉnh giá dừng lỗ một cách năng động. Trong khi đảm bảo kiểm soát rủi ro, nó tối đa hóa việc kiếm lợi nhuận và giảm xác suất dừng lỗ bị ảnh hưởng.

Cụ thể, những lợi thế bao gồm:

  1. Các phán quyết dựa trên hoạt động xu hướng có thể xác định kịp thời xu hướng thị trường và chọn hướng giao dịch phù hợp.

  2. Giao dịch khung thời gian 15 phút cho phép các bước vào và ra thường xuyên để nắm bắt nhiều cơ hội hơn.

  3. Điều chỉnh stop loss động dựa trên mức cao hoặc thấp mới làm giảm rủi ro bị stop loss.

  4. Định vị dừng lỗ hợp lý hầu như tránh mất mát không cần thiết.

Phân tích rủi ro

Rủi ro chính của chiến lược này xuất phát từ những sai lầm trong đánh giá xu hướng.

  1. Phương pháp đánh giá xu hướng hàng ngày không chính xác có thể dẫn đến hướng giao dịch sai.

  2. Giá có thể biến động mạnh trong ngắn hạn, làm tăng khả năng dừng lỗ 15 phút.

  3. Việc xác định sai các điểm đảo ngược xu hướng có thể dẫn đến tổn thất.

Các giải pháp tương ứng:

  1. Thêm các chỉ số từ các khung thời gian khác để đánh giá toàn diện để tránh dựa vào chỉ một khung thời gian.

  2. Đánh giá sự biến động của thị trường và giảm phạm vi dừng lỗ một cách thích hợp trong thời gian biến động cao.

  3. Thêm cơ chế xác định điểm đảo ngược xu hướng để đóng các vị trí kịp thời trước khi đảo ngược.

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

Vẫn còn chỗ cho việc tối ưu hóa thêm:

  1. Thêm các chỉ số khung thời gian khác để tối ưu hóa việc nắm bắt xu hướng.

  2. Kiểm tra các cài đặt tỷ lệ stop loss khác nhau để tìm các thông số tối ưu.

  3. Thêm các chỉ số khối lượng để tránh lỗi do sự khác biệt khối lượng.

  4. Thêm các cơ chế đảo ngược xu hướng để tối ưu hóa các điểm thoát.

  5. Đánh giá việc mở rộng khoảng thời gian giá Trailing Stop để tiếp tục giảm rủi ro bị dừng lỗ.

Tóm lại

Hiệu suất tổng thể của chiến lược này là tốt. Logic là rõ ràng và dễ hiểu. Nó có những lợi thế như điều chỉnh dừng lỗ năng động, giao dịch thường xuyên và giao dịch theo xu hướng. Nó có thể kiểm soát rủi ro và khóa lợi nhuận một cách hiệu quả, và đáng để thử nghiệm và tối ưu hóa hơn nữa. Nhưng vẫn còn chỗ để cải thiện.


/*backtest
start: 2023-12-13 00:00:00
end: 2023-12-15 02:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Anand's Strategy", overlay=true)

// Get the high and low of the previous day's candle
prev_high = request.security(syminfo.tickerid, "D", high[2])
prev_low = request.security(syminfo.tickerid, "D", low[2])

// var float prev_high = na
// var float prev_low = na

prev_close = request.security(syminfo.tickerid, "D", close[1])


getDayIndexedHighLow(_bar) =>
    _indexed_high = request.security(syminfo.tickerid, "D", high[_bar])
    _indexed_low = request.security(syminfo.tickerid, "D", low[_bar])
    [_indexed_high, _indexed_low]

var index = 2

while index >= 0
    [indexed_high_D, indexed_low_D] =  getDayIndexedHighLow(index)
  
    if prev_close > indexed_high_D or prev_close < indexed_low_D
        prev_high := indexed_high_D
        prev_low := indexed_low_D
        break
    // Decrease the index to move to the previous 15-minute candle
    index := index - 1


// Determine the trade direction based on the candle criterion
trade_direction = prev_close > prev_high ? 1 : (prev_close < prev_low ? -1 : 0)

// Get the current close from 15-minute timeframe
current_close = request.security(syminfo.tickerid, "15", close[1])
prev_high_15m = request.security(syminfo.tickerid, "15", high[2])
prev_low_15m = request.security(syminfo.tickerid, "15", low[2])

// var float prev_high_15m = na
// var float prev_low_15m = na

getIndexedHighLow(_bar) =>
    _indexed_high = request.security(syminfo.tickerid, "15", high[_bar])
    _indexed_low = request.security(syminfo.tickerid, "15", low[_bar])
    [_indexed_high, _indexed_low]


// Loop through previous 15-minute candles until the condition is met
var  i = 2

while i >= 2
    [indexed_high_15m, indexed_low_15m] =  getIndexedHighLow(i)
  
    if current_close > indexed_high_15m or current_close < indexed_low_15m
        prev_high_15m := indexed_high_15m
        prev_low_15m := indexed_low_15m
        break
    // Decrease the index to move to the previous 15-minute candle
    i := i - 1



buy_condition = trade_direction == 1 and current_close > prev_high_15m
stop_loss_buy = prev_low_15m

// Sell Trade Criteria in Negative Trend
sell_condition = trade_direction == -1 and current_close < prev_low_15m
stop_loss_sell = prev_high_15m


// Trailing Stop Loss for Buy Trade
// Custom Trailing Stop Function for Buy Trade
var float trail_stop_buy = na
trailing_buy_condition = buy_condition and current_close > trail_stop_buy
if trailing_buy_condition
    trail_stop_buy := current_close

// Custom Trailing Stop Function for Sell Trade
var float trail_stop_sell = na
trailing_sell_condition = sell_condition and current_close < trail_stop_sell
if trailing_sell_condition
    trail_stop_sell := current_close

// Take Buy Trade with Stop Loss
if (buy_condition)
    strategy.entry("Buy", strategy.long)
    strategy.exit("Buy Stop Loss", "Buy", stop=stop_loss_buy)

// Take Sell Trade with Stop Loss
if (sell_condition)
    strategy.entry("Sell", strategy.short)
    strategy.exit("Sell Stop Loss", "Sell", stop=stop_loss_sell)

// Set the background color based on the trade direction
bgcolor(trade_direction == 1 ? color.new(color.green, 90) : trade_direction == -1 ? color.new(color.red, 90) : na)

Thêm nữa