Strategi isyarat berdasarkan CVDVWAP rolling berlabuh


Tarikh penciptaan: 2023-12-29 14:56:03 Akhirnya diubah suai: 2023-12-29 14:56:03
Salin: 1 Bilangan klik: 826
1
fokus pada
1621
Pengikut

Strategi isyarat berdasarkan CVDVWAP rolling berlabuh

Gambaran keseluruhan

Strategi isyarat berdasarkan pegangan bergulir CVDVWAP adalah petunjuk analisis teknikal yang kompleks yang direka pada platform TradingView. Ia mengintegrasikan konsep pegangan pegangan bergulir purata harga bertimbangan ((VWAP), bergulir berkumulatif ((CVD) dan analisis perbezaan piawai untuk menghasilkan isyarat masuk dan keluar dagangan.

Prinsip Strategi

Strategi ini berpusat pada pengiraan VWAP yang ditetapkan, iaitu VWAP yang bermula dari satu tiang pijakan yang ditetapkan yang mempunyai jumlah dagangan tertinggi dalam satu kitaran yang ditentukan oleh pengguna. Kemudian, berdasarkan VWAP yang ditetapkan ini, sebuah jalur rangkaian yang dikira melalui perbezaan piawaian dipetakan, yang mencerminkan kawasan yang lebih banyak dibeli.

Kelebihan Strategik

  1. Kawasan nilai dan tahap sokongan / rintangan yang digunakan untuk menentukan harga dengan menggunakan purata harga bertimbangan kuantiti
  2. Harga Standard Disparity Belt Highlight memasuki keadaan overbuying dan overselling
  3. Indeks CVD menunjukkan tekanan jual beli
  4. Pintu masuk dan keluar yang jelas
  5. Tetapan Stop Loss dan Stop Loss secara automatik untuk membantu pengurusan risiko

Analisis risiko

  1. Tetapan parameter yang tidak betul boleh menyebabkan peluang perdagangan yang hilang atau menghasilkan isyarat yang tidak sah
  2. Lebih banyak penunjuk diperlukan untuk membuat keputusan dan tidak boleh digunakan secara bersendirian
  3. Parameter yang perlu dioptimumkan dengan betul untuk menyesuaikan diri dengan pelbagai jenis dan kitaran
  4. Penetapan yang tidak betul pada kedudukan berhenti dan berhenti boleh menyebabkan kerugian yang lebih besar

Arah pengoptimuman

  1. Menyesuaikan logik pilihan tiang penyokong untuk mengira VWAP, seperti penghakiman gabungan
  2. Cuba setup envelope padding yang berbeza dengan perkalian standard
  3. Optimumkan parameter ROC untuk menyesuaikan ciri kadar turun naik varieti
  4. Menetapkan titik slippage dinamik atau berhenti beradaptasi untuk menghadapi turun naik pasaran yang kuat

ringkaskan

Strategi isyarat berdasarkan pegangan bergulir CVDVWAP menggunakan pelbagai indikator untuk menentukan pergerakan harga dan kekuatan jual beli, sangat membantu untuk mencari peluang perdagangan. Tetapi masih perlu digunakan dengan berhati-hati, perlu terus diuji dan dioptimumkan untuk digunakan dengan strategi perdagangan sendiri.

Kod sumber strategi
/*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)