볼륨 변화율에 기반한 롱-숏 교대 사이클 오실레이터 전략


생성 날짜: 2023-10-30 11:45:42 마지막으로 수정됨: 2023-10-30 11:45:42
복사: 1 클릭수: 686
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

볼륨 변화율에 기반한 롱-숏 교대 사이클 오실레이터 전략

개요

이 전략은 거래량 변화율의 변화율을 계산하여 다공간 주기의 전환을 판단하는 것으로, 양값이 이탈하는 종류의 전략에 속한다. 거래량의 동적 지표와 가격의 브린밴드를 결합하여 거래량 변화의 가격에 대한 선도적 효과를 판단하여 트렌드의 전환점을 포착한다.

전략 원칙

  1. 거래량 변화율의 변화율을 계산하여 거래량 차수 지표의 변화율을 계산하여 거래량 동력에 기반한 지표 nresult을 얻는다.

  2. nresult에 대한 브린 대역을 계산하여, 대역량 동력의 표준차를 나타내는 bbr을 얻는다.

  3. 종식 가격에 대한 브린 대역을 계산하여, 가격 표준 차이를 나타내는 bbr1을 얻는다.

  4. 둘의 차이값 hist, 즉 거래량 동력 표준 차 차 미만 가격 표준 차, 를 최종 지표로 계산한다.

  5. 상단에서 0을 입는 것은 빈 머리 입시점이며, 아래에서 0을 입는 것은 다 머리 입시점이다.

이 전략은 거래량 변화율의 변화를 계산함으로써 거래량 변화의 가격에 대한 선도적 효과를 증폭시킨다. 거래량이 반전될 때, 그리고 가격이 아직 반전되지 않은 상태에서, hist는 상위 또는 하위 0을 뚫고 거래 신호를 발생시킨다. 그것은 가격 경향의 전환점을 사전에 판단할 수 있다.

전략적 이점

  1. 이 전략은 거래량 변화율에 기반한 수량 가격 이탈 전략으로, 가격 동향을 미리 반영할 수 있는 전환점이다.

  2. 거래량 변화율의 변화율을 계산하여 거래량 변화율이 가격에 미치는 선도적 효과를 증대시키고 거래효율이 더 우수하다.

  3. 거래 신호를 더욱 신뢰하기 위해 거래량 동력 지표와 가격 지표를 결합한 브린 밴드를 사용한다.

  4. Hist 데이터를 3배의 지수 평소 처리로 처리하여 신호를 더 정확하고 부드럽게 만든다.

  5. 오버 바이 오버 세일 라인을 설정하고, 장시간 스톱 로즈 리미트 리스트와 함께, 위험을 효과적으로 제어할 수 있다.

  6. 브린 대역 길이, 표준 차이의 배수, 히스트 데이터 평준화 파라미터 등과 같은 사용자 정의 가능한 파라미터가 더 많으며, 전략적 최적화를 할 수 있다.

전략적 위험

  1. 거래량 데이터는 시장 거래 상황을 제대로 반영하지 않을 수도 있고, 조작될 수도 있다.

  2. 양값의 이탈이 지속될 필요는 없으며, 가격이 돌파구로 돌아가지 않을 수도 있다.

  3. 매개 변수 설정이 잘못되면 거래 빈도나 신호가 잘못될 수 있다.

  4. “비정상적 인 거래량을 방지하기 위한 가짜 신호에 주의하십시오”.

  5. 트렌드가 강할 때 반전 신호가 잘못된 거래로 이어질 때 주의해야 한다.

최적화 매개 변수를 통해, 다른 지표와 결합하여 필터링 할 수 있으며, 스톱 스톱을 설정하여 위험을 제어 할 수 있습니다.

전략 최적화 방향

  1. 브린 대역을 최적화하여 신호를 안정화한다.

  2. 트렌드 지표와 함께 신호를 필터링하여 역동적인 거래를 피하십시오.

  3. 가짜 신호를 방지하기 위해 MACD와 같은 다른 지표 확인을 추가하십시오.

  4. AI 기술을 활용하여 매개 변수를 스스로 적응하여 최적화한다.

  5. 스톱로스 스톱 동적 조정 모듈을 추가하고, 자금 관리를 최적화한다.

  6. 기계학습과 함께 측정값과 성공률을 판단하여 신호 품질을 향상시킵니다.

요약하다

이 전략은 거래량 변화율의 변화율을 계산하여 거래량 변화의 가격에 대한 선도적 효과를 확대하여 가격 경향의 전환을 미리 판단할 수 있다. 점은 단일 거래량 지표에 비해 더 높은 신뢰성과 정확성을 가지고 있다. 그러나 또한 거래량이 조작되고 양 가격이 돌파하는 위험을 방지하는 데 주의를 기울여야 하며, 매개 변수 최적화, 매개 변수 필터링 등의 수단으로 위험을 통제 할 수 있다. AI 기술을 적용하여 적응 매개 변수 최적화를 수행하여 전략의 안정성과 수익률을 더욱 향상시킬 수 있다.

전략 소스 코드
/*backtest
start: 2022-10-23 00:00:00
end: 2023-10-29 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/
// © tathal and special thanks to oakwhiz for his porting of my custom volume indicator

//@version=5
strategy('Volume Difference Delta Cycle Oscillator', 'VDDC Osc', default_qty_type=strategy.percent_of_equity, default_qty_value=100, max_bars_back=5000)

startDate = input.int(title='Start Date', defval=1, minval=1, maxval=31)
startMonth = input.int(title='Start Month', defval=1, minval=1, maxval=12)
startYear = input.int(title='Start Year', defval=2010, minval=1800, maxval=2100)

endDate = input.int(title='End Date', defval=31, minval=1, maxval=31)
endMonth = input.int(title='End Month', defval=12, minval=1, maxval=12)
endYear = input.int(title='End Year', defval=2021, minval=1800, maxval=2100)

// Normalize Function
normalize(_src, _min, _max) =>
    // Normalizes series with unknown min/max using historical min/max.
    // _src      : series to rescale.
    // _min, _min: min/max values of rescaled series.
    var _historicMin = 10e10
    var _historicMax = -10e10
    _historicMin := math.min(nz(_src, _historicMin), _historicMin)
    _historicMax := math.max(nz(_src, _historicMax), _historicMax)
    _min + (_max - _min) * (_src - _historicMin) / math.max(_historicMax - _historicMin, 10e-10)


// STEP 2:
// Look if the close time of the current bar
// falls inside the date range
inDateRange = true

// Stop loss & Take Profit Section     
l_sl_inp = input(2.0, title='Long Stop Loss %') / 100
l_tp_inp = input(4.0, title='Long Take Profit %') / 100

l_stop_level = strategy.position_avg_price * (1 - l_sl_inp)
l_take_level = strategy.position_avg_price * (1 + l_tp_inp)

s_sl_inp = input(2.0, title='Short Stop Loss %') / 100
s_tp_inp = input(4.0, title='Short Take Profit %') / 100

s_stop_level = strategy.position_avg_price * (1 + s_sl_inp)
s_take_level = strategy.position_avg_price * (1 - s_tp_inp)

src = close

//  Volume Differnce Indicator Delta

float change_src = ta.change(src)
float i_obv = ta.cum(change_src > 0 ? volume : change_src < 0 ? -volume : 0 * volume)
float i_pvt = ta.pvt

float result = ta.change(i_obv - i_pvt)

float nresult = ta.ema(normalize(result, -1, 1), 20)


// Volume Differnce Indicator Delta %B
length = input.int(20, minval=1, title='Volume Bands Length')
mult = input.float(2.0, minval=0.001, maxval=50, title='Volume Bands StdDev')
basis = ta.ema(nresult, length)
dev = mult * ta.stdev(nresult, length)
upper = basis + dev
lower = basis - dev
bbr = (nresult - lower) / (upper - lower)

// Normal %B, Based on close

l1 = input.int(20, minval=1, title='Bollinger Bands Length')
src2 = close
mult1 = input.float(2.0, minval=0.001, maxval=50, title='Bollinger Bands StdDev')
basis1 = ta.sma(src2, l1)
dev1 = mult1 * ta.stdev(src2, l1)
upper1 = basis1 + dev1
lower1 = basis1 - dev1
bbr1 = (src - lower1) / (upper1 - lower1)

/// Final Output Line

hist = ta.ema(ta.ema(ta.ema(bbr1 - bbr, input(2, title='Hist Smoothing Factor #1')), input(2, title='Hist Smoothing Factor #2')), input(2, title='Hist Smoothing Factor #3'))

/// Overbought / Oversold Line Creation
oversold = input(-.1)
overbought = input(.4)
hline(oversold, linewidth=2, color=color.new(#81c784, 62))
hline(overbought, linewidth=2, color=color.new(#c2185b, 38))

/// Long & Short Conditions

short = hist > overbought
long = hist < oversold

/// Colors & Plotting
histColor = hist >= 0 ? hist[1] < hist ? #26A69A : #B2DFDB : hist[1] < hist ? #FFCDD2 : #EF5350
plot(hist, title='Histogram', style=plot.style_columns, color=color.new(histColor, 0))

CrossBgColor = long ? color.new(#81c784, 62) : short ? color.new(#c2185b, 38) : na
bgcolor(color.new(CrossBgColor, 90))

/// Strategy Methodology

if inDateRange
    strategy.entry('long', strategy.long, when=long, stop=l_stop_level, limit=l_take_level)

if inDateRange and strategy.position_size > 0
    strategy.close_all(when=short)

if inDateRange
    strategy.entry('short', strategy.short, when=short, stop=s_stop_level, limit=s_take_level)

if inDateRange and strategy.position_size < 0
    strategy.close_all(when=long)