Chiến lược theo dõi xu hướng trung bình động hàm mũ đơn với lệnh dừng lỗ


Ngày tạo: 2024-01-08 11:37:44 sửa đổi lần cuối: 2024-01-08 11:37:44
sao chép: 1 Số nhấp chuột: 649
1
tập trung vào
1617
Người theo dõi

Chiến lược theo dõi xu hướng trung bình động hàm mũ đơn với lệnh dừng lỗ

Tổng quan

Chiến lược này kết hợp với việc sử dụng một chỉ số trung bình di chuyển phẳng ((SESMA) và các cơ chế xung quanh thang Tôn Chi đi kèm với dừng lỗ, tạo thành một chiến lược theo dõi xu hướng rất ổn định và hiệu quả. Sesma là đường dẫn chính để xác định hướng của xu hướng giá.

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

Chiến lược này bao gồm hai chỉ số cốt lõi:

  1. Đường trung bình di chuyển trơn lẻ ((SESMA): SESMA lấy ý tưởng của EMA, đồng thời cải tiến các tham số để làm cho đường cong trơn tru hơn, giảm độ trễ. Xác định xu hướng giá thông qua hướng và mối quan hệ giá của SESMA.

  2. Cơ chế dừng theo dõi: kết hợp giá cao nhất, giá thấp nhất và chỉ số ATR, tính toán đường dừng của nhiều đầu và đầu trống trong thời gian thực. Đây là một cơ chế dừng điều chỉnh động, có thể điều chỉnh mức dừng tùy thuộc vào biến động và xu hướng thị trường.

Chiến lược này dựa vào vào khi giá phá vỡ SESMA. Trong khi đó, tín hiệu ra đi được kích hoạt bởi đường dừng lỗ. Có thể thiết lập xem dấu hiệu có hiển thị không.

Lợi thế chiến lược

  1. SESMA đã cải thiện phương pháp tính toán, có thể giảm hiệu quả sự chậm trễ và cải thiện khả năng nắm bắt chuyển động.
  2. Cơ chế dừng chân theo dõi có thể điều chỉnh độ dừng chân theo biến động thời gian thực, tránh dừng lỗ quá nhẹ hoặc quá chặt.
  3. Hỗ trợ đánh giá thị giác phụ đánh dấu thời gian nhập cảnh và xuất cảnh
  4. Các tham số có thể tùy chỉnh, áp dụng cho các giống khác nhau và tối ưu hóa tham số.

Rủi ro và phương hướng tối ưu hóa

  1. Trong một xu hướng đảo ngược, có thể xảy ra dừng lỗ được kích hoạt dẫn đến rút lui sớm.
  2. Các tham số SESMA có thể được tối ưu hóa để tìm ra chiều dài tối ưu.
  3. Các tham số ATR cũng có thể kiểm tra các độ dài chu kỳ khác nhau.
  4. Thử nghiệm cho thấy hiệu quả của dấu hiệu.

Tóm tắt

Chiến lược này kết hợp các chỉ số kiểm soát rủi ro và định hướng để tạo ra một chiến lược theo dõi xu hướng mạnh mẽ hơn. Chiến lược này có thể nắm bắt xu hướng linh hoạt hơn và giảm sự rút lui so với chiến lược trung bình di chuyển đơn giản.

Mã nguồn chiến lược
/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-07 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © simwai
strategy('Chandelier Exit ZLSMA Strategy', shorttitle='CE_ZLSMA', overlay = true, initial_capital = 1000, default_qty_value = 10, default_qty_type = strategy.percent_of_equity, calc_on_every_tick = false, process_orders_on_close = true, commission_value = 0.075)

// -- Colors --
color maximumYellowRed = color.rgb(255, 203, 98) // yellow
color rajah = color.rgb(242, 166, 84) // orange
color magicMint = color.rgb(171, 237, 198)
color languidLavender = color.rgb(232, 215, 255)
color maximumBluePurple = color.rgb(181, 161, 226)
color skyBlue = color.rgb(144, 226, 244)
color lightGray = color.rgb(214, 214, 214)
color quickSilver = color.rgb(163, 163, 163)
color mediumAquamarine = color.rgb(104, 223, 153)
color carrotOrange = color.rgb(239, 146, 46)

// -- Inputs --
length = input(title='ATR Period', defval=1)
mult = input.float(title='ATR Multiplier', step=0.1, defval=2)
showLabels = input(title='Show Buy/Sell Labels ?', tooltip='Created by Chandelier Exit (CE)', defval=false)
isSignalLabelEnabled = input(title='Show Signal Labels ?', defval=true)
useClose = input(title='Use Close Price for Extrema ?', defval=true)
zcolorchange = input(title='Enable Rising/Decreasing Highlightning', defval=false)
zlsmaLength = input(title='ZLSMA Length', defval=50)
offset = input(title='Offset', defval=0)

// -- CE - Credits to @everget --
float haClose = float(1) / 4 * (open[1] + high[1] + low[1] + close[1])
atr = mult * ta.atr(length)[1]

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

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

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

buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal and showLabels ? longStop : na, title='Buy Label', text='Buy', location=location.absolute, style=shape.labelup, size=size.tiny, color=mediumAquamarine, textcolor=color.white)
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal and showLabels ? shortStop : na, title='Sell Label', text='Sell', location=location.absolute, style=shape.labeldown, size=size.tiny, color=carrotOrange, textcolor=color.white)

changeCond = dir != dir[1]

// -- ZLSMA - Credits to @netweaver2011 --
lsma = ta.linreg(haClose, zlsmaLength, offset)
lsma2 = ta.linreg(lsma, zlsmaLength, offset)
eq = lsma - lsma2
zlsma = lsma + eq

zColor = zcolorchange ? zlsma > zlsma[1] ? magicMint : rajah : languidLavender
plot(zlsma, title='ZLSMA', linewidth=2, color=zColor)

// -- Signals --
var string isTradeOpen = ''
var string signalCache = ''

bool enterLong = buySignal and ta.crossover(haClose, zlsma) 
bool exitLong = ta.crossunder(haClose, zlsma) 
bool enterShort = sellSignal and ta.crossunder(haClose, zlsma)
bool exitShort = ta.crossover(haClose, zlsma)

if (signalCache == 'long entry')
    signalCache := ''
    enterLong := true
else if (signalCache == 'short entry')
    signalCache := ''
    enterShort := true

if (isTradeOpen == '')
    if (exitShort and (not enterLong))
        exitShort := false
    if (exitLong and (not enterShort))
        exitLong := false   
    if (enterLong and exitShort)
        isTradeOpen := 'long'
        exitShort := false
    else if (enterShort and exitLong)
        isTradeOpen := 'short'
        exitLong := false
    else if (enterLong)
        isTradeOpen := 'long'
    else if (enterShort)
        isTradeOpen := 'short'
else if (isTradeOpen == 'long')
    if (exitShort)
        exitShort := false
    if (enterLong)
        enterLong := false
    if (enterShort and exitLong)
        enterShort := false
        signalCache := 'short entry'
    if (exitLong)
        isTradeOpen := ''
else if (isTradeOpen == 'short')
    if (exitLong)
        exitLong := false
    if (enterShort)
        enterShort := false
    if (enterLong and exitShort)
        enterLong := false
        signalCache := 'long entry'
    if (exitShort)
        isTradeOpen := ''

plotshape((isSignalLabelEnabled and enterLong) ? zlsma : na, title='LONG', text='L', style=shape.labelup, color=mediumAquamarine, textcolor=color.white, size=size.tiny, location=location.absolute)
plotshape((isSignalLabelEnabled and enterShort) ? zlsma : na, title='SHORT', text='S', style=shape.labeldown, color=carrotOrange, textcolor=color.white, size=size.tiny, location=location.absolute)
plotshape((isSignalLabelEnabled and exitLong) ? zlsma : na, title='LONG EXIT', style=shape.circle, color=magicMint, size=size.tiny, location=location.absolute)
plotshape((isSignalLabelEnabled and exitShort) ? zlsma : na, title='SHORT EXIT', style=shape.circle, color=rajah, size=size.tiny, location=location.absolute)

barcolor(color=isTradeOpen == 'long' ? mediumAquamarine : isTradeOpen == 'short' ? carrotOrange : na)

// -- Long Exits --
if (exitLong and strategy.position_size > 0)
    strategy.close('long', comment='EXIT_LONG')

// -- Short Exits --
if (exitShort and strategy.position_size < 0)
    strategy.close('short', comment='EXIT_SHORT')

// -- Long Entries --
if (enterLong)
    strategy.entry('long', strategy.long, comment='ENTER_LONG')

// -- Short Entries --
if (enterShort)
    strategy.entry('short', strategy.short, comment='ENTER_SHORT')