Mở chiến lược dừng lỗ cao và thấp


Ngày tạo: 2024-02-18 14:30:08 sửa đổi lần cuối: 2024-02-18 14:30:08
sao chép: 7 Số nhấp chuột: 599
1
tập trung vào
1617
Người theo dõi

Mở chiến lược dừng lỗ cao và thấp

Tổng quan

Chiến lược này được thiết kế dựa trên dữ liệu K-line của Entries, để tìm kiếm điểm đảo ngược của xu hướng. Các Entries sau đó sẽ thiết lập đường dừng dựa trên chỉ số ATR và theo dõi dừng. Chiến lược cũng tính toán vị trí mục tiêu dựa trên tỷ lệ rủi ro và hoàn thành mục tiêu sau khi đạt được mục tiêu hoặc bị dừng.

Nguyên tắc chiến lược

Tín hiệu Entries của chiến lược này đến từ điểm mở cao thấp. Khi giá mở của một đường K bằng giá thấp nhất, nó tạo ra tín hiệu mua, và khi giá mở bằng giá cao nhất, nó tạo ra tín hiệu bán, cho thấy có thể có cơ hội đảo ngược xu hướng.

Entries sau đó sẽ được tính theo dõi động theo chỉ số ATR. Đường dừng sau khi mua là giá thấp nhất trong đường N gốc K gần nhất trừ ATR 1 lần; đường dừng sau khi bán là giá cao nhất trong đường N gốc K gần nhất cộng thêm ATR 1 lần. Đường dừng sẽ được cập nhật động, theo dõi giá hoạt động.

Lợi nhuận mục tiêu được tính theo tỷ lệ lợi nhuận rủi ro được thiết lập. Giá mục tiêu mua là giá nhập cảnh cộng với (xấp xỉ lợi nhuận rủi ro của sự khác biệt giữa giá nhập cảnh và giá dừng); Giá mục tiêu bán là giá nhập cảnh trừ (xấp xỉ lợi nhuận rủi ro của sự khác biệt giữa giá dừng và giá nhập cảnh).

Khi giá chạm giá dừng lỗ hoặc giá mục tiêu, hãy đưa ra chỉ thị bán hàng.

Phân tích lợi thế

Chiến lược này có những ưu điểm sau:

  1. Các tín hiệu đơn giản, rõ ràng, dễ dàng đánh giá, tránh bị rung nhiều lần.

  2. Động thái ATR dừng lỗ, khóa lợi nhuận tối đa, tránh theo đuổi cao giết thấp.

  3. Kiểm soát tỷ lệ lợi nhuận rủi ro, tránh lợi nhuận và hoạt động quá ngắn.

  4. Có thể sử dụng cho các giống khác nhau và dễ dàng tối ưu hóa.

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro:

  1. Các tín hiệu của Entries có thể bị chậm trễ một chút, bỏ lỡ vị trí tốt nhất.

  2. Giá dừng lỗ gần hoặc quá thoải mái, có thể bị đặt hoặc mất lợi nhuận.

  3. Các mô-đun đánh giá không có xu hướng, dễ bị mắc kẹt trong tình huống chấn động.

  4. Không thể xử lý việc xây nhà kho qua đêm.

Định hướng tối ưu hóa tương ứng:

  1. Kết hợp các chỉ số khác để đánh giá xu hướng, tránh đánh giá rủi ro.

  2. Điều chỉnh tham số ATR hoặc thêm kiểm soát tỷ lệ dao động, tối ưu hóa điểm dừng lỗ.

  3. Tăng mô-đun phân định xu hướng hoặc lọc, giảm sai sót của tín hiệu Entries.

  4. Tham gia mô-đun xử lý đêm để xử lý kho đêm của một giống cụ thể.

Tóm tắt

Chiến lược này nói chung là đơn giản, trực tiếp, tín hiệu Entries rõ ràng, suy nghĩ dừng lỗ hợp lý, kiểm soát rủi ro. Tuy nhiên, cũng có một số hạn chế, chẳng hạn như phán đoán xu hướng kém, tín hiệu chậm trễ. Những vấn đề này cũng cung cấp hướng dẫn cho tối ưu hóa trong tương lai. Bằng cách kết hợp nhiều chỉ số phán đoán và mô-đun kiểm soát rủi ro, chiến lược có thể tăng cường hiệu quả hơn nữa và trở nên phổ biến hơn.

Mã nguồn chiến lược
/*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.")