Chiến lược giao dịch định lượng phân kỳ CVD


Ngày tạo: 2024-03-15 16:47:47 sửa đổi lần cuối: 2024-03-15 16:47:47
sao chép: 0 Số nhấp chuột: 1606
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch định lượng phân kỳ CVD

Ghi chú chiến lược: Chiến lược giao dịch định lượng CVD này sử dụng chỉ số CVD với sự biến động của giá để nắm bắt tín hiệu đảo ngược xu hướng tiềm năng. Chiến lược sẽ tính toán chỉ số CVD và so sánh với giá để xác định xem có hình thành đà tăng hay giảm không.

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

  1. Tính toán chỉ số CVD: Tính toán chỉ số CVD và trung bình di chuyển của nó dựa trên khối lượng giao dịch nhiều đầu và khối lượng giao dịch trống.
  2. Xác định sai lệch: Xác định xem có sai lệch nào được hình thành bằng cách so sánh các điểm cao thấp của chỉ số CVD với các điểm cao thấp của giá cả.
    • Sự thay đổi của giá cả: Tỷ lệ đổi mới thấp, nhưng chỉ số CVD hình thành mức thấp cao hơn
    • Các nhà đầu tư ẩn dấu: Giá sáng tạo cao, nhưng chỉ số CVD hình thành điểm thấp hơn
    • Phản ứng của các nhà đầu tư: Giá có mức cao mới, nhưng chỉ số CVD hình thành mức cao thấp hơn
    • Hình ảnh giảm giá ẩn: Tỷ lệ đổi mới giá thấp, nhưng chỉ số CVD hình thành điểm cao cao hơn
  3. Bỏ vị trí: Khi nhận ra tín hiệu sai lệch, mở thêm hoặc bỏ trống tùy thuộc vào loại sai lệch.
  4. Chấm lỗ: sử dụng dừng di động và dừng phần trăm cố định. Giá dừng được tính dựa trên giá mở vị trí nhân phần trăm dừng lỗ, giá dừng được tính dựa trên giá mở vị trí nhân phần trăm dừng.
  5. Đặt cược kim tự tháp: Chiến lược cho phép đặt cược kim tự tháp lên đến 3 vị trí.

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

  1. Tín hiệu đảo ngược xu hướng: CVD deviation là một tín hiệu đảo ngược xu hướng có hiệu quả, có thể giúp nắm bắt cơ hội đảo ngược xu hướng.
  2. Tín hiệu tiếp tục xu hướng: Hide deviation có thể hoạt động như một tín hiệu tiếp tục xu hướng, giúp chiến lược giữ đúng hướng trong xu hướng.
  3. Kiểm soát rủi ro: Kiểm soát rủi ro một cách hiệu quả bằng cách sử dụng Stop Loss di động và Stop Stop % cố định.
  4. Bảng xếp hạng kim tự tháp: cho phép nhiều vị trí xếp hạng để tận dụng tốt hơn các xu hướng.

Rủi ro chiến lược:

  1. Tác dụng của tín hiệu: Không hoàn toàn đáng tin cậy, đôi khi có tín hiệu giả.
  2. Thiết lập tham số: Kết quả chiến lược nhạy cảm với thiết lập tham số, các tham số khác nhau có thể dẫn đến kết quả khác nhau.
  3. Điểm trượt dừng lỗ: Trong trường hợp cực đoan, lệnh dừng lỗ có thể không được giao dịch theo giá dự kiến, gây ra rủi ro bổ sung.
  4. Chi phí giao dịch: Thường xuyên mở lỗ có thể dẫn đến chi phí giao dịch cao, ảnh hưởng đến lợi nhuận chiến lược.

Định hướng tối ưu hóa:

  1. Tối ưu hóa tham số động: Sử dụng tham số thích ứng với các điều kiện thị trường khác nhau để tăng hiệu quả tín hiệu.
  2. Kết hợp với các chỉ số khác: kết hợp với các chỉ số kỹ thuật khác như RSI, MACD, để tăng độ tin cậy tín hiệu.
  3. Cải thiện Stop Loss: Sử dụng các chiến lược Stop Loss cao hơn, chẳng hạn như Tracking Stop Loss, Stop Loss Volatility, v.v.
  4. Quản lý quy mô vị trí: Điều chỉnh quy mô vị trí theo biến động của thị trường, tài khoản tài chính.

Tóm lại: Chiến lược giao dịch số lượng CVD có thể được tăng cường hơn trong tương lai bằng cách tối ưu hóa các tham số động, kết hợp với các chỉ số khác, cải thiện các điểm dừng và quản lý quy mô lệnh. Nói chung, chiến lược giao dịch số lượng CVD là một chiến lược giao dịch hiệu quả và có thể tối ưu hóa, phù hợp với các nhà giao dịch số lượng xu hướng để nắm bắt cơ hội xu hướng đồng thời kiểm soát rủi ro.

Mã nguồn chiến lược
/*backtest
start: 2023-03-09 00:00:00
end: 2024-03-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

//@version=5
//@ mmattman

//Thank you to @ contrerae and Tradingview each for parts of the code to make 
//this indicator and matching strategy and also theCrypster for the clean concise TP/SL code.

// indicator(title="CVD Divergence Indicator 1", shorttitle='CVD Div1', format=format.price, timeframe="", timeframe_gaps=true)

strategy("CVD Divergence Strategy.1.mm", shorttitle = 'CVD Div Str 1', overlay=false)


//..................................................................................................................
// Inputs
periodMa = input.int(title='MA Length', minval=1, defval=20)
plotMa = input(title='Plot MA?', defval=false)

// Calculations (Bull & Bear Balance Indicator by Vadim Gimelfarb)
iff_1 = close[1] < open ? math.max(high - close[1], close - low) : math.max(high - open, close - low)
iff_2 = close[1] > open ? high - low : math.max(open - close[1], high - low)
iff_3 = close[1] < open ? math.max(high - close[1], close - low) : high - open
iff_4 = close[1] > open ? high - low : math.max(open - close[1], high - low)
iff_5 = close[1] < open ? math.max(open - close[1], high - low) : high - low
iff_6 = close[1] > open ? math.max(high - open, close - low) : iff_5
iff_7 = high - close < close - low ? iff_4 : iff_6
iff_8 = high - close > close - low ? iff_3 : iff_7
iff_9 = close > open ? iff_2 : iff_8
bullPower = close < open ? iff_1 : iff_9
iff_10 = close[1] > open ? math.max(close[1] - open, high - low) : high - low
iff_11 = close[1] > open ? math.max(close[1] - low, high - close) : math.max(open - low, high - close)
iff_12 = close[1] > open ? math.max(close[1] - open, high - low) : high - low
iff_13 = close[1] > open ? math.max(close[1] - low, high - close) : open - low
iff_14 = close[1] < open ? math.max(open - low, high - close) : high - low
iff_15 = close[1] > open ? math.max(close[1] - open, high - low) : iff_14
iff_16 = high - close < close - low ? iff_13 : iff_15
iff_17 = high - close > close - low ? iff_12 : iff_16
iff_18 = close > open ? iff_11 : iff_17
bearPower = close < open ? iff_10 : iff_18

// Calculations (Bull & Bear Pressure Volume)
bullVolume = bullPower / (bullPower + bearPower) * volume
bearVolume = bearPower / (bullPower + bearPower) * volume

// Calculations Delta
delta = bullVolume - bearVolume
cvd = ta.cum(delta)
cvdMa = ta.sma(cvd, periodMa)

// Plotting
customColor = cvd > cvdMa ? color.new(color.teal, 50) : color.new(color.red, 50)
plotRef1 = plot(cvd, style=plot.style_line, linewidth=1, color=color.new(color.yellow, 0), title='CVD')
plotRef2 = plot(plotMa ? cvdMa : na, style=plot.style_line, linewidth=1, color=color.new(color.white, 0), title='CVD MA')
fill(plotRef1, plotRef2, color=customColor)
//..................................................................................................................


// len = input.int(title="RSI Period", minval=1, defval=14)
// src = input(title="RSI Source", defval=close)
lbR = input(title="Pivot Lookback Right", defval=3)
lbL = input(title="Pivot Lookback Left", defval=7)
rangeUpper = input(title="Max of Lookback Range", defval=60)
rangeLower = input(title="Min of Lookback Range", defval=5)
plotBull = input(title="Plot Bullish", defval=true)
plotHiddenBull = input(title="Plot Hidden Bullish", defval=true)
plotBear = input(title="Plot Bearish", defval=true)
plotHiddenBear = input(title="Plot Hidden Bearish", defval=true)
bearColor = color.red
bullColor = color.green
hiddenBullColor = color.new(color.green, 80)
hiddenBearColor = color.new(color.red, 80)
textColor = color.white
noneColor = color.new(color.white, 100)
osc = cvd

// plot(osc, title="CVD", linewidth=2, color=#2962FF)
// hline(50, title="Middle Line", color=#787B86, linestyle=hline.style_dotted)
// obLevel = hline(70, title="Overbought", color=#787B86, linestyle=hline.style_dotted)
// osLevel = hline(30, title="Oversold", color=#787B86, linestyle=hline.style_dotted)
// fill(obLevel, osLevel, title="Background", color=color.rgb(33, 150, 243, 90))

plFound = na(ta.pivotlow(osc, lbL, lbR)) ? false : true
phFound = na(ta.pivothigh(osc, lbL, lbR)) ? false : true
_inRange(cond) =>
	bars = ta.barssince(cond == true)
	rangeLower <= bars and bars <= rangeUpper

//------------------------------------------------------------------------------
// Regular Bullish
// Osc: Higher Low

oscHL = osc[lbR] > ta.valuewhen(plFound, osc[lbR], 1) and _inRange(plFound[1])

// Price: Lower Low

priceLL = low[lbR] < ta.valuewhen(plFound, low[lbR], 1)
bullCondAlert = priceLL and oscHL and plFound
bullCond = plotBull and bullCondAlert

plot(
     plFound ? osc[lbR] : na,
     offset=-lbR,
     title="Regular Bullish",
     linewidth=2,
     color=(bullCond ? bullColor : noneColor)
     )

plotshape(
	 bullCond ? osc[lbR] : na,
	 offset=-lbR,
	 title="Regular Bullish Label",
	 text=" Bull ",
	 style=shape.labelup,
	 location=location.absolute,
	 color=bullColor,
	 textcolor=textColor
	 )

//------------------------------------------------------------------------------
// Hidden Bullish
// Osc: Lower Low

oscLL = osc[lbR] < ta.valuewhen(plFound, osc[lbR], 1) and _inRange(plFound[1])

// Price: Higher Low

priceHL = low[lbR] > ta.valuewhen(plFound, low[lbR], 1)
hiddenBullCondAlert = priceHL and oscLL and plFound
hiddenBullCond = plotHiddenBull and hiddenBullCondAlert

plot(
	 plFound ? osc[lbR] : na,
	 offset=-lbR,
	 title="Hidden Bullish",
	 linewidth=2,
	 color=(hiddenBullCond ? hiddenBullColor : noneColor)
	 )

plotshape(
	 hiddenBullCond ? osc[lbR] : na,
	 offset=-lbR,
	 title="Hidden Bullish Label",
	 text=" H Bull ",
	 style=shape.labelup,
	 location=location.absolute,
	 color=bullColor,
	 textcolor=textColor
	 )

//------------------------------------------------------------------------------
// Regular Bearish
// Osc: Lower High

oscLH = osc[lbR] < ta.valuewhen(phFound, osc[lbR], 1) and _inRange(phFound[1])

// Price: Higher High

priceHH = high[lbR] > ta.valuewhen(phFound, high[lbR], 1)

bearCondAlert = priceHH and oscLH and phFound
bearCond = plotBear and bearCondAlert

plot(
	 phFound ? osc[lbR] : na,
	 offset=-lbR,
	 title="Regular Bearish",
	 linewidth=2,
	 color=(bearCond ? bearColor : noneColor)
	 )

plotshape(
	 bearCond ? osc[lbR] : na,
	 offset=-lbR,
	 title="Regular Bearish Label",
	 text=" Bear ",
	 style=shape.labeldown,
	 location=location.absolute,
	 color=bearColor,
	 textcolor=textColor
	 )

//------------------------------------------------------------------------------
// Hidden Bearish
// Osc: Higher High

oscHH = osc[lbR] > ta.valuewhen(phFound, osc[lbR], 1) and _inRange(phFound[1])

// Price: Lower High

priceLH = high[lbR] < ta.valuewhen(phFound, high[lbR], 1)

hiddenBearCondAlert = priceLH and oscHH and phFound
hiddenBearCond = plotHiddenBear and hiddenBearCondAlert

plot(
	 phFound ? osc[lbR] : na,
	 offset=-lbR,
	 title="Hidden Bearish",
	 linewidth=2,
	 color=(hiddenBearCond ? hiddenBearColor : noneColor)
	 )

plotshape(
	 hiddenBearCond ? osc[lbR] : na,
	 offset=-lbR,
	 title="Hidden Bearish Label",
	 text=" H Bear ",
	 style=shape.labeldown,
	 location=location.absolute,
	 color=bearColor,
	 textcolor=textColor
	 )

// alertcondition(bullCondAlert, title='Regular Bullish CVD Divergence', message="Found a new Regular Bullish Divergence, `Pivot Lookback Right` number of bars to the left of the current bar")
// alertcondition(hiddenBullCondAlert, title='Hidden Bullish CVD Divergence', message='Found a new Hidden Bullish Divergence, `Pivot Lookback Right` number of bars to the left of the current bar')
// alertcondition(bearCondAlert, title='Regular Bearish CVD Divergence', message='Found a new Regular Bearish Divergence, `Pivot Lookback Right` number of bars to the left of the current bar')
// alertcondition(hiddenBearCondAlert, title='Hidden Bearisn CVD Divergence', message='Found a new Hidden Bearisn Divergence, `Pivot Lookback Right` number of bars to the left of the current bar')

le = bullCondAlert or hiddenBullCondAlert

se = bearCondAlert or hiddenBearCondAlert

ltp = se

stp = le

// Check if the entry conditions for a long position are met
if (le) //and (close > ema200)
    strategy.entry("Long", strategy.long, comment="EL")

 // Check if the entry conditions for a short position are met
if (se) //and (close < ema200)
    strategy.entry("Short", strategy.short, comment="ES")

// Close long position if exit condition is met
if (ltp) // or (close < ema200)
    strategy.close("Long", comment="XL")

    // Close short position if exit condition is met
if (stp) //or (close > ema200)
    strategy.close("Short", comment="XS")


// The Fixed Percent Stop Loss Code
// User Options to Change Inputs (%)
stopPer = input.float(5.0, title='Stop Loss %') / 100
takePer = input.float(10.0, title='Take Profit %') / 100

// Determine where you've entered and in what direction
longStop = strategy.position_avg_price * (1 - stopPer)
shortStop = strategy.position_avg_price * (1 + stopPer)
shortTake = strategy.position_avg_price * (1 - takePer)
longTake = strategy.position_avg_price * (1 + takePer)

if strategy.position_size > 0 
    strategy.exit("Close Long", "Long", stop=longStop, limit=longTake)
if strategy.position_size < 0 
    strategy.exit("Close Short", "Short", stop=shortStop, limit=shortTake)