Chiến lược theo dõi lỗ dừng mở-cao-dưới

Tác giả:ChaoZhang, Ngày: 2024-02-18 14:30:08
Tags:

img

Tổng quan

Chiến lược này được thiết kế dựa trên dữ liệu mở, cao và thấp của biểu đồ nến để xác định các điểm đảo ngược xu hướng cho các mục nhập. Sau khi nhập, các đường dừng lỗ sẽ được thiết lập dựa trên chỉ số ATR và theo dõi. Các mục tiêu cũng sẽ được tính dựa trên tỷ lệ rủi ro-lợi nhuận. Khi giá đạt được mục tiêu dừng lỗ hoặc lợi nhuận, các lệnh sẽ được gửi để đóng các vị trí.

Chiến lược logic

Các tín hiệu đầu vào của chiến lược này đến từ giá mở, cao và thấp. Một tín hiệu mua được tạo ra khi giá mở bằng mức thấp của ngọn nến, và một tín hiệu bán được tạo ra khi giá mở bằng mức cao, cho thấy cơ hội đảo ngược xu hướng tiềm năng.

Sau khi vào, stop loss theo dõi động được tính dựa trên chỉ số ATR. Loss stop dài được đặt ở mức thấp nhất của N bar gần đây trừ 1 ATR; stop loss ngắn được đặt ở mức cao nhất của N bar gần đây cộng với 1 ATR. Đường stop loss sẽ được cập nhật năng động để theo dõi chuyển động giá.

Các mục tiêu lợi nhuận được tính dựa trên việc thiết lập tỷ lệ rủi ro-lợi nhuận. Mục tiêu dài được thiết lập ở mức giá đầu vào cộng với (sự khác biệt rủi ro giữa giá đầu vào và lỗ dừng nhân với tỷ lệ rủi ro-lợi nhuận); mục tiêu ngắn được thiết lập ở mức giá đầu vào trừ (sự khác biệt rủi ro giữa giá dừng và giá đầu vào nhân với tỷ lệ rủi ro-lợi nhuận).

Khi giá đạt được mục tiêu dừng lỗ hoặc lợi nhuận, lệnh sẽ được gửi đến các vị trí phẳng.

Phân tích lợi thế

Những lợi thế của chiến lược này bao gồm:

  1. Các tín hiệu nhập cảnh đơn giản và rõ ràng, tránh nhiều cú đánh đòn.

  2. ATR động theo dõi dừng khóa trong lợi nhuận và ngăn chặn theo đuổi cao và thấp.

  3. Kiểm soát tỷ lệ rủi ro-lợi nhuận tránh để lại lợi nhuận trên bàn và giao dịch quá mức.

  4. Áp dụng cho các sản phẩm khác nhau, dễ tối ưu hóa.

Phân tích rủi ro

Có một số rủi ro của chiến lược này:

  1. Các tín hiệu nhập cảnh có thể chậm lại một số mức độ, bỏ lỡ bước vào thị trường tốt nhất.

  2. Stop loss quá chặt hoặc quá lỏng, gây ra stop loss không cần thiết hoặc mất lợi nhuận.

  3. Không xác định xu hướng, dễ bị mắc kẹt trong các thị trường.

  4. Không thể xử lý các vị trí qua đêm.

Các hướng tối ưu hóa là:

  1. Bao gồm các chỉ số khác cho xu hướng thiên vị để tránh whipsaws.

  2. Điều chỉnh các thông số ATR hoặc thêm kiểm soát biến động để dừng lỗ tốt hơn.

  3. Thêm bộ lọc xu hướng để giảm tiếng ồn tín hiệu.

  4. Thêm xử lý vị trí qua đêm cho một số sản phẩm.

Kết luận

Kết luận, đây là một chiến lược đơn giản và thẳng thắn với logic nhập khẩu rõ ràng, phương pháp dừng lỗ hợp lý và kiểm soát rủi ro tốt. Nhưng có một số hạn chế như thiên vị xu hướng không đủ, chậm tín hiệu vv. Những khuyết điểm này cũng chỉ ra hướng tối ưu hóa trong tương lai. Bằng cách kết hợp nhiều bộ lọc chỉ số và các mô-đun quản lý rủi ro, chiến lược này có thể được nâng cao hơn và mạnh mẽ hơn.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// Open-High-Low strategy

strategy('Strategy: OLH', shorttitle="OLH", overlay=true )

// Inputs
slAtrLen = input.int(defval=14, title="ATR Period for placing SL", group="StopLoss settings")
showSLLines = input.bool(defval=false, title="Show SL lines in chart", tooltip="Show SL lines also as dotted lines in chart. Note: chart may look untidy.", group="Stolploss settings")
// Trade related
rrRatio = input.float(title='Risk:Reward', step=0.1, defval=2.0, group="Trade settings")
endOfDay = input.int(defval=1500, title="Close all trades, default is 3:00 PM, 1500 hours (integer)", group="Trade settings")
mktAlwaysOn = input.bool(defval=true, title="Markets that never closed (Crypto, Forex, Commodity)", tooltip="Some markers never closes. For those cases, make this checked.", group="Trade settings")
lotSize = input.int(title='Lot Size', step=1, defval=1, group="Trade settings")


// Utils
green(open, close) => close > open ? true : false
red(open, close) => close < open ? true : false
body(open, close) => math.abs(open - close)
lowerwick = green(open, close) ? open - low : close - low
upperwick = green(open, close) ? high - close : high - open
crange = high - low
crangep = high[1] - low[1] // previous candle's candle-range
bullish = close > open ? true : false
bearish = close < open ? true : false


// Trade signals
longCond = barstate.isconfirmed and (open == low)
shortCond = barstate.isconfirmed and (open == high)

// For SL calculation
atr = ta.atr(slAtrLen)
highestHigh = ta.highest(high, 7)
lowestLow = ta.lowest(low, 7)
longStop = showSLLines ? lowestLow - (atr * 1) : na
shortStop = showSLLines ? highestHigh + (atr * 1) : na
plot(longStop, title="Buy SL", color=color.green, style=plot.style_cross)
plot(shortStop, title="Sell SL", color=color.red, style=plot.style_cross)

// Trade execute
h = hour(time('1'), syminfo.timezone)
m = minute(time('1'), syminfo.timezone)
hourVal = h * 100 + m
totalTrades = strategy.opentrades + strategy.closedtrades
if (mktAlwaysOn or (hourVal < endOfDay))
    // Entry
    var float sl = na
    var float target = na
    if (longCond)
        strategy.entry("enter long", strategy.long, lotSize, limit=na, stop=na, comment="Enter Long")
        sl := longStop
        target := close + ((close - longStop) * rrRatio)
        alert('Buy:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)
    if (shortCond)
        strategy.entry("enter short", strategy.short, lotSize, limit=na, stop=na, comment="Enter Short")
        sl := shortStop
        target := close - ((shortStop - close) * rrRatio)
        alert('Sell:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)

    // Exit: target or SL
    if ((close >= target) or (close <= sl))
        strategy.close("enter long", comment=close < sl ? "Long SL hit" : "Long target hit")
    if ((close <= target) or (close >= sl))
        strategy.close("enter short", comment=close > sl ? "Short SL hit" : "Short target hit")
else if (not mktAlwaysOn)
    // Close all open position at the end if Day
    strategy.close_all(comment = "Close all entries at end of day.")



Thêm nữa