
Chiến lược này kết hợp các bước thoát đèn lồng (Chandelier Exit), đường trung bình di chuyển trễ không (ZLSMA) và phát hiện xung động của khối lượng giao dịch tương đối (RVOL) để tạo thành một hệ thống giao dịch hoàn chỉnh. Các bước thoát đèn lồng (Chandelier Exit) có thể điều chỉnh động vị trí dừng lỗ thông qua độ dao động thực sự (ATR) để thích ứng tốt hơn với sự thay đổi của thị trường.
ZLSMA - tăng cường chiến lược thoát ra và phát hiện xung lượng giao dịch là một chiến lược theo dõi xu hướng, kiểm soát rủi ro giao dịch bằng cách dừng lỗ động, phán đoán xu hướng và phát hiện xung lượng giao dịch, đồng thời nắm bắt cơ hội xu hướng. Logic của chiến lược rõ ràng, dễ hiểu và thực hiện, nhưng vẫn cần được tối ưu hóa và hoàn thiện trong ứng dụng thực tế kết hợp với các đặc điểm thị trường và loại giao dịch cụ thể. Bằng cách giới thiệu thêm các chỉ số xác nhận tín hiệu, tối ưu hóa điều kiện thoát ra, thiết lập tham số hợp lý và quản lý vị trí và kiểm soát rủi ro nghiêm ngặt, chiến lược này có khả năng trở thành một công cụ giao dịch ổn định và hiệu quả.
/*backtest
start: 2024-05-01 00:00:00
end: 2024-05-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Chandelier Exit Strategy with ZLSMA and Volume Spike Detection", shorttitle="CES with ZLSMA and Volume", overlay=true, process_orders_on_close=true, calc_on_every_tick=false)
// Chandelier Exit Inputs
lengthAtr = input.int(title='ATR Period', defval=1)
mult = input.float(title='ATR Multiplier', step=0.1, defval=2.0)
useClose = input.bool(title='Use Close Price for Extremums', defval=true)
// Calculate ATR
atr = mult * ta.atr(lengthAtr)
// Calculate Long and Short Stops
longStop = (useClose ? ta.highest(close, lengthAtr) : ta.highest(high, lengthAtr)) - atr
shortStop = (useClose ? ta.lowest(close, lengthAtr) : ta.lowest(low, lengthAtr)) + atr
// Update stops based on previous values
longStop := na(longStop[1]) ? longStop : close[1] > longStop[1] ? math.max(longStop, longStop[1]) : longStop
shortStop := na(shortStop[1]) ? shortStop : close[1] < shortStop[1] ? math.min(shortStop, shortStop[1]) : shortStop
// Determine Direction
var int dir = na
dir := na(dir[1]) ? (close > shortStop ? 1 : close < longStop ? -1 : na) : close > shortStop[1] ? 1 : close < longStop[1] ? -1 : dir[1]
// ZLSMA Inputs
lengthZLSMA = input.int(title="ZLSMA Length", defval=50)
offsetZLSMA = input.int(title="ZLSMA Offset", defval=0)
srcZLSMA = input.source(close, title="ZLSMA Source")
// ZLSMA Calculation
lsma = ta.linreg(srcZLSMA, lengthZLSMA, offsetZLSMA)
lsma2 = ta.linreg(lsma, lengthZLSMA, offsetZLSMA)
eq = lsma - lsma2
zlsma = lsma + eq
// Plot ZLSMA
plot(zlsma, title="ZLSMA", color=color.purple, linewidth=3)
// Swing High/Low Calculation
swingHigh = ta.highest(high, 5)
swingLow = ta.lowest(low, 5)
// Relative Volume (RVOL) Calculation
rvolLength = input.int(20, title="RVOL Length")
rvolThreshold = input.float(1.5, title="RVOL Threshold")
avgVolume = ta.sma(volume, rvolLength)
rvol = volume / avgVolume
// Define buy and sell signals based on ZLSMA and Volume Spike
buySignal = (dir == 1 and dir[1] == -1 and close > zlsma and rvol > rvolThreshold)
sellSignal = (dir == -1 and dir[1] == 1 and close < zlsma and rvol > rvolThreshold)
// Define exit conditions based on ZLSMA
exitLongSignal = (close < zlsma)
exitShortSignal = (close > zlsma)
// Strategy Entries and Exits
if (buySignal)
strategy.entry("Long", strategy.long, stop=swingLow)
if (sellSignal)
strategy.entry("Short", strategy.short, stop=swingHigh)
if (exitLongSignal)
strategy.close("Long")
if (exitShortSignal)
strategy.close("Short")
// Alerts
alertcondition(buySignal, title='Alert: CE Buy', message='Chandelier Exit Buy!')
alertcondition(sellSignal, title='Alert: CE Sell', message='Chandelier Exit Sell!')