VWMA-ADX 모멘텀 및 트렌드 기반 비트코인 장기 전략

저자:차오장, 날짜: 2024-04-03 17:47:49
태그:VWMAADXDMISMAEMARMAWMAHMASMMA

img

전반적인 설명

이 전략은 비트코인 시장에서 긴 기회를 포착하기 위해 여러 이동 평균 (VWMA), 평균 방향 지표 (ADX), 방향 움직임 지표 (DMI) 를 이용한다. 가격 동력, 트렌드 방향, 거래량 등을 결합함으로써 전략은 강력한 상승 추세와 충분한 동력을 가진 엔트리 포인트를 찾고 위험을 엄격히 통제하는 것을 목표로 한다.

전략 원칙

  1. 9일 및 14일 VWMA를 사용하여 긴 트렌드를 결정합니다. 단기 이동 평균이 장기 이동 평균을 넘을 때 상승 신호가 생성됩니다.
  2. 추세 필터로 89일 최고 및 최저 가격 VWMA를 기반으로 구성된 적응 이동 평균을 도입합니다. 닫기 가격 또는 개시 가격이 이 이동 평균보다 높을 때만 포지션을 개시하는 것을 고려하십시오.
  3. ADX 및 DMI 지표를 사용하여 트렌드 강도를 확인합니다. ADX가 18보다 크고 +DI와 -DI 사이의 차이는 15보다 크면만 트렌드가 충분히 강하다고 간주됩니다.
  4. 거래 부피가 낮은 기간을 피하기 위해 볼륨 퍼센틸 함수를 사용하여 60%에서 95%의 거래 부피를 가진 바를 필터링합니다.
  5. 스톱 로스 레벨을 이전 촛불의 0.96에서 0.99배로 설정하고, 리스크를 제어하기 위한 시간 프레임이 증가함에 따라 감소합니다.
  6. 미리 정의된 보유 시간이 도달하거나 가격이 적응 이동 평균 이하로 떨어지면 포지션을 닫습니다.

이점 분석

  1. 여러 가지 기술 지표를 결합함으로써 전략은 트렌드, 추진력 및 거래량과 같은 다양한 차원에서 시장 상황을 평가하여 신호를 더 신뢰할 수 있습니다.
  2. 적응적인 이동 평균 및 거래량 필터링 메커니즘은 잘못된 신호를 효과적으로 필터링하고 유효하지 않은 거래를 줄입니다.
  3. 엄격한 스톱 로스 설정과 보유 시간 제한은 전략의 위험 노출을 크게 감소시킵니다.
  4. 코드 모듈형 설계는 가독성 및 유지보수성을 향상시키고 추가 최적화 및 확장을 촉진합니다.

위험 분석

  1. 시장이 변동적이거나 추세가 불분명하면 전략은 더 많은 잘못된 신호를 생성할 수 있습니다.
  2. 스톱 로스 수준은 상대적으로 좁아서, 이는 조기 스톱 로스를 유발하고 큰 시장 변동시 손실을 증가시킬 수 있습니다.
  3. 이 전략은 거시 경제 상황과 중요한 사건들을 고려하지 않으며, "검은 백조" 사건에 직면했을 때 실패할 수 있습니다.
  4. 매개 변수 설정은 상대적으로 고정되어 있으며 적응력이 부족하여 다른 시장 환경에서 불안정한 성능을 초래할 수 있습니다.

최적화 방향

  1. 신호 신뢰성을 높이기 위해 상대적 강도 지수 (RSI) 와 볼링거 밴드 (Bollinger Bands) 와 같은 시장 조건을 파악할 수 있는 더 많은 지표를 도입합니다.
  2. 예를 들어, 평균 진정한 범위 (ATR) 또는 비율 기반의 스톱 로스를 사용하여 다른 시장 변동 조건에 적응하기 위해 스톱 로스 수준을 동적으로 최적화합니다.
  3. 거시 경제 데이터와 정서 분석을 통합함으로써 전략의 위험 관리 모듈을 강화합니다.
  4. 기계 학습 알고리즘을 사용하여 자동으로 매개 변수를 최적화하여 전략의 적응력과 안정성을 향상시킵니다.

요약

VWMA-ADX 비트코인 장기 전략은 비트코인 시장의 상승 기회를 포착하여 가격 트렌드, 추진력, 거래량 및 기타 기술적 지표를 종합적으로 고려합니다. 동시에 엄격한 위험 통제 조치와 명확한 출구 조건은 전략의 위험이 잘 통제되도록 보장합니다. 그러나 전략은 또한 변화하는 시장 환경에 대한 적응력이 부족하고 최적화된 스톱 로스 전략의 필요성과 같은 몇 가지 한계를 가지고 있습니다. 미래에, 신호 신뢰성, 위험 통제 및 매개 변수 최적화 측면에서 개선이 이루어질 수 있으며 전략의 안정성과 수익성을 더욱 향상시킬 수 있습니다. 전반적으로, VWMA-ADX 장기 전략은 투자자들에게 추진력과 트렌드를 기반으로 한 체계적인 거래 접근 방식을 제공합니다. 이는 추가 탐구와 정교에 가치가 있습니다.


/*backtest
start: 2024-03-01 00:00:00
end: 2024-03-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Q_D_Nam_N_96

//@version=5
strategy("Long BTC Strategy", overlay=true, 
     default_qty_type = strategy.percent_of_equity, 
     default_qty_value = 100, initial_capital = 1000, currency = currency.USD)

Volume_Quartile(vol) =>
    qvol1 = ta.percentile_linear_interpolation(vol, 60,15)
    qvol2 = ta.percentile_linear_interpolation(vol, 60,95)
    vol > qvol1 and vol < qvol2

smma(src, length) =>
	smma =  0.0
	smma := na(smma[1]) ? ta.sma(src, length) : (smma[1] * (length - 1) + src) / length
	smma

ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "RMA" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)
        "HMA" => ta.hma(source, length)
        "SMMA" => smma(source, length)

DMI(len, lensig) =>
    up = ta.change(high)
    down = -ta.change(low)
    plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
    trur = ta.rma(ta.tr, len)
    plus = fixnan(100 * ta.rma(plusDM, len) / trur)+11
    minus = fixnan(100 * ta.rma(minusDM, len) / trur)-11
    sum = plus + minus
    adx = 100 * ta.vwma(math.abs(plus - minus-11) / (sum == 0 ? 1 : sum), lensig)

    [adx, plus, minus]

cond1 = Volume_Quartile(volume*hlcc4)

ma1 = ma(close,9, "VWMA")
// plot(ma1, color = color.blue)
ma2 = ma(close,14, "VWMA")
// plot(ma2, color = color.orange)

n = switch timeframe.period
    "240" => 0.997
    => 0.995

ma3 = (0.1*ma(ta.highest(close,89),89, "VWMA") + 
     0.9*ma(ta.lowest(close,89),89, "VWMA"))*n

plot(ma3, color = color.white)

[adx, plus, minus] = DMI(7, 10)


cond2 = adx > 18 and plus - math.abs(minus) > 15

var int count = 0

if barstate.isconfirmed and strategy.position_size != 0
    count += 1
else
    count := 0

p_roc = 0
if timeframe.period == '240'
    p_roc := 14
else
    p_roc := 10

longCondition = ta.crossover(ma1, ma2) and (close > open ? close > ma3 : open > ma3) and ((ma3 - ma3[1])*100/ma3[1] >= -0.2) and ((close-close[p_roc])*100/close[p_roc] > -2.0)
float alpha = 0.0
float sl_src = high[1]
if (longCondition and cond1 and cond2 and strategy.position_size == 0)
    strategy.entry("buy", strategy.long)
    if timeframe.period == '240'
        alpha := 0.96
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+5, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '30'
        alpha := 0.985
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '45'
        alpha := 0.985
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '60'
        alpha := 0.98
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '120'
        alpha := 0.97
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '180'
        alpha := 0.96
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == 'D'
        alpha := 0.95
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else 
        alpha := 0.93
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)

period = switch timeframe.period
    "240" => 90
    "180" => 59
    "120" => 35
    "30" => 64
    "45" => 40
    "60" => 66
    "D" => 22
    => 64

if (count > period or close < ma3)
    strategy.close('buy', immediately = true) 

관련

더 많은

카즈즈888이 사진에서 보시는 것처럼,