Chiến lược tín hiệu Rolling CVDVWAP được neo

Tác giả:ChaoZhang, Ngày: 2023-12-29 14:56:03
Tags:

img

Tổng quan

Chiến lược tín hiệu Anchored Rolling CVDVWAP là một chỉ số phân tích kỹ thuật phức tạp được thiết kế cho nền tảng TradingView. Nó tích hợp các khái niệm về Giá trung bình trọng số Anchored Volume (VWAP), Volume Delta tích lũy (CVD) và phân tích lệch chuẩn để tạo ra các tín hiệu nhập và xuất cho giao dịch.

Chiến lược logic

Cốt lõi của chiến lược này là tính toán một VWAP neo, bắt đầu tính toán VWAP từ một thanh neo cụ thể có khối lượng cao nhất trong một khoảng thời gian được xác định bởi người dùng. Sau đó, một dải phong bì được tính toán thông qua độ lệch chuẩn được vẽ dựa trên VWAP neo này để phản ánh các khu vực mua quá mức / bán quá mức. Trong khi đó, chỉ số Rate of Change (ROC) phát hiện các mẫu dipsrips kết hợp với các tín hiệu lọc CVD để tạo ra tín hiệu mua và bán.

Ưu điểm

  1. Sử dụng giá trung bình theo khối lượng để xác định các khu vực giá trị và mức hỗ trợ / kháng cự
  2. Các dải bao bì độ lệch chuẩn làm nổi bật các biến động giá quá dài
  3. Chỉ số khối lượng CVD phản ánh áp lực mua/bán cơ bản
  4. Các tín hiệu vào và ra rõ ràng
  5. Auto stop loss và take profit để quản lý rủi ro

Phân tích rủi ro

  1. Cài đặt tham số không chính xác có thể gây ra các giao dịch bị bỏ lỡ hoặc tín hiệu không hợp lệ
  2. Cần kết hợp với nhiều chỉ số hơn để ra quyết định thay vì sử dụng một mình
  3. Cần tối ưu hóa cho các sản phẩm và khung thời gian khác nhau
  4. Định vị dừng lỗ và lấy lợi nhuận kém mang lại tổn thất lớn hơn

Hướng dẫn tối ưu hóa

  1. Điều chỉnh logic chọn thanh neo với đường trung bình động v.v.
  2. Thử các số lần lệch chuẩn khác nhau cho các dải phong bì
  3. Tối ưu hóa các tham số ROC để phù hợp với các đặc điểm biến động
  4. Thiết lập trượt động hoặc dừng thích nghi cho thị trường biến động

Kết luận

Chiến lược tín hiệu Rolling CVDVWAP Anchored tổng hợp các chỉ số khác nhau để đánh giá hành động giá và đà mua / bán, rất hữu ích để khám phá các cơ hội giao dịch.


/*backtest
start: 2022-12-28 00:00:00
end: 2023-12-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Anchored Rolling CVDVWAP Signal Strategy', overlay=true)

// User-defined settings
vwapAnchorPeriod = input.int(20, title="Rolling VWAP Anchor Period", group="Settings")
stdDevMult = input.float(2.0, title="Standard Deviation Multiplier for Envelope", group="Settings")
analysis_period = input.int(7, minval=1, maxval=100, title="Analysis Period", group="Settings")
useVwapFilter = input.bool(true, title="Use Anchored VWAP Filter", group="Filters")
useCvdFilter = input.bool(true, title="Use CVD Filter", group="Filters")
cvdLength = input.int(20, title="CVD Length", group="Filters")
tpPercent = input.float(200.0, title="Take Profit % of SL Distance", group="Trade Settings")
slPeriods = input.int(200, title="Stop Loss Lookback Period", group="Trade Settings")
toggleSignals = input.bool(false, title="Toggle Signals", group="Settings")

// Finding the anchor bar
highestVol = ta.highest(volume, vwapAnchorPeriod)
var int anchorBar = na
if volume == highestVol
    anchorBar := bar_index

// Initializing variables for anchored VWAP and envelope calculation
var float avwapNumerator = na
var float avwapDenominator = na
var float anchoredVwap = na
var float sum = 0.0
var int count = 0
var float sumDev = 0.0

// Calculating Anchored VWAP and envelope
if not na(anchorBar)
    if bar_index == anchorBar
        avwapNumerator := high * volume + low * volume + close * volume
        avwapDenominator := volume * 3
        sum := 0.0
        count := 0
        sumDev := 0.0
    else if bar_index > anchorBar
        avwapNumerator := avwapNumerator[1] + high * volume + low * volume + close * volume
        avwapDenominator := avwapDenominator[1] + volume * 3
        sum := sum[1] + close
        count := count[1] + 1
        sumDev := sumDev[1] + math.pow(close - (sum / count), 2)
    anchoredVwap := avwapNumerator / avwapDenominator

// Standard deviation envelope calculation
float mean = sum / math.max(count, 1)
float stDev = math.sqrt(sumDev / math.max(count, 1))
float upperBand = anchoredVwap + stdDevMult * stDev
float lowerBand = anchoredVwap - stdDevMult * stDev

// CVD calculation and filter application
cvd = ta.cum(volume - ta.sma(volume, cvdLength))
bool cvdCondition = useCvdFilter ? (cvd[1] < cvd and cvd > cvd[1]) : true

// Dip and Rip pattern detection
roc = ta.roc(close, analysis_period)
dip_move_value = input.float(-8, title="Down (%)", step=0.50, minval=-100, maxval=-0.01, group="Settings")
rip_move_value = input.float(8, title="Up (%)", step=0.50, minval=0.01, maxval=100.00, group="Settings")
dip = roc <= dip_move_value and cvdCondition and (not useVwapFilter or close < anchoredVwap)
rip = roc >= rip_move_value and cvdCondition and (not useVwapFilter or close > anchoredVwap)

// State variables for signals and TP/SL execution
var bool inTrade = false // If we are currently in a trade
var bool takeLong = false // If the last signal was a buy
var bool takeShort = false // If the last signal was a sell
var float tradeEntryPrice = na // The trade entry price
var float tradeSL = na // The current trade's Stop Loss level
var float tradeTP = na // The current trade's Take Profit level

// Setting SL and TP levels for the trade
tradeSL := dip ? ta.highest(high, slPeriods) : (rip ? ta.lowest(low, slPeriods) : tradeSL)
tradeTP := dip ? tradeEntryPrice - (tradeSL - tradeEntryPrice) * tpPercent / 100 : (rip ? tradeEntryPrice + (tradeEntryPrice - tradeSL) * tpPercent / 100 : tradeTP)

// Trade entry logic
if (dip or rip) and not inTrade
    tradeEntryPrice := close
    inTrade := true
    takeLong := rip
    takeShort := dip

// Trade exit logic at TP or SL
if inTrade and ((takeLong and (low < tradeSL or high > tradeTP)) or (takeShort and (high > tradeSL or low < tradeTP)))
    inTrade := false // Exit the trade

// Display logic for signals based on the toggle
bool showLongSignal = rip and (not toggleSignals or not takeLong)
bool showShortSignal = dip and (not toggleSignals or not takeShort)

// Reset signals if toggle is active and trade is exited
if toggleSignals and not inTrade
    takeLong := true
    takeShort := true

// Strategy entry and exit logic
if showLongSignal
    strategy.entry("Long", strategy.long)

if showShortSignal
    strategy.close("Long")

if showShortSignal
    strategy.entry("Short", strategy.short)

if showLongSignal
    strategy.close("Short")

// Plotting of entry signals, anchored VWAP, and envelope
plot(upperBand, title="Upper Envelope", color=color.green)
plot(lowerBand, title="Lower Envelope", color=color.red)
plot(anchoredVwap, title="Anchored VWAP", color=color.blue)

// Coloring and shapes for Dip and Rip
barcolor(dip ? color.rgb(255, 0, 0) : na, title="Down Bar Color")
bgcolor(dip ? color.rgb(255, 0, 0, 80) : na, title="Down Background Color")
plotshape(dip, title="Dip - Down", location=location.top, color=color.rgb(255, 82, 82, 45), style=shape.square, size=size.tiny)
barcolor(rip ? color.rgb(0, 255, 0) : na, title="Up Bar Color")
bgcolor(rip ? color.rgb(0, 255, 0, 80) : na, title="Up Background Color")
plotshape(rip, title="Rip - Up", location=location.top, color=color.rgb(76, 175, 79, 55), style=shape.square, size=size.tiny)

// Strategy exit conditions for TP and SL
strategy.exit("Take Profit Long", from_entry = "Long", limit = tradeTP)
strategy.exit("Stop Loss Long", from_entry = "Long", stop = tradeSL)
strategy.exit("Take Profit Short", from_entry = "Short", limit = tradeTP)
strategy.exit("Stop Loss Short", from_entry = "Short", stop = tradeSL)

Thêm nữa