Động thái mua bán chiến lược phá vỡ khối lượng

Tác giả:ChaoZhang, Ngày: 2023-12-26 11:15:31
Tags:

img

Tổng quan

Chiến lược này xác định khối lượng mua và bán dài và ngắn thông qua khung thời gian tùy chỉnh, kết hợp với VWAP hàng tuần và Bollinger Bands để lọc, để nhận ra theo dõi xu hướng xác suất cao.

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

  1. Tính toán các chỉ số khối lượng mua và bán trong khung thời gian tùy chỉnh
  • BV: Khối lượng mua, do mua ở mức thấp
  • SV: Khối lượng bán hàng, do bán ở mức cao
  1. Khối lượng mua và bán
  • Dòng EMA 20 giai đoạn trơn tru
  • Phân biệt khối lượng mua và bán được xử lý thành tích cực và âm
  1. Định hướng chỉ số đánh giá
  • Hơn 0 là tăng, dưới 0 là giảm
  1. Xác định sự khác biệt kết hợp với VWAP hàng tuần và Bollinger Bands
  • Giá trên VWAP và chỉ số tăng là tín hiệu dài
  • Giá dưới VWAP và chỉ số giảm giá là tín hiệu ngắn
  1. Động thái lấy lợi nhuận và dừng lỗ
  • Phân phần được thiết lập của lợi nhuận và dừng lỗ dựa trên ATR hàng ngày

Ưu điểm

  1. Khối lượng mua và bán phản ánh đà thực tế của thị trường, nắm bắt năng lượng tiềm năng của xu hướng
  2. VWAP hàng tuần đánh giá xu hướng thời gian dài hơn, Bollinger Bands xác định tín hiệu đột phá
  3. Các bộ ATR năng động lấy lợi nhuận và dừng lỗ, tối đa hóa khóa lợi nhuận và tránh điều chỉnh quá mức

Rủi ro

  1. Mua và bán dữ liệu khối lượng có một số lỗi, có thể gây ra đánh giá sai
  2. Phân tích kết hợp chỉ số duy nhất có xu hướng tạo ra tín hiệu sai
  3. Các thiết lập tham số Bollinger Bands không chính xác thu hẹp các mức đột phá hợp lệ

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

  1. Tối ưu hóa với các chỉ số mua và bán khối lượng nhiều khung thời gian
  2. Thêm khối lượng giao dịch và các chỉ số phụ trợ khác để lọc
  3. Điều chỉnh động các thông số Bollinger Bands để cải thiện hiệu quả đột phá

Kết luận

Chiến lược này tận dụng đầy đủ tính dự đoán của khối lượng mua và bán, tạo ra các tín hiệu xác suất cao được bổ sung bởi VWAP và Bollinger Bands, đồng thời kiểm soát rủi ro hiệu quả thông qua lợi nhuận và dừng lỗ năng động.


/*backtest
start: 2022-12-19 00:00:00
end: 2023-12-25 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/
// © original author ceyhun
//@ exlux99 update

//@version=5
strategy('Buying Selling Volume Strategy', format=format.volume, precision=0, overlay=false)

weekly_vwap = request.security(syminfo.tickerid, "W", ta.vwap(hlc3))

vi = false
customTimeframe = input.timeframe("60", group="Entry Settings")

allow_long = input.bool(true, group="Entry Settings")
allow_short = input.bool(false, group="Entry Settings")

xVolume = request.security(syminfo.tickerid, customTimeframe, volume)
xHigh = request.security(syminfo.tickerid, customTimeframe, high)
xLow = request.security(syminfo.tickerid, customTimeframe, low)
xClose = request.security(syminfo.tickerid, customTimeframe, close)

BV = xHigh == xLow ? 0 : xVolume * (xClose - xLow) / (xHigh - xLow)
SV = xHigh == xLow ? 0 : xVolume * (xHigh - xClose) / (xHigh - xLow)

vol = xVolume > 0 ? xVolume : 1
TP = BV + SV
BPV = BV / TP * vol
SPV = SV / TP * vol
TPV = BPV + SPV

tavol20 = request.security(syminfo.tickerid, customTimeframe, ta.ema(vol, 20))
tabv20= request.security(syminfo.tickerid, customTimeframe, ta.ema(BV, 20))
tasv20= request.security(syminfo.tickerid, customTimeframe, ta.ema(SV, 20))
VN = vol / tavol20
BPN = BV / tabv20 * VN * 100
SPN = SV / tasv20 * VN * 100
TPN = BPN + SPN

xbvp = request.security(syminfo.tickerid, customTimeframe,-math.abs(BPV))
xbpn = request.security(syminfo.tickerid, customTimeframe,-math.abs(BPN))
xspv = request.security(syminfo.tickerid, customTimeframe,-math.abs(SPV))
xspn = request.security(syminfo.tickerid, customTimeframe,-math.abs(SPN))

BPc1 = BPV > SPV ? BPV : xbvp
BPc2 = BPN > SPN ? BPN : xbpn
SPc1 = SPV > BPV ? SPV : xspv
SPc2 = SPN > BPN ? SPN : xspn
BPcon = vi ? BPc2 : BPc1
SPcon = vi ? SPc2 : SPc1


minus = BPcon + SPcon
plot(minus, color = BPcon > SPcon  ? color.green : color.red , style=plot.style_columns) 

length = input.int(20, minval=1, group="Volatility Settings")
src = minus//input(close, title="Source")
mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev", group="Volatility Settings")
xtasma = request.security(syminfo.tickerid, customTimeframe, ta.sma(src, length))
xstdev = request.security(syminfo.tickerid, customTimeframe, ta.stdev(src, length))
basis = xtasma
dev = mult * xstdev
upper = basis + dev
lower = basis - dev
plot(basis, "Basis", color=#FF6D00, offset = 0)
p1 = plot(upper, "Upper", color=#2962FF, offset = 0)
p2 = plot(lower, "Lower", color=#2962FF, offset = 0)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))

// Original a
longOriginal = minus > upper and BPcon > SPcon and close > weekly_vwap
shortOriginal = minus > upper and BPcon < SPcon and close< weekly_vwap



high_daily = request.security(syminfo.tickerid, "D", high)
low_daily  = request.security(syminfo.tickerid, "D", low)
close_daily = request.security(syminfo.tickerid, "D", close)

true_range = math.max(high_daily - low_daily, math.abs(high_daily - close_daily[1]), math.abs(low_daily - close_daily[1]))
atr_range = ta.sma(true_range*100/request.security(syminfo.tickerid, "D", close), 14)

ProfitTarget_Percent_long = input.float(100.0, title='TP Multiplier for Long entries ', step=0.5, step=0.5, group='Dynamic Risk Management')
Profit_Ticks_long = close + (close * (atr_range * ProfitTarget_Percent_long))/100
LossTarget_Percent_long = input.float(1.0, title='SL Multiplier for Long entries', step=0.5, group='Dynamic Risk Management')
Loss_Ticks_long = close - (close * (atr_range * LossTarget_Percent_long ))/100

ProfitTarget_Percent_short = input.float(100.0, title='TP Multiplier for Short entries ', step=0.5, step=0.5, group='Dynamic Risk Management')
Profit_Ticks_short = close - (close * (atr_range*ProfitTarget_Percent_short))/100
LossTarget_Percent_short = input.float(5.0, title='SL Multiplier for Short entries', step=0.5, group='Dynamic Risk Management')
Loss_Ticks_short = close + (close * (atr_range*LossTarget_Percent_short))/100



var longOpened_original = false
var int timeOfBuyLong = na
var float tpLong_long_original = na
var float slLong_long_original = na
long_entryx = longOriginal

longEntry_original = long_entryx and not longOpened_original 


if longEntry_original
    longOpened_original := true
    tpLong_long_original := Profit_Ticks_long
    slLong_long_original := Loss_Ticks_long
    timeOfBuyLong := time
    //lowest_low_var_sl := lowest_low

     
tpLong_trigger = longOpened_original[1] and ((close > tpLong_long_original) or (high > tpLong_long_original)) //or high > lowest_low_var_tp
slLong_Trigger = longOpened_original[1] and ((close < slLong_long_original) or (low < slLong_long_original)) //or low < lowest_low_var_sl

longExitSignal_original =   shortOriginal or tpLong_trigger or slLong_Trigger 


if(longExitSignal_original)
    longOpened_original := false
    tpLong_long_original := na
    slLong_long_original := na


if(allow_long)
    strategy.entry("long", strategy.long, when=longOriginal) 
    strategy.close("long", when= longExitSignal_original) //or shortNew

if(allow_short)
    strategy.entry("short", strategy.short, when=shortOriginal ) 
    strategy.close("short", when= longOriginal) //or shortNew



Thêm nữa