Chiến lược tín hiệu dựa trên CVDVWAP lăn neo


Ngày tạo: 2023-12-29 14:56:03 sửa đổi lần cuối: 2023-12-29 14:56:03
sao chép: 1 Số nhấp chuột: 826
1
tập trung vào
1621
Người theo dõi

Chiến lược tín hiệu dựa trên CVDVWAP lăn neo

Tổng quan

Chiến lược tín hiệu dựa trên CVDVWAP cuộn cố định là một chỉ số phân tích kỹ thuật phức tạp được thiết kế trên nền tảng TradingView. Nó tích hợp các khái niệm về giá trung bình cân bằng giao dịch cuộn cố định (VWAP), giao dịch tích lũy (CVD) và phân tích chênh lệch tiêu chuẩn để tạo tín hiệu nhập và thoát giao dịch.

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

Cốt lõi của chiến lược này là tính toán một VWAP cố định, bắt đầu từ một cột cột cố định cụ thể, cột này là cột có khối lượng giao dịch lớn nhất trong một chu kỳ được định nghĩa bởi người dùng. Sau đó, dựa trên VWAP cố định này, vẽ một dải bao bì được tính toán thông qua chênh lệch tiêu chuẩn, phản ánh khu vực quá mua.

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

  1. Các vùng giá trị và mức hỗ trợ/kháng cự sử dụng giá trung bình có trọng lượng giao dịch để xác định giá
  2. Tiêu chuẩn phân biệt bao gồm các giá cao trong trường hợp giá bán quá mức
  3. Chỉ số giao dịch CVD phản ánh áp lực mua bán
  4. Điểm tín hiệu xuất nhập rõ ràng
  5. Tự động thiết lập mức dừng lỗ và dừng lại, hỗ trợ quản lý rủi ro

Phân tích rủi ro

  1. Thiết lập tham số không đúng có thể dẫn đến cơ hội giao dịch bị bỏ lỡ hoặc tạo ra tín hiệu không hiệu quả
  2. Cần kết hợp nhiều chỉ số hơn để đưa ra quyết định, không thể sử dụng một mình
  3. Các tham số cần được tối ưu hóa thích hợp để phù hợp với các giống và chu kỳ khác nhau
  4. Định vị dừng và dừng không đúng có thể dẫn đến tổn thất lớn

Hướng tối ưu hóa

  1. Điều chỉnh logic chọn cột cố định để tính toán VWAP, chẳng hạn như kết hợp phán quyết bằng phẳng
  2. Thử các thiết lập envelope con đai khác nhau
  3. Tối ưu hóa các tham số của ROC để phù hợp với tính năng dao động của giống
  4. Thiết lập điểm trượt động hoặc dừng thích ứng để đối phó với biến động mạnh của thị trường

Tóm tắt

Các chiến lược tín hiệu dựa trên CVDVWAP tròn cố định sử dụng nhiều chỉ số để đánh giá xu hướng giá và sức mạnh mua bán, rất hữu ích để phát hiện cơ hội giao dịch. Tuy nhiên, vẫn cần thận trọng và cần được kiểm tra và tối ưu hóa liên tục để phù hợp với chiến lược giao dịch của riêng bạn.

Mã nguồn chiến lược
/*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)