Ngăn chặn kéo dài với chiến lược lấy lợi nhuận một phần

Tác giả:ChaoZhang, Ngày: 2023-11-28 16:05:24
Tags:

img

Tổng quan

Đây là một chiến lược thoát vốn sử dụng một stop trailing từng bước với phần lấy lợi nhuận. Nó di chuyển stop loss đến break-even sau khi đạt đến mức lấy lợi nhuận đầu tiên, và di chuyển đến mức lấy lợi nhuận đầu tiên sau khi đạt đến mức thứ hai. Điều này cho phép khóa một số lợi nhuận trong khi duy trì tiềm năng lợi nhuận.

Chiến lược logic

Các thành phần chính của chiến lược này là:

  1. Thiết lập stop loss và 3 lấy mức lợi nhuận bằng điểm.
  2. Định nghĩa các hàm để tính lợi nhuận hiện tại bằng điểm và giá dừng lỗ.
  3. Định nghĩa một hàm để xác định giai đoạn lợi nhuận hiện tại.
  4. Thay đổi giá dừng lỗ dựa trên giai đoạn lợi nhuận đến giá theo dõi.

Cụ thể, đầu tiên, nó thiết lập một điểm dừng lỗ 100 và lấy lợi nhuận ở mức 100/200/300 điểm.curProfitInPtschức năng tính toán lợi nhuận hiện tại dựa trên giá hiện tại và giá nhập cảnh.calcStopLossPriceChức năng tính giá dừng lỗ dựa trên khoảng cách điểm.

Logic chính nằm tronggetCurrentStagechức năng kiểm tra xem có một vị trí và nếu lợi nhuận đã vượt quá mỗi mức lợi nhuận, tiến về giai đoạn nếu đúng. ví dụ, giai đoạn 2 đạt được sau khi lợi nhuận 100 điểm, và giai đoạn 3 sau khi lợi nhuận 200 điểm.

Cuối cùng, mức dừng lỗ được sửa đổi theo giai đoạn. Giai đoạn 1 sử dụng mức dừng ban đầu, giai đoạn 2 phá vỡ, và giai đoạn 3 theo dõi mức lợi nhuận đầu tiên.

Phân tích lợi thế

Những lợi thế của chiến lược dừng kéo theo từng bước này:

  1. Cho phép khóa trong một số lợi nhuận trong khi duy trì tiềm năng lợi nhuận hơn nữa.
  2. Chế độ dừng lỗ theo sau giá và làm giảm khả năng rút tiền.
  3. Nhiều bước lợi nhuận kiểm soát rủi ro tốt hơn một lợi nhuận.
  4. Một logic đơn giản và rõ ràng.

Phân tích rủi ro

Có một số rủi ro cần xem xét:

  1. Lượng lợi nhuận tăng dần có thể bỏ lỡ cơ hội thoát tốt hơn.
  2. Nếu đường mòn dừng khoảng cách quá cao, dừng có thể kích hoạt sớm.
  3. Không có khả năng cắt giảm lỗ cũng có thể dẫn đến tổn thất lớn hơn.

Tối ưu hóa

Một số cách để cải thiện chiến lược này:

  1. Kiểm tra lợi nhuận khác nhau và dừng khoảng cách để tối ưu hóa các thông số.
  2. Xem xét các cơ chế dừng lỗ nhanh cho các tình huống cụ thể.
  3. Sử dụng các chỉ số kỹ thuật để xác định mục tiêu lợi nhuận và mức dừng.
  4. Cân bằng lối ra có lợi và dừng khoảng cách.

/*backtest
start: 2023-11-20 00:00:00
end: 2023-11-27 00:00:00
period: 3m
basePeriod: 1m
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/
// © adolgov

// @description
// when tp1 is reached, sl is moved to break-even
// when tp2 is reached, sl is moved to tp1
// when tp3 is reached - exit

//@version=4
strategy("Stepped trailing strategy example", overlay=true)

// random entry condition
longCondition = crossover(sma(close, 14), sma(close, 28))
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

// sl & tp in points
sl = input(100)
tp1 = input(100)
tp2 = input(200)
tp3 = input(300)

curProfitInPts() =>
    if strategy.position_size > 0
        (high - strategy.position_avg_price) / syminfo.mintick
    else if strategy.position_size < 0
        (strategy.position_avg_price - low) / syminfo.mintick
    else
        0
        
calcStopLossPrice(OffsetPts) =>
    if strategy.position_size > 0
        strategy.position_avg_price - OffsetPts * syminfo.mintick
    else if strategy.position_size < 0
        strategy.position_avg_price + OffsetPts * syminfo.mintick
    else
        0
        
calcProfitTrgtPrice(OffsetPts) =>
    calcStopLossPrice(-OffsetPts)

getCurrentStage() =>
    var stage = 0
    if strategy.position_size == 0 
        stage := 0
    if stage == 0 and strategy.position_size != 0
        stage := 1
    else if stage == 1 and curProfitInPts() >= tp1
        stage := 2
    else if stage == 2 and curProfitInPts() >= tp2
        stage := 3
    stage

stopLevel = -1.
profitLevel = calcProfitTrgtPrice(tp3)

// based on current stage set up exit
// note: we use same exit ids ("x") consciously, for MODIFY the exit's parameters
curStage = getCurrentStage()
if curStage == 1
    stopLevel := calcStopLossPrice(sl)
    strategy.exit("x", loss = sl, profit = tp3, comment = "sl or tp3")
else if curStage == 2
    stopLevel := calcStopLossPrice(0)
    strategy.exit("x", stop = stopLevel, profit = tp3, comment = "breakeven or tp3")
else if curStage == 3
    stopLevel := calcStopLossPrice(-tp1)
    strategy.exit("x", stop = stopLevel, profit = tp3, comment = "tp1 or tp3")
else
    strategy.cancel("x")
    
// this is debug plots for visulalize TP & SL levels
plot(stopLevel > 0 ? stopLevel : na, style = plot.style_linebr)
plot(profitLevel > 0 ? profitLevel : na, style = plot.style_linebr)

Thêm nữa