부피 차이 델타 사이클 오시레이터 거래 전략

저자:차오장, 날짜: 2023-10-30 11:45:42
태그:

img

전반적인 설명

이 전략은 양량 가격 분산 전략에 속하는 양량 변화의 변화율을 계산하여 황소와 곰의 회기의 전환을 판단합니다. 양량 동력 지표와 가격의 볼링거 대역을 결합하여 양량 변화의 가격에 대한 주요 효과를 결정하고 트렌드의 전환점을 포착합니다.

거래 논리

  1. 부피 변화의 변화율 (부피 차이 지표의 변화율) 을 계산하여 부피 운동량 기반 지표 결과를 얻습니다.

  2. n의 볼링거 밴드를 계산하여 부피 운동의 표준편차를 나타내는 bbr를 얻습니다.

  3. 가격의 표준편차를 나타내는 bbr1을 얻기 위해 가격 닫기의 볼링거 밴드를 계산합니다.

  4. 둘 사이의 차이를 계산해 볼 때, 이는 최종 지표로 볼 때, 부피 모멘텀의 표준편차를 빼고 가격의 표준편차를 계산합니다.

  5. hist가 0을 넘으면 짧은 입력 신호이고 0을 넘으면 긴 입력 신호입니다.

부피 변화의 변화율을 계산함으로써, 가격에 부피 변화의 주도적인 효과가 증폭된다. 가격이 아직 반전되지 않은 상태에서 부피가 반전되면, hist는 0 이상 또는 0 이하로 넘어가 거래 신호를 생성한다. 가격 트렌드의 전환점을 사전에 예측할 수 있다.

장점

  1. 이 전략은 양량 변화율에 기반한 양량 가격 분산 전략으로, 가격 동향의 전환점을 사전에 반영할 수 있습니다.

  2. 부피 변화의 변화율을 계산하면 가격에 부피 변화의 주요 효과를 증폭시켜 더 나은 거래 성과를 얻습니다.

  3. 볼링거 밴드 가격과 볼륨 모멘텀 지표를 결합하면 거래 신호가 더 신뢰할 수 있습니다.

  4. 히스트 데이터에 대해 삼배 지수 평형을 사용하면 신호가 더 정확하고 부드럽습니다.

  5. 과잉 구매/ 과잉 판매 라인 및 긴/ 짧은 스톱 로스/ 수익 주문을 설정하면 위험을 효과적으로 제어할 수 있습니다.

  6. 볼링거 밴드 길이, 표준편차 곱셈자 및 Hist 평형 요인과 같은 많은 사용자 정의 가능한 매개 변수는 전략 최적화를 가능하게합니다.

위험성

  1. 부피 데이터는 시장 거래를 제대로 반영하지 않을 수 있으며 조작될 수 있습니다.

  2. 부피 가격 격차는 지속되지 않을 수 있고, 가격이 반전되지 않고 돌파될 수 있습니다.

  3. 부적절한 매개 변수 설정은 과도한 거래 또는 부정확한 신호를 유발할 수 있습니다.

  4. 비정상적인 부피 데이터로부터 잘못된 신호를 조심하십시오.

  5. 트렌드가 강할 때 반전 신호를 피해야 합니다.

위험은 매개 변수를 최적화하고 다른 필터를 추가하고 스톱 로스/프로피트 취득을 설정함으로써 완화 될 수 있습니다.

더 나은 기회

  1. 보다 안정적인 신호를 위해 볼링거 밴드 매개 변수를 최적화합니다.

  2. 트렌드 필터를 추가하여 트렌드에 반하는 거래를 피합니다.

  3. 신호 확인을 위해 MACD와 같은 다른 지표를 포함합니다.

  4. 인공지능을 활용해서 자동으로 최적화된 매개 변수를 사용하세요.

  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)



더 많은