Trung bình di chuyển trùng lặp không chậm với chiến lược giao dịch thoát Chandelier

Tác giả:ChaoZhang, Ngày: 2024-01-22 10:03:05
Tags:

img

Tổng quan

Ý tưởng chính của chiến lược này là kết hợp chỉ số Trung bình Di chuyển chồng chéo không chậm (ZLSMA) để đánh giá hướng xu hướng và chỉ số Chandelier Exit (CE) để tìm ra các điểm vào và ra chính xác hơn. ZLSMA là một chỉ số xu hướng có thể xác định các thay đổi xu hướng sớm hơn. CE điều chỉnh động các điểm ra bằng cách tính toán ATR để kiểm soát hiệu quả lỗ dừng.

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

  1. Phần ZLSMA:

    • Sử dụng phương pháp hồi quy tuyến tính để tính các đường LMA 130 thời gian tương ứng.
    • Sau đó chồng chéo hai đường LMA để có được giá trị khác biệt được gán cho eq.
    • Cuối cùng, xây dựng Trung bình di chuyển ZLSMA trùng lặp Zero Lag thông qua đường LMA ban đầu cộng với sự khác biệt eq.
  2. Phần CE:

    • Tính toán chỉ số ATR và nhân nó với một nhân (chế độ mặc định 2) để xác định khoảng cách động từ điểm cao hoặc thấp gần đây nhất.
    • Khi giá đóng vượt quá đường dừng lỗ dài hoặc ngắn gần đây nhất, điều chỉnh đường dừng lỗ phù hợp.
    • Xác định hướng dài hoặc ngắn dựa trên sự thay đổi giá đóng so với đường dừng lỗ.
  3. Tín hiệu nhập cảnh:

    • ZLSMA đánh giá hướng xu hướng, nhập khi CE phát ra tín hiệu.
  4. Thất bại dừng thoát:

    • Đặt lệnh dừng lỗ và lấy lợi nhuận cho vị trí dài.
    • Đối với vị trí ngắn, sử dụng lối thoát động của CE để thay thế stop loss cố định.

Phân tích lợi thế

  1. ZLSMA có thể xác định xu hướng sớm hơn để tránh đột phá sai.
  2. CE có thể điều chỉnh linh hoạt các điểm thoát theo sự biến động của thị trường.
  3. Tỷ lệ rủi ro-lợi nhuận tùy chỉnh của chiến lược.
  4. Các phương pháp dừng lỗ và lấy lợi nhuận khác nhau được sử dụng cho các vị trí dài và ngắn để kiểm soát rủi ro.

Phân tích rủi ro

  1. Các thiết lập tham số không chính xác có thể làm tăng tỷ lệ mất mát hoặc mở rộng phạm vi dừng mất mát.
  2. Vẫn có nguy cơ dừng lỗ bị phá vỡ trong trường hợp đảo ngược thị trường nhanh chóng.

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

  1. Các thông số có thể được tối ưu hóa cho các thị trường và khung thời gian khác nhau.
  2. Xem xét điều chỉnh các tham số lợi nhuận/đã dừng dựa trên biến động hoặc chu kỳ cụ thể.
  3. Hãy thử kết hợp với các chỉ số hoặc mô hình khác để cải thiện tỷ lệ lợi nhuận.

Tóm lại

Chiến lược này chủ yếu sử dụng Trung bình di chuyển chồng chéo không để xác định hướng xu hướng, kết hợp với chỉ số Chandelier Exit để tìm ra các điểm nhập và thoát chính xác hơn. Những lợi thế nằm trong tỷ lệ dừng / lợi nhuận có thể tùy chỉnh và điều chỉnh năng động của Chandelier Exit có thể kiểm soát rủi ro theo điều kiện thị trường.


/*backtest
start: 2024-01-14 00:00:00
end: 2024-01-21 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/
// © GGkurg

//@version=5

strategy(title = "ZLSMA + Chandelier Exit", shorttitle="ZLSMA + CE", overlay=true)


var GRP1 = "take profit / stop loss"
TP = input(title='long TP%', defval=2.0,   inline = "1", group = GRP1) 
SL = input(title='long SL%', defval=2.0,    inline = "1", group = GRP1) 
TP2 = input(title='short TP', defval=2.0,    inline = "2", group = GRP1) 
SL2 = input(title='short SL', defval=2.0,    inline = "2", group = GRP1) 
//-------------------------------------------------calculations
takeProfitPrice = strategy.position_avg_price * (1+(TP/100))
stopLossPrice = strategy.position_avg_price * (1-(SL/100))
takeProfitPrice2 = strategy.position_avg_price * (1-(TP2/100))
stopLossPrice2 = strategy.position_avg_price * (1+(SL2/100))


//---------------------------------------ZLSMA - Zero Lag LSMA
var GRP2 = "ZLSMA settings"
length1 = input(title='Length', defval=130, inline = "1", group = GRP2) 
offset1 = input(title='Offset', defval=0, inline = "2", group = GRP2) 
src = input(close, title='Source', inline = "3", group = GRP2) 
lsma = ta.linreg(src, length1, offset1)
lsma2 = ta.linreg(lsma, length1, offset1)
eq = lsma - lsma2
zlsma = lsma + eq

plot(zlsma, color=color.new(color.yellow, 0), linewidth=3)


//---------------------------------------ZLSMA conditisions 
//---------long
longc1 = close > zlsma
longclose1 = close < zlsma
//---------short
shortc1 = close < zlsma
shortclose1 = close > zlsma


//---------------------------------------Chandelier Exit
var string calcGroup = 'Chandelier exit settings'
length = input.int(title='ATR Period', defval=1, group=calcGroup)
mult = input.float(title='ATR Multiplier', step=0.1, defval=2.0, group=calcGroup)
useClose = input.bool(title='Use Close Price for Extremums', defval=true, group=calcGroup)

var string visualGroup = 'Visuals'
showLabels = input.bool(title='Show Buy/Sell Labels', defval=true, group=visualGroup)
highlightState = input.bool(title='Highlight State', defval=true, group=visualGroup)

var string alertGroup = 'Alerts'
awaitBarConfirmation = input.bool(title="Await Bar Confirmation", defval=true, group=alertGroup)

atr = mult * ta.atr(length)

longStop = (useClose ? ta.highest(close, length) : ta.highest(length)) - atr
longStopPrev = nz(longStop[1], longStop)
longStop := close[1] > longStopPrev ? math.max(longStop, longStopPrev) : longStop

shortStop = (useClose ? ta.lowest(close, length) : ta.lowest(length)) + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop

var int dir = 1
dir := close > shortStopPrev ? 1 : close < longStopPrev ? -1 : dir

var color longColor = color.green
var color shortColor = color.red
var color longFillColor = color.new(color.green, 90)
var color shortFillColor = color.new(color.red, 90)
var color textColor = color.new(color.white, 0)

longStopPlot = plot(dir == 1 ? longStop : na, title='Long Stop', style=plot.style_linebr, linewidth=2, color=color.new(longColor, 0))
buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal ? longStop : na, title='Long Stop Start', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(longColor, 0))
plotshape(buySignal and showLabels ? longStop : na, title='Buy Label', text='Buy', location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(longColor, 0), textcolor=textColor)

shortStopPlot = plot(dir == 1 ? na : shortStop, title='Short Stop', style=plot.style_linebr, linewidth=2, color=color.new(shortColor, 0))
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal ? shortStop : na, title='Short Stop Start', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(shortColor, 0))
plotshape(sellSignal and showLabels ? shortStop : na, title='Sell Label', text='Sell', location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(shortColor, 0), textcolor=textColor)

midPricePlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0, display=display.none, editable=false)

longStateFillColor = highlightState ? dir == 1 ? longFillColor : na : na
shortStateFillColor = highlightState ? dir == -1 ? shortFillColor : na : na
fill(midPricePlot, longStopPlot, title='Long State Filling', color=longStateFillColor)
fill(midPricePlot, shortStopPlot, title='Short State Filling', color=shortStateFillColor)

await = awaitBarConfirmation ? barstate.isconfirmed : true
alertcondition(dir != dir[1] and await, title='Alert: CE Direction Change', message='Chandelier Exit has changed direction!')
alertcondition(buySignal and await, title='Alert: CE Buy', message='Chandelier Exit Buy!')
alertcondition(sellSignal and await, title='Alert: CE Sell', message='Chandelier Exit Sell!')




//---------------------------------------Chandelier Exit conditisions 
//---------long
longc2 = buySignal
longclose2 = sellSignal
//---------short
shortc2 = sellSignal
shortclose2 = buySignal



//---------------------------------------Long entry and exit
if longc1 and longc2 
    strategy.entry("long", strategy.long)

if strategy.position_avg_price > 0
    strategy.exit("close long", "long", limit = takeProfitPrice, stop = stopLossPrice, alert_message = "close all orders")

if longclose1 and longclose2 and strategy.opentrades == 1
    strategy.close("long","ema long cross", alert_message = "close all orders")


//---------------------------------------Short entry and exit
if shortc1 and shortc2 
    strategy.entry("short", strategy.short)

if strategy.position_avg_price > 0
    strategy.exit("close short", "short", limit = takeProfitPrice2, stop = stopLossPrice2, alert_message = "close all orders")

if shortclose1 and shortclose2 and strategy.opentrades == 1
    strategy.close("close short","short", alert_message = "close all orders")




Thêm nữa