듀얼 웨이브 진동 필터 거래 전략


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

듀얼 웨이브 진동 필터 거래 전략

개요

이중파 흔들림 필터 전략은 가격 변동성에 기반한 거래 전략이다. 그것은 두 개의 다른 파라미터 세트의 평균 변동 범위 지표를 사용하여 가격과 변동 범위의 관계를 결합하여 거래 신호를 생성한다. 이 전략은 비트코인 같은 높은 변동성이있는 디지털 자산에 적용된다.

전략 원칙

이 전략은 두 개의 다른 주기 길이의 평평한 변동 범위 지표를 사용한다: 빠른 변동 범위 지표 ((기준 주기 27), 그리고 느린 변동 범위 지표 ((기준 주기 55). 변동 범위 지표의 계산 공식은: 현재 주기 가격 변동의 폭의 지수 이동 평균을 하나의 배수로 곱한다 (예: 1.6).

이중파 흔들림 필터 전략은 가격과 두 가지 변동 범위 지표의 관계를 비교하여 현재 특정 규모의 흔들림 범위 내에 있는지 판단합니다. 가격이 그 흔들림 범위를 돌파 할 때 거래 신호를 생성합니다.

구체적으로, 전략은 중간선을 기준으로 하고, 중간선은 두 변동 범위 지표의 평균값이다. 가격이 중간선 상단에서 빠른 변동 범위를 넘어서면 다중 신호가 발생하고, 가격이 중간선 아래에서 빠른 변동 범위를 넘어서면 마이너스 신호가 발생한다.

잘못된 메시지를 필터링하기 위해, 이 전략은 또 하나의 조건을 추가했다: 가격이 이전 한 주기의 가격과 일치하는 경우에만 신호를 생성한다. 예를 들어, 가격이 상승하여 중도선 한 변동 범위를 넘어서면만 다중 신호를 생성한다.

요약하자면, 이 전략은 이중 파동 범위 지표를 사용하여 흔들림 영역을 식별하고, 가격 돌파 흔들림 영역을 신호로 하여 거래 지시를 생성한다. 동시에 가격 방향 필터를 추가하여 잘못된 신호를 줄인다.

전략적 이점

이중파 진동 필터링 전략의 장점은 다음과 같습니다.

  1. 가격 변동성 특성을 활용하여 비트코인 같은 높은 변동율의 자산에 적응할 수 있다. 이중 변동 범위 지표는 가격 변동 영역을 더 정확하게 파악할 수 있다.

  2. 이중 파동 범위 지표는 다른 시간 길이를 포함한다. 빠른 지표는 단기 돌파 기회를 포착하고, 느린 지표는 장기적인 추세를 고려한다.

  3. 가격 방향 필터링 조건을 추가하면 단기 변동으로 인한 잘못된 신호를 줄일 수 있습니다.

  4. 거래 논리는 간단하고 명확하며, 이해하기 쉬운 구현, 양적 거래에 적합하다.

전략적 위험

이중 파동 진동 필터링 전략에는 몇 가지 위험도 있습니다.

  1. 변동성 지표에 따라, 낮은 변동성 시장에서 효과가 좋지 않을 수 있다.

  2. 변동 범위 파라미터는 다른 품종에 맞게 조정 및 최적화해야 하며, 그렇지 않으면 거래 기회를 놓치거나 잘못된 신호를 생성할 수 있다.

  3. 가격의 변동률과 다른 상황을 고려하지 않는다. 변동률이 상승하고 가격이 상승하지 않을 때 잘못된 신호를 보낼 수 있다.

  4. 높은 변동 환경에서는 스톱 포인트 설정이 조정될 수 있다. 너무 급진적인 스톱 포인트는 자주 스톱된다.

전략 최적화

이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.

  1. 변동 범위 파라미터를 테스트하고 최적화하여 다양한 품종의 다른 주기에서 최적의 파라미터 조합을 찾습니다.

  2. 최근 변동률에 따라 손해지기를 조정하는 메커니즘에 가입하여 손해지기를 최적화하십시오.

  3. 가격과 변동률의 오차에 기반한 필터링 조건을 추가하여 잘못된 신호를 방지한다.

  4. 거래량 변화와 같은 다른 지표와 결합하여 진입의 확실성을 높인다.

  5. 전략에 맞는 정지 탈퇴 메커니즘을 테스트하고 추가하십시오.

요약하다

이중파 진동 필터링 전략은 전체적으로 높은 변동성 자산을 대상으로 한 효과적인 거래 전략이다. 그것은 가격 변동성을 올바르게 활용하여 간단한 명확한 거래 논리를 낳는다. 파라미터 최적화, 위험 관리 등으로 더 개선하면 전략은 양적 거래 시스템의 가치있는 구성 요소가 될 수 있다. 그것은 또한 우리에게 시장의 변동성 특성에 기반한 알고리즘 거래를위한 아이디어를 제공합니다.

전략 소스 코드
/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 30m
basePeriod: 15m
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/
// © colinmck, greenmask9

//@version=4

strategy(title="Twin Range Filter Algo", overlay=true)

source = input(defval=close, title="Source")

// Smooth Average Range

per1 = input(defval=27, minval=1, title="Fast period")
mult1 = input(defval=1.6, minval=0.1, title="Fast range")

per2 = input(defval=55, minval=1, title="Slow period")
mult2 = input(defval=2, minval=0.1, title="Slow range")

smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ema(abs(x - x[1]), t)
    smoothrng = ema(avrng, wper) * m
    smoothrng
smrng1 = smoothrng(source, per1, mult1)
smrng2 = smoothrng(source, per2, mult2)
smrng = (smrng1 + smrng2) / 2

// Range Filter

rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r : 
       x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r
    rngfilt
filt = rngfilt(source, smrng)

upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

hband = filt + smrng
lband = filt - smrng

longCond = bool(na)
shortCond = bool(na)
longCond := source > filt and source > source[1] and upward > 0 or source > filt and source < source[1] and upward > 0
shortCond := source < filt and source < source[1] and downward > 0 or source < filt and source > source[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]

long = longCond and CondIni[1] == -1
short = shortCond and CondIni[1] == 1

// Plotting

// Strategy
// From this part on, programmer is greenmaks9
//
Separator = input(title="Following conditions and backtest algorithm are added by @greenmask9 🎯, original script is written by @colinmck 👍. Read both of their's release notes for more info on how this script works.", type=input.bool, defval=false)
disabler = input(title="Disable greenmask9's ATR conditions", type=input.bool, defval=false)

//second
l2 = input(title="ATR1", defval=32, minval=1)
s2 = input(title="Smoothing", defval="SMA", options=["RMA", "SMA", "EMA", "WMA"])
atr2(source, l2) => 
    if s2 == "SMA"
        sma(source, l2)
    else
        if s2 == "RMA"
            rma(source, l2)
        else
            if s2 == "EMA"
                ema(source, l2)
            else
                wma(source, l2)

//third
l3 = input(title="ATR2", defval=64, minval=1)
s3 = input(title="Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])
atr3(source, l3) => 
    if s3 == "RMA"
        rma(source, l3)
    else
        if s3 == "SMA"
            sma(source, l3)
        else
            if s3 == "EMA"
                ema(source, l3)
            else
                wma(source, l3)

atr20=atr2(tr(true), l2)
atr30=atr3(tr(true), l3)
strategy.initial_capital = 50000
ordersize=floor(strategy.initial_capital/close)
profit = input(title="Ticks profit", type=input.integer, defval=900)
stop = input(title="Ticks stoploss", type=input.integer, defval=300)
maxcandles_till_close = input(title="Time stoploss", type=input.integer, defval=17)


bull = long and (atr20<atr30 or disabler)
bear = short and (atr20<atr30 or disabler)

bullclock = barssince(bull)
bearclock = barssince(bear)

if (bull)
    strategy.entry("Twin Long", strategy.long, ordersize)
    strategy.exit("Exit", from_entry =  "Twin Long", profit = profit, loss = stop)

if (bear)
    strategy.entry("Twin Short", strategy.short, ordersize)
    strategy.exit("Exit", from_entry = "Twin Short", profit = profit, loss = stop)

//time stoploss
strategy.close("Twin Long", when = bullclock == maxcandles_till_close, comment = "Timed out")
strategy.close("Twin Short", when = bearclock == maxcandles_till_close, comment = "Timed out")