동적 구매 판매 부피 파업 전략

저자:차오장, 날짜: 2023-12-26 11:15:31
태그:

img

전반적인 설명

이 전략은 높은 확률 트렌드 추적을 실현하기 위해 매주 VWAP 및 필터링을 위한 볼링거 밴드와 결합하여 사용자 정의 시간 프레임 구매 및 판매 부피를 통해 장기 및 단기를 결정합니다. 또한 일방적인 위험을 효과적으로 제어하기 위해 동적 인 수익 및 손실을 중지하는 메커니즘을 도입합니다.

전략 원칙

  1. 맞춤형 시간 프레임 내에서 구매 및 판매량 지표를 계산
  • BV: 낮은 가격으로 구매한 결과 구매량이 증가합니다.
  • SV: 판매량, 최고 판매점으로 인해
  1. 공정 구매 및 판매량
  • 20주기 EMA로 평탄하다
  • 양과 음으로 처리된 매수 및 판매량을 분리합니다.
  1. 판사 지표 방향
  • 0보다 크면 상승, 0보다 작으면 하락
  1. 주간 VWAP 및 볼링거 밴드와 결합한 오차를 결정합니다
  • VWAP 이상 가격과 지표 상승은 긴 신호입니다
  • VWAP 아래의 가격과 지표 하향은 짧은 신호입니다.
  1. 동적 취득 및 스톱 손실
  • 일일 ATR에 기초한 취득 및 스톱 로스 비율 설정

장점

  1. 구매 및 판매 부피는 실제 시장 추진력을 반영하고 잠재적인 동향의 에너지를 포착합니다.
  2. 주간 VWAP는 더 긴 시간 프레임 트렌드 방향을 판단합니다. 볼링거 밴드는 브레이크 신호를 결정합니다.
  3. 동적 ATR 세트는 수익을 취하고 손실을 멈추고, 수익 잠금을 극대화하고 오버 튜닝을 피합니다.

위험성

  1. 구매 및 판매량 데이터는 특정 오류가 있습니다, 잘못된 판단을 일으킬 수 있습니다
  2. 단일 지표의 결합 판단은 잘못된 신호를 생성하는 경향이 있습니다.
  3. 부적절한 볼링거 밴드 매개 변수 설정으로 유효한 브레이크오웃이 좁아집니다

최적화 방향

  1. 여러 시간 프레임 구매 및 판매량 지표로 최적화
  2. 필터링을 위한 거래량 및 다른 보조 지표를 추가합니다.
  3. 브레이크오웃 효율을 높이기 위해 볼링거 밴드 매개 변수를 동적으로 조정합니다.

결론

이 전략은 구매 및 판매 부피의 예측성을 최대한 활용하여 VWAP 및 볼링거 밴드 (Bollinger Bands) 로 보완된 높은 확률 신호를 생성하며, 동적 인 취득 및 스톱 로스를 통해 위험을 효과적으로 제어합니다. 매개 변수 및 규칙이 계속 최적화됨에 따라 성능이 더욱 중요해질 것으로 예상됩니다.


/*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



더 많은