Chiến lược giao dịch khối lượng tương đối phần trăm động lượng

RVPR ATR SL/TP MA EMA SMMA WMA JMA T3
Ngày tạo: 2025-07-04 11:27:18 sửa đổi lần cuối: 2025-07-04 11:27:18
sao chép: 9 Số nhấp chuột: 259
2
tập trung vào
319
Người theo dõi

Chiến lược giao dịch khối lượng tương đối phần trăm động lượng Chiến lược giao dịch khối lượng tương đối phần trăm động lượng

Tổng quan

Chiến lược giao dịch tỷ lệ giao dịch tương đối là một hệ thống giao dịch tổng hợp kết hợp phân tích động lực giao dịch, lọc hành vi giá, phát hiện đột phá và logic dừng / dừng động. Cốt lõi của chiến lược là xác định thời điểm giao dịch mở rộng hoặc thu hẹp bằng cách tính toán các chỉ số tương tự như Williams % R của giao dịch tương đối (RVPR), kết hợp với bộ lọc kép linear (Fast and Slow Moving Average). Chiến lược này được thêm vào các điều kiện chính xác của trường hợp dựa trên các loại hình đồ thị của giao dịch khác nhau thông qua bộ lọc hành vi giá có thể cấu hình.

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

Nguyên tắc cốt lõi của chiến lược này là chuyển dữ liệu khối lượng giao dịch thành phần trăm, sử dụng phương pháp tính toán tương tự như Williams % R để phân tích mối quan hệ giữa khối lượng giao dịch hiện tại và phạm vi lịch sử của nó. Chiến lược sử dụng một số thành phần quan trọng để tạo tín hiệu giao dịch:

  1. Trình dao động giao dịch tương đối %R: so sánh khối lượng giao dịch hiện tại với mức cao nhất và thấp nhất trong lịch sử và tính toán vị trí tương đối. Chỉ số này tương tự như Williams %R trong lĩnh vực giá cả, nhưng áp dụng cho dữ liệu giao dịch.

  2. Bộ lọc đường trung bình di chuyển kép: Chiến lược sử dụng hai đường trung bình di chuyển giao dịch — nhanh và chậm, có thể chọn nhiều thuật toán mài dũa — SMA, EMA, JMA, T3, Super Smoother, v.v.. Khi giao dịch lớn hơn đường trung bình nhanh và đường trung bình nhanh lớn hơn đường trung bình chậm, cho thấy xu hướng giao dịch tăng lên, có thể là một tín hiệu đa; ngược lại.

  3. Bộ lọc hành vi giá: Chọn thêm các tín hiệu giao dịch dựa trên các hình dạng biểu đồ khác nhau:

    • Mô hình đơn giản: tăng/giảm cơ bản
    • Phương thức lọc: xác nhận cường độ dựa trên phạm vi
    • Mô hình cực đoan: đột phá dựa trên động lực
    • Mô hình nội bộ: Hình dạng xoay ngược
  4. Bỏ qua bộ lọc: chọn lọc loại trừ giao dịch gần điểm cao/thấp của 5 ngã để tránh giao dịch có rủi ro kém hơn so với lợi nhuận.

  5. Hệ thống dừng và dừng: Cơ chế dừng / dừng động dựa trên ATR (trung lượng sóng thực trung bình), có thể được cấu hình nhân để điều chỉnh khoảng cách dừng và dừng.

  6. Thời gian thoát: Có thể chọn thoát khỏi giao dịch sau một số lượng thanh cố định.

Các điều kiện đầu vào đa đầu bao gồm: khối lượng giao dịch lớn hơn trung bình di chuyển nhanh, trung bình di chuyển nhanh lớn hơn trung bình di chuyển chậm, khối lượng giao dịch tương đối% R lớn hơn ngưỡng, giá vượt qua bộ lọc hướng đa đầu, và có thể thấp hơn điểm đột phá gần đây. Điều kiện đầu vào không đầu vào ngược lại, và kích hoạt vị trí immobilization khi điều kiện thoát được đặt.

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

  1. Phân tích đa chiều: Chiến lược này kết hợp khối lượng giao dịch, hành vi giá và động thái dừng / dừng để cung cấp một khuôn khổ phân tích thị trường toàn diện.

  2. Độ cao có thể tùy chỉnh: Chiến lược cung cấp nhiều tham số có thể điều chỉnh, bao gồm kiểm soát hướng giao dịch, chế độ lọc hành vi giá khác nhau, lựa chọn loại trung bình di chuyển khối lượng giao dịch, cho phép thương nhân tùy chỉnh theo phong cách và sở thích của mình.

  3. Bộ lọc đầu vào thông minh: Bằng cách kết hợp động lực giao dịch và mô hình hành vi giá, chiến lược có thể xác định cơ hội giao dịch có xác suất cao hơn và tránh tín hiệu giao dịch kém chất lượng.

  4. Cơ chế thoát linh hoạt: Chiến lược cung cấp các lựa chọn thoát dựa trên thời gian và giá cả, bao gồm thoát số thanh cố định và dừng / dừng động dựa trên ATR, giúp quản lý rủi ro linh hoạt hơn và hiệu quả hơn.

  5. Khả năng thích ứng với nhiều môi trường thị trường: Chiến lược có thể thích ứng với các điều kiện thị trường khác nhau, bao gồm xu hướng và thị trường phân đoạn, thông qua các mô hình hành vi giá khác nhau (đơn giản, lọc, tích cực, nội bộ).

  6. Tích hợp các chỉ số kỹ thuật cao: Chiến lược tích hợp nhiều loại moving average cao như JMA, T3 và Super Smoother, những chỉ số này hoạt động tốt trong việc giảm tiếng ồn và nắm bắt xu hướng thực sự.

Rủi ro chiến lược

  1. Rủi ro tối ưu hóa tham số: do chiến lược chứa nhiều tham số có thể điều chỉnh, có nguy cơ tối ưu hóa quá mức, có thể dẫn đến hiệu suất trắc nghiệm lịch sử tuyệt vời nhưng hiệu quả thực tế kém. Giải pháp là sử dụng thử nghiệm tiến bộ và phân tích robustness để đảm bảo tham số có thể duy trì sự ổn định trong các điều kiện thị trường khác nhau.

  2. Rủi ro phá vỡ giả: Sự đột phá về khối lượng giao dịch không phải lúc nào cũng đi kèm với xu hướng giá bền vững, chiến lược có thể tạo ra tín hiệu sai trong phá vỡ giả. Rủi ro này có thể được giảm thiểu bằng cách thêm các chỉ số xác nhận bổ sung hoặc trì hoãn nhập cảnh.

  3. Sự phụ thuộc vào môi trường thị trường: Chiến lược có thể không hoạt động phù hợp trong các môi trường thị trường khác nhau (ví dụ như biến động cao so với biến động thấp).

  4. Nguy cơ kích hoạt dừng lỗ: Việc sử dụng dừng dựa trên ATR có thể được kích hoạt khi biến động đột ngột mở rộng. Xem xét sử dụng nhân số dừng lỗ điều chỉnh biến động hoặc đặt dừng lỗ ở mức hỗ trợ / kháng cự quan trọng có thể hiệu quả hơn.

  5. Thời gian thoát không linh hoạt: Quá trình thoát số thanh cố định có thể đóng giao dịch có lợi nhuận quá sớm hoặc đóng giao dịch thua lỗ quá muộn. Thời gian thoát có thể được cân nhắc để điều chỉnh động lực kết hợp với xu hướng hoặc chỉ số động lực.

  6. Tính phức tạp của tính toán: Chiến lược sử dụng nhiều thuật toán trung bình di chuyển phức tạp và các kết hợp điều kiện có thể làm tăng gánh nặng tính toán và dẫn đến chậm trễ trong thực hiện. Trong giao dịch thời gian thực, có thể cần phải đơn giản hóa một số chỉ số chuyên sâu về tính toán.

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

  1. Điều chỉnh ngưỡng động: Chiến lược hiện tại sử dụng ngưỡng R% của khối lượng giao dịch tương đối cố định ((27), có thể xem xét việc thực hiện ngưỡng thích ứng, điều chỉnh tự động dựa trên biến động khối lượng giao dịch gần đây. Điều này sẽ giúp chiến lược thích ứng tốt hơn với các điều kiện thị trường khác nhau và sự thay đổi theo mùa.

  2. Xác nhận nhiều khung thời gian: Tiết xuất tín hiệu xác nhận của khung thời gian cao hơn, chỉ giao dịch theo hướng xu hướng lớn hơn, có thể cải thiện tỷ lệ chiến thắng và tỷ lệ lợi nhuận rủi ro của chiến lược. Ví dụ, tín hiệu đa đầu trên đường giờ chỉ được thực hiện khi đường ngày xu hướng lên.

  3. Phân tích chất lượng giao dịch: Ngoài khối lượng giao dịch tương đối, bạn có thể thêm các chỉ số phân tán giao dịch hoặc phân tích phân phối khối lượng giao dịch để đánh giá chất lượng giao dịch chứ không chỉ là số lượng. Điều này giúp phân biệt giữa xác nhận khối lượng giao dịch theo xu hướng khỏe mạnh và tín hiệu cạn kiệt tiềm ẩn.

  4. Ngăn chặn / dừng thông minh: Ngăn chặn / dừng cơ bản của ATR hiện tại có thể được cải tiến thành hệ thống thông minh hơn, chẳng hạn như dừng dựa trên vị trí hỗ trợ / kháng cự quan trọng hoặc sử dụng dừng điều chỉnh biến động, thắt chặt dừng trong thời gian biến động thấp và nới lỏng dừng trong thời gian biến động cao.

  5. Kết hợp cấu trúc thị trường: tích hợp phân tích cấu trúc giá (như hỗ trợ / kháng cự, đường xu hướng, kênh giá) vào chiến lược có thể cải thiện chất lượng điểm vào và điểm thoát.

  6. Quản lý rủi ro được tăng cường: thực hiện điều chỉnh kích thước vị trí động, dựa trên biến động thị trường hiện tại và hiệu suất chiến lược gần đây, tăng vị trí trong môi trường có tỷ lệ thắng cao và giảm vị trí trong thời gian không chắc chắn.

  7. Tích hợp học máy: Sử dụng thuật toán học máy để tối ưu hóa động các tham số chiến lược hoặc dự đoán bộ lọc hành vi giá nào hiệu quả nhất trong điều kiện thị trường hiện tại, có thể cải thiện hơn nữa hiệu suất chiến lược.

Tóm tắt

Chiến lược giao dịch động lượng phần trăm giao dịch tương đối là một hệ thống giao dịch toàn diện và linh hoạt, cung cấp cho các nhà giao dịch một công cụ mạnh mẽ để xác định cơ hội thị trường tiềm năng bằng cách kết hợp phân tích khối lượng giao dịch, nhiều bộ lọc hành vi giá và công nghệ quản lý rủi ro động. Điểm mạnh cốt lõi của chiến lược này là tính linh hoạt và khả năng tùy chỉnh, cho phép các nhà giao dịch điều chỉnh theo sở thích cá nhân và điều kiện thị trường.

Chiến lược này đặc biệt phù hợp cho các nhà giao dịch tìm kiếm tín hiệu đảo ngược hoặc tiếp tục xu hướng dựa trên xác nhận khối lượng giao dịch. Bằng cách sử dụng chỉ số khối lượng giao dịch tương đối theo phong cách của Williams % R, chiến lược có thể xác định các điểm tăng khối lượng giao dịch, thường đại diện cho sự thay đổi quan trọng trong tâm trạng thị trường hoặc tăng tốc xu hướng.

Mặc dù chiến lược này cung cấp nhiều lợi thế, các nhà giao dịch nên chú ý đến rủi ro tối ưu hóa quá mức tiềm ẩn và sự phụ thuộc vào môi trường thị trường. Bằng cách liên tục thử nghiệm và điều chỉnh, kết hợp với hướng tối ưu hóa được đề xuất, các nhà giao dịch có thể tăng cường thêm sự ổn định và khả năng sinh lợi lâu dài của chiến lược này. Cuối cùng, như tất cả các chiến lược giao dịch, chìa khóa để thành công nằm ở sự hiểu biết sâu sắc về nguyên tắc của nó, quản lý rủi ro một cách khôn ngoan và liên tục đánh giá hiệu suất của nó trong các điều kiện thị trường khác nhau.

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

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

//@version=6
strategy("Relative Volume Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// === Input: Trade Direction === //
tradeDirection = input.string("Long Only", title="Trade Direction", options=["Long Only", "Short Only", "Both"], group="Strategy Settings")
dirBarModeL     = input.string("Simple", title="Long Directional Bar Mode", options=["Simple", "Filtered", "Aggressive", "Inside", "Filtered & Aggressive", "Filtered & Aggressive & Inside", "Without"], group="Strategy Settings")
dirBarModeS     = input.string("Inside", title="Short Directional Bar Mode", options=["Simple", "Filtered", "Aggressive", "Inside", "Filtered & Aggressive", "Filtered & Aggressive & Inside", "Without"], group="Strategy Settings")
useBreakout  = input.bool(true, "Use Breakout Filter", group="Strategy Settings")
useSLTP = input.bool(false, "Use Stop Loss & Take Profit", group="Strategy Settings")
atrSLMult = input.float(1, "ATR SL Multiplier", step = 0.05, group="Strategy Settings")
atrTPMult = input.float(1.75, "ATR TP Multiplier", step = 0.05, group="Strategy Settings")


// === Input: MA Function Selector === //
// — T3 Moving Average Function —
// src    = input source (e.g. rsi1, close, etc.)
// length = smoothing length (period)
// a      = T3 alpha (commonly between 0.7 and 0.9)
t3(src, length, a) =>
    e1 = ta.ema(src, length)
    e2 = ta.ema(e1, length)
    e3 = ta.ema(e2, length)
    e4 = ta.ema(e3, length)
    e5 = ta.ema(e4, length)
    e6 = ta.ema(e5, length)
    c1 = -a * a * a
    c2 = 3 * a * a + 3 * a * a * a
    c3 = -6 * a * a - 3 * a - 3 * a * a * a
    c4 = 1 + 3 * a + a * a * a + 3 * a * a
    c1 * e6 + c2 * e5 + c3 * e4 + c4 * e3

// == Jurik MA == //
jma(float src, int length, float power, float phase) => 
    phaseRatio = phase < -100 ? 0.5 : phase > 100 ? 2.5 : phase / 100 + 1.5
    beta = 0.45 * (length - 1) / (0.45 * (length - 1) + 2)
    alpha = math.pow(beta, power)
    JMA = 0.0
    e0 = 0.0
    e0 := (1 - alpha) * src + alpha * nz(e0[1])
    e1 = 0.0
    e1 := (src - e0) * (1 - beta) + beta * nz(e1[1])
    e2 = 0.0
    e2 := (e0 + phaseRatio * e1 - nz(JMA[1])) * math.pow(1 - alpha, 2) + math.pow(alpha, 2) * nz(e2[1])
    JMA := e2 + nz(JMA[1])

//===== 2 Pole Super Smoother Filter =====//
superSmoother(float Series, float Period) =>
    var float ALPHA =  math.pi * math.sqrt(2.0) / Period
    var float BETA  =  math.exp(-ALPHA )
    var float COEF2 = -math.pow(BETA, 2)
    var float COEF1 =  math.cos( ALPHA ) * 2.0 * BETA
    var float COEF0 =  1.0 - COEF1 - COEF2
    float sma2   = math.avg(Series, nz(Series[1], Series))
    float smooth = na, smooth := COEF0 *      sma2      +
                                 COEF1 *  nz(smooth[1]) +
                                 COEF2 *  nz(smooth[2])

// === MA Selector === //
ma(source, length, type) =>
    type == "SMA"       ? ta.sma(source, length) :
     type == "EMA"       ? ta.ema(source, length) :
     type == "SMMA (RMA)"? ta.rma(source, length) :
     type == "WMA"       ? ta.wma(source, length) :
     type == "VWMA"      ? ta.vwma(source, length) :
     type == "HMA"       ? ta.hma(source, length) : 
     type == "ALMA"      ? ta.alma(source, length, 0.85, 6) :
     type == "LSMA"      ? ta.linreg(source, length, 0) :
     type == "Optimal MA"? math.avg(ta.alma(source, length, 0.85, 6), ta.rma(source, length), ta.sma(source, length)) :
     type == "JMA"       ? jma(source, length, 2, 50) :        
     type == "Super Smoother" ? superSmoother(source, length) :
     type == "T3"        ? t3(source, length, 0.7) :
                          na

// === Input Parameters === //
rvolRLength       = input.int(112, title="Relative Volume %R Length", minval=1, group="Relative Volume", tooltip="%R used for scaling from 0 to 100, I prefer 73 or 112.")
rvolmaTypeInput   = input.string("Optimal MA" , "Type", options = ["None", "SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA", "HMA", "ALMA", "LSMA", "Optimal MA", "JMA", "Super Smoother", "T3"], group = "Relative Volume")
rvolFastLength    = input.int(7, title="Relative Volume Fast MA", minval=1, group="Relative Volume")
rvolSlowLength    = input.int(161, title="Relative Volume Slow MA", minval=1, group="Relative Volume")
exitBars          = input.int(18, title="Bars Until Exit", group="Strategy Settings", tooltip="Exit trade after N bars")
rvolThreshold = input.int(27, "Minimum Relative Volume %R Threshold", group="Relative Volume")

// === Williams %R for Volume === //
wpr(src, length) =>
    max_ = ta.highest(src, length)
    min_ = ta.lowest(src, length)
    (100 * (src - max_) / (max_ - min_)) * -1

// === Volume MAs === //
rvol      = wpr(volume, rvolRLength)
rvolFast  = ma(volume, rvolFastLength, rvolmaTypeInput)
rvolSlow  = ma(volume, rvolSlowLength, rvolmaTypeInput)

// === Price Action Filters === //
up            = close > open
upRange       = low > low[1] and close > high[1]
upRange_Aggr  = close > close[1] and close > open[1]
insideDayUp   = close < close[1] and close[1] < close[2] and close[2] < close[3] and close[3] < close[4] and close[4] < close[5] //and not (close > close[1])
down          = close < open
downRange     = high < high[1] and close < low[1]
downRange_Aggr= close < close[1] and close < open[1]
insideDayDown = close > close[1] and close[1] > close[2] and close[2] > close[3] and close[3] > close[4] and close[4] > close[5] //and not (close < close[1])
breakoutHigh = ta.highest(high, 5)
breakoutLow  = ta.lowest(low, 5)

// === Mode-Based Filter Logic === //
longBarOK =
     dirBarModeL == "Simple" ? up :
     dirBarModeL == "Filtered"  ? upRange :
     dirBarModeL == "Aggressive"? upRange_Aggr :
     dirBarModeL == "Inside"? insideDayUp : 
     dirBarModeL == "Filtered & Aggressive" ? upRange or upRange_Aggr :
     dirBarModeL == "Filtered & Aggressive & Inside" ? upRange or upRange_Aggr or insideDayUp :
     dirBarModeL == "Without"   ? true : false

shortBarOK =
     dirBarModeS == "Simple" ? down :
     dirBarModeS == "Filtered"  ? downRange :
     dirBarModeS == "Aggressive"? downRange_Aggr :
     dirBarModeS == "Inside"? insideDayDown :
     dirBarModeS == "Filtered & Aggressive"? downRange or downRange_Aggr or insideDayDown :
     dirBarModeS == "Filtered & Aggressive & Inside"? upRange_Aggr or insideDayDown :
     dirBarModeS == "Without"   ? true : false

// === Entry & Exit Logic === //
longCondition  = volume > rvolFast and rvolFast > rvolSlow and longBarOK  and rvol > rvolThreshold and (not useBreakout or close < breakoutHigh)
shortCondition = volume < rvolFast and rvolFast < rvolSlow and shortBarOK and rvol < (100 - rvolThreshold) and (not useBreakout or close > breakoutLow)

exitLongCondition  = strategy.opentrades > 0 and strategy.opentrades.entry_bar_index(0) + exitBars <= bar_index and strategy.opentrades.entry_id(0) == "Long"
exitShortCondition = strategy.opentrades > 0 and strategy.opentrades.entry_bar_index(0) + exitBars <= bar_index and strategy.opentrades.entry_id(0) == "Short"

atr = ta.atr(math.round(math.avg(rvolFastLength, rvolSlowLength)))
longSL = useSLTP ? close - atrSLMult * atr : na
longTP = useSLTP ? close + atrTPMult * atr : na
shortSL = useSLTP ? close + atrSLMult * atr : na
shortTP = useSLTP ? close - atrTPMult * atr : na

// === Strategy Execution === //
if (tradeDirection == "Long Only" or tradeDirection == "Both")
    if (longCondition)
        strategy.entry("Long", strategy.long, stop=longSL, limit=longTP)

if (tradeDirection == "Short Only" or tradeDirection == "Both")
    if (shortCondition)
        strategy.entry("Short", strategy.short, stop=shortSL, limit=shortTP)

if (exitLongCondition)
    strategy.close("Long")

if (exitShortCondition)
    strategy.close("Short")

// === Plotting === //
plot(rvol, title="Relative Volume %R", color=color.orange, style = plot.style_columns, format = format.price)
plot(rvolFast, title="Fast Volume MA", color=color.green, format = format.volume)
plot(rvolSlow, title="Slow Volume MA", color=color.red, format = format.volume)