Tài nguyên đang được tải lên... tải...

Chiến lược nắm bắt xu hướng định lượng tiên tiến với bộ lọc phạm vi động

Tác giả:ChaoZhang, Ngày: 2024-12-17 14:31:11
Tags:EMAMARFVOLSMAHA

img

Tổng quan

Chiến lược này là một hệ thống giao dịch định lượng tiên tiến kết hợp trung bình động với bộ lọc phạm vi động. Nó xác định xu hướng thị trường bằng cách phân tích mối quan hệ giữa chuyển động giá và khối lượng giao dịch, trong khi sử dụng bộ lọc phạm vi để loại bỏ các tín hiệu sai và cải thiện độ chính xác giao dịch. Chiến lược sử dụng các phương pháp tính toán thích nghi để xác định ranh giới thanh khoản thị trường và kết hợp trung bình động nhanh và chậm để xác nhận hướng xu hướng.

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

Logic cốt lõi của chiến lược dựa trên các tính toán chính sau:

  1. Phân tích thanh khoản: Đánh giá thanh khoản thị trường bằng cách tính tỷ lệ khối lượng so với biến động giá và thiết lập ranh giới thanh khoản năng động.
  2. Xác nhận xu hướng: Sử dụng Trung bình Di chuyển Triệu suất (EMA) 50 giai đoạn và 100 giai đoạn để xác nhận hướng xu hướng.
  3. Bộ lọc phạm vi: Sử dụng thời gian lấy mẫu 50 giai đoạn và nhân phạm vi 3 lần để xây dựng các phạm vi giao dịch năng động.
  4. Sản xuất tín hiệu: Tạo tín hiệu giao dịch khi giá vượt qua bộ lọc phạm vi và các chỉ số EMA cho thấy xu hướng nhất quán.

Ưu điểm chiến lược

  1. Khả năng thích nghi mạnh mẽ: Chiến lược có thể điều chỉnh động các tham số dựa trên điều kiện thị trường, thích nghi với môi trường thị trường khác nhau.
  2. Các tín hiệu đáng tin cậy: Có hiệu quả giảm các tín hiệu sai bằng cách kết hợp nhiều chỉ số kỹ thuật và bộ lọc.
  3. Quản lý rủi ro toàn diện: tích hợp tính toán tự động các vị trí dừng lỗ để kiểm soát rủi ro hiệu quả.
  4. Chức năng kiểm tra ngược hoàn chỉnh: Bao gồm các cài đặt kiểm tra ngược chi tiết để tối ưu hóa chiến lược.

Rủi ro chiến lược

  1. Độ nhạy của tham số: Nhiều tham số đòi hỏi phải điều chỉnh kỹ và dễ bị tối ưu hóa quá mức.
  2. Tác động trượt: Có thể phải đối mặt với rủi ro trượt đáng kể trong các thị trường biến động cao.
  3. Khả năng thích nghi với thị trường: Có thể tạo ra các tín hiệu sai thường xuyên trên các thị trường khác nhau.
  4. Quản lý vốn: Phương pháp phân bổ vốn cố định có thể không phù hợp với mọi điều kiện thị trường.

Hướng dẫn tối ưu hóa chiến lược

  1. Điều chỉnh tham số: giới thiệu các cơ chế điều chỉnh tham số thích nghi để điều chỉnh tham số tự động dựa trên điều kiện thị trường.
  2. Nhận dạng trạng thái thị trường: Thêm các mô-đun nhận dạng trạng thái thị trường để áp dụng các chiến lược giao dịch khác nhau trong các điều kiện thị trường khác nhau.
  3. Tối ưu hóa quản lý vốn: Thực hiện kích thước vị trí năng động dựa trên biến động thị trường.
  4. Tăng cường bộ lọc tín hiệu: Thêm nhiều chỉ số kỹ thuật để lọc các tín hiệu sai.

Tóm lại

Chiến lược xây dựng một hệ thống giao dịch định lượng hoàn chỉnh bằng cách kết hợp phân tích thanh khoản, theo dõi xu hướng và lọc phạm vi. Sức mạnh của nó nằm trong khả năng thích nghi với những thay đổi của thị trường và cung cấp các tín hiệu giao dịch đáng tin cậy, trong khi yêu cầu chú ý đến tối ưu hóa tham số và quản lý rủi ro. Thông qua tối ưu hóa và cải tiến liên tục, chiến lược cho thấy hứa hẹn trong việc duy trì hiệu suất ổn định trong các môi trường thị trường khác nhau.


/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-15 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Killer Coin V2 + Range Filter Strategy", shorttitle="KC-RF Strategy", overlay=true
         )

// === INPUT BACKTEST RANGE ===
useDate = input(true, title='---------------- Use Date ----------------', group="Backtest Settings")
FromMonth = input.int(7, title="From Month", minval=1, maxval=12, group="Backtest Settings")
FromDay = input.int(25, title="From Day", minval=1, maxval=31, group="Backtest Settings")
FromYear = input.int(2019, title="From Year", minval=2017, group="Backtest Settings")
ToMonth = input.int(1, title="To Month", minval=1, maxval=12, group="Backtest Settings")
ToDay = input.int(1, title="To Day", minval=1, maxval=31, group="Backtest Settings")
ToYear = input.int(9999, title="To Year", minval=2017, group="Backtest Settings")
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window() => time >= start and time <= finish

// === KILLER COIN V2 INPUTS ===
outlierThreshold = input.int(10, "Outlier Threshold Length", group="Killer Coin Settings")
fastMovingAverageLength = input.int(50, "Fast MA length", group="Killer Coin Settings")
slowMovingAverageLength = input.int(100, "Slow MA length", group="Killer Coin Settings")

// === RANGE FILTER INPUTS ===
sources = input(close, "Source", group="Range Filter Settings")
isHA = input(false, "Use HA Candles", group="Range Filter Settings")
per = input.int(50, "Sampling Period", minval=1, group="Range Filter Settings")
mult = input.float(3.0, "Range Multiplier", minval=0.1, group="Range Filter Settings")

// === KILLER COIN V2 CALCULATIONS ===
priceMovementLiquidity = volume / math.abs(close - open)
liquidityBoundary = ta.ema(priceMovementLiquidity, outlierThreshold) + ta.stdev(priceMovementLiquidity, outlierThreshold)
var liquidityValues = array.new_float(5)

if ta.crossover(priceMovementLiquidity, liquidityBoundary)
    array.insert(liquidityValues, 0, close)

fastEMA = ta.ema(array.get(liquidityValues, 0), fastMovingAverageLength)
slowEMA = ta.ema(array.get(liquidityValues, 0), slowMovingAverageLength)

// === RANGE FILTER CALCULATIONS ===
src = isHA ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, sources) : sources

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = (t*2) - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper)*m
    smoothrng

smrng = smoothrng(src, per, mult)

// Range Filter
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r))
    rngfilt

filt = rngfilt(src, smrng)

// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands
hband = filt + smrng
lband = filt - smrng

// === PLOTTING ===
// Killer Coin V2 Plots
bullColor = color.new(#00ffbb, 50)
bearColor = color.new(#800080, 50)
fastPlot = plot(fastEMA, "Fast EMA", color = fastEMA > slowEMA ? bullColor : bearColor)
slowPlot = plot(slowEMA, "Slow EMA", color = fastEMA > slowEMA ? bullColor : bearColor)
fill(fastPlot, slowPlot, color = fastEMA > slowEMA ? bullColor : bearColor)

// Range Filter Plots
filtcolor = upward > 0 ? color.new(color.lime, 0) : downward > 0 ? color.new(color.red, 0) : color.new(color.orange, 0)
filtplot = plot(filt, "Range Filter", color=filtcolor, linewidth=3)
hbandplot = plot(hband, "High Target", color=color.new(color.aqua, 90))
lbandplot = plot(lband, "Low Target", color=color.new(color.fuchsia, 90))
fill(hbandplot, filtplot, color=color.new(color.aqua, 90))
fill(lbandplot, filtplot, color=color.new(color.fuchsia, 90))

// === STRATEGY CONDITIONS ===
// Range Filter Conditions
longCond = ((src > filt) and (src > src[1]) and (upward > 0)) or ((src > filt) and (src < src[1]) and (upward > 0))
shortCond = ((src < filt) and (src < src[1]) and (downward > 0)) or ((src < filt) and (src > src[1]) and (downward > 0))

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

// Combined Conditions
finalLongSignal = longCondition and fastEMA > slowEMA and window()
finalShortSignal = shortCondition and fastEMA < slowEMA and window()

// === PLOTTING SIGNALS ===
plotshape(finalLongSignal, "Buy Signal", text="BUY", textcolor=color.white, 
         style=shape.labelup, size=size.normal, location=location.belowbar, 
         color=color.new(color.green, 0))
         
plotshape(finalShortSignal, "Sell Signal", text="SELL", textcolor=color.white, 
         style=shape.labeldown, size=size.normal, location=location.abovebar, 
         color=color.new(color.red, 0))

// === STRATEGY ENTRIES ===
if finalLongSignal
    strategy.entry("Long", strategy.long, stop=hband)
    
if finalShortSignal
    strategy.entry("Short", strategy.short, stop=lband)

// === ALERTS ===
alertcondition(finalLongSignal, "Strong Buy Signal", "🚨 Buy - Both Indicators Aligned!")
alertcondition(finalShortSignal, "Strong Sell Signal", "🚨 Sell - Both Indicators Aligned!")

Có liên quan

Thêm nữa