Chiến lược giao dịch định lượng mở và đóng đường trung bình động kết hợp với chỉ báo động ADX

MA ADX SMMA EMA DEMA TEMA WMA VWMA HullMA LSMA ALMA SSMA TMA ATR
Ngày tạo: 2025-02-18 13:35:54 sửa đổi lần cuối: 2025-02-18 13:35:54
sao chép: 1 Số nhấp chuột: 445
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch định lượng mở và đóng đường trung bình động kết hợp với chỉ báo động ADX

Tổng quan

Đây là một chiến lược giao dịch định lượng dựa trên giá mở cửa và giá đóng cửa của đường trung bình di chuyển và kết hợp với chỉ số xu hướng trung bình ((ADX) làm bộ lọc. Chiến lược này sử dụng nhiều loại đường trung bình di chuyển, bao gồm SMMA, EMA, DEMA, v.v., để nắm bắt sự thay đổi xu hướng thị trường bằng cách xác định điểm giao thoa đường trung bình, đồng thời sử dụng chỉ số ADX để xác nhận cường độ của xu hướng, tăng độ tin cậy của giao dịch.

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

Lý thuyết cốt lõi của chiến lược là tính toán đường trung bình di chuyển của giá mở và giá đóng, tạo ra nhiều tín hiệu khi đường trung bình đóng vượt qua đường trung bình mở và ADX lớn hơn ngưỡng đặt; tạo ra tín hiệu trống khi đường trung bình đóng vượt qua đường trung bình mở và ADX lớn hơn ngưỡng đặt. Chiến lược hỗ trợ nhiều phương pháp tính toán đường trung bình di chuyển, bao gồm đường trung bình di chuyển đơn giản (SMA), đường trung bình di chuyển chỉ số (EMA) và đường trung bình di chuyển chỉ số (EMAD), để chọn loại đường trung bình phù hợp nhất theo các đặc điểm thị trường khác nhau.

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

  1. Tính linh hoạt: hỗ trợ nhiều loại đường trung bình di động, có thể chọn phương pháp tính trung bình tối ưu cho các môi trường thị trường khác nhau
  2. Xác nhận xu hướng: Chạy lọc các chỉ số ADX để giảm tín hiệu sai lệch trong thị trường biến động
  3. Kiểm soát rủi ro hoàn hảo: bao gồm các chức năng dừng lỗ và ngăn chặn, có thể kiểm soát hiệu quả rủi ro cho mỗi giao dịch
  4. Khả năng tùy biến cao: cung cấp nhiều giao diện tham số, bao gồm chu kỳ đường trung bình, ADX, hướng giao dịch, v.v., để tối ưu hóa chiến lược
  5. Hỗ trợ nhiều chu kỳ thời gian: có thể chạy trên các chu kỳ thời gian khác nhau, thích ứng với phong cách giao dịch khác nhau

Rủi ro chiến lược

  1. Mức độ chậm trễ của đường trung bình: đường trung bình di chuyển là một chỉ số chậm trễ, có thể tạo ra tín hiệu chậm trễ trong thị trường biến động nhanh
  2. Rủi ro phá vỡ giả: Có thể có phá vỡ giả theo đường trung bình khi thị trường bị biến động, mặc dù có lọc ADX nhưng vẫn cần lưu ý
  3. Nhận thức tham số: hiệu quả chiến lược nhạy cảm với các thiết lập tham số, cần điều chỉnh thích hợp trong các môi trường thị trường khác nhau
  4. Thị trường thích ứng: hoạt động tốt hơn trong thị trường có xu hướng rõ ràng, nhưng có thể giao dịch thường xuyên trong thị trường xung đột
  5. Tính phức tạp của tính toán: tính toán nhiều loại đường trung bình có thể làm tăng gánh nặng hệ thống, cần chú ý đến hiệu quả hoạt động

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

  1. Giới thiệu các chỉ báo khối lượng: Tính hợp lệ của xu hướng có thể được xác nhận bằng cách kết hợp các thay đổi về khối lượng
  2. Tối ưu hóa các tham số ADX: điều chỉnh ADX theo các động thái khác nhau của chu kỳ thị trường
  3. Tăng chỉ số xác nhận xu hướng: Có thể xem xét thêm các chỉ số xu hướng khác để tăng độ tin cậy tín hiệu
  4. Cải thiện cơ chế dừng lỗ: giới thiệu dừng theo dõi hoặc dừng tự điều chỉnh tỷ lệ dao động
  5. Tối ưu hóa thời gian giao dịch: xem xét các yếu tố biến động và thanh khoản của thị trường để chọn thời gian giao dịch tốt nhất

Tóm tắt

Đây là một hệ thống giao dịch định lượng kết hợp các chiến lược giao dịch chéo dòng cổ điển với các chỉ số ADX. Với sự hỗ trợ của nhiều loại đường thẳng và xác nhận xu hướng ADX, nó có thể nắm bắt được xu hướng thị trường tốt hơn, đồng thời có cơ chế kiểm soát rủi ro hoàn hảo. Chiến lược có thể được tùy chỉnh mạnh mẽ và có thể được điều chỉnh tối ưu hóa cho các môi trường thị trường khác nhau. Mặc dù có một số rủi ro vốn có, nhưng chiến lược này có giá trị thực tế tốt bằng cách đặt tham số hợp lý và tối ưu hóa liên tục.

Mã nguồn chiến lược
/*backtest
start: 2024-02-18 00:00:00
end: 2025-02-16 08:00:00
period: 3d
basePeriod: 3d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © algostudio

//@version=6
strategy("Open Close Cross Strategy R5.1", shorttitle="OCC Strategy R5.1", overlay=true,
     pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10, calc_on_every_tick=false)

// === INPUTS ===
useRes      = input.bool(true, title="Use Alternate Resolution?")
intRes      = input.int(3, title="Multiplier for Alternate Resolution", minval=1)
stratRes    = timeframe.ismonthly ? str.tostring(timeframe.multiplier * intRes) + "M" :
              timeframe.isweekly ? str.tostring(timeframe.multiplier * intRes) + "W" :
              timeframe.isdaily ? str.tostring(timeframe.multiplier * intRes) + "D" :
              timeframe.isintraday ? str.tostring(timeframe.multiplier * intRes) : "60"

basisType   = input.string("SMMA", title="MA Type:", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "HullMA", "LSMA", "ALMA", "SSMA", "TMA"])
basisLen    = input.int(8, title="MA Period", minval=1)
offsetSigma = input.int(6, title="Offset for LSMA / Sigma for ALMA", minval=0)
offsetALMA  = input.float(0.85, title="Offset for ALMA", minval=0, step=0.01)
scolor      = input.bool(false, title="Show Colored Bars to Indicate Trend?")
delayOffset = input.int(0, title="Delay Open/Close MA (Forces Non-Repainting)", minval=0, step=1)
tradeType   = input.string("BOTH", title="What trades should be taken:", options=["LONG", "SHORT", "BOTH", "NONE"])

// === BASE FUNCTIONS ===
variant(type, src, len, offSig, offALMA) =>
    if type == "EMA"
        ta.ema(src, len)
    else if type == "DEMA"
        ta.ema(ta.ema(src, len), len) * 2 - ta.ema(ta.ema(ta.ema(src, len), len), len)
    else if type == "TEMA"
        3 * (ta.ema(src, len) - ta.ema(ta.ema(src, len), len)) + ta.ema(ta.ema(ta.ema(src, len), len), len)
    else if type == "WMA"
        ta.wma(src, len)
    else if type == "VWMA"
        ta.vwma(src, len)
    else if type == "SMMA"
        ta.sma(src, len)
    else if type == "HullMA"
        ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len)))
    else if type == "LSMA"
        ta.linreg(src, len, offSig)
    else if type == "ALMA"
        ta.alma(src, len, offALMA, offSig)
    else if type == "TMA"
        ta.sma(ta.sma(src, len), len)
    else
        ta.sma(src, len)

// Security wrapper
reso(exp, use, res) => use ? request.security(syminfo.tickerid, res, exp, lookahead=barmerge.lookahead_on) : exp

// === SERIES SETUP ===
closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries  = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)

// Alternate resolution series
closeSeriesAlt = reso(closeSeries, useRes, stratRes)
openSeriesAlt  = reso(openSeries, useRes, stratRes)

// Trend Colors
trendColour = closeSeriesAlt > openSeriesAlt ? color.green : color.red
bcolour     = closeSeries > openSeriesAlt ? color.lime : color.red
barcolor(scolor ? bcolour : na, title="Bar Colours")

closeP = plot(closeSeriesAlt, title="Close Series", color=trendColour, linewidth=2, style=plot.style_line)
openP  = plot(openSeriesAlt, title="Open Series", color=trendColour, linewidth=2, style=plot.style_line)
fill(closeP, openP, color=trendColour)
// === ADX FILTER ===
// ADX Calculation
// Input parameters
adxLength = input.int(14, title="ADX Length", minval=1)
adxfilter = input.int(13, title="ADX filter", minval=1)
// Calculate +DM and -DM (Directional Movement)
plusDM = math.max(high - high[1], 0)
minusDM = math.max(low[1] - low, 0)

// Remove cases where both are positive
plusDM := plusDM > minusDM ? plusDM : 0
minusDM := minusDM > plusDM ? minusDM : 0

// Smooth the directional movement using RMA
smoothedPlusDM = ta.rma(plusDM, adxLength)
smoothedMinusDM = ta.rma(minusDM, adxLength)

// Calculate True Range and smooth it
tr = ta.atr(adxLength)
smoothedTR = ta.rma(tr, adxLength)

// Compute +DI and -DI
plusDI = (smoothedPlusDM / smoothedTR) * 100
minusDI = (smoothedMinusDM / smoothedTR) * 100

// Compute DX (Directional Index)
dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100

// Compute ADX by smoothing DX
adx = ta.rma(dx, adxLength)




// === UPDATED TRADE CONDITIONS ===
xlong     = ta.crossover(closeSeriesAlt, openSeriesAlt) and adx > adxfilter
xshort    = ta.crossunder(closeSeriesAlt, openSeriesAlt) and adx > adxfilter
longCond  = xlong
shortCond = xshort


// === STRATEGY ===
slPoints  = input.float(0, title="Initial Stop Loss Points", minval=0)
tpPoints  = input.float(0, title="Initial Target Profit Points", minval=0)
ebar      = input.int(10000, title="Number of Bars for Back Testing", minval=0)

tdays     = (timenow - time) / 60000.0

tdays     := timeframe.ismonthly ? tdays / 1440.0 / 5.0 / 4.3 / timeframe.multiplier :
             timeframe.isweekly ? tdays / 1440.0 / 5.0 / timeframe.multiplier :
             timeframe.isdaily ? tdays / 1440.0 / timeframe.multiplier :
             tdays / timeframe.multiplier

TP = tpPoints > 0 ? tpPoints : na
SL = slPoints > 0 ? slPoints : na

if (ebar == 0 or tdays <= ebar)
    if longCond and tradeType != "SHORT"
        strategy.entry("long", strategy.long)
    if shortCond and tradeType != "LONG"
        strategy.entry("short", strategy.short)
    if shortCond and tradeType == "LONG"
        strategy.close("long")
    if longCond and tradeType == "SHORT"
        strategy.close("short")
    strategy.exit("XL", from_entry="long", profit=TP, loss=SL)
    strategy.exit("XS", from_entry="short", profit=TP, loss=SL)

// === END ===