쌍종 필터 거래 전략

저자:차오장, 날짜: 2023-11-13 10:38:20
태그:

img

전반적인 설명

트윈 레인지 필터 전략 (Twin Range Filter strategy) 은 가격 변동성에 기반한 거래 전략이다. 이 전략은 가격과 범위 사이의 관계를 결합하여 다른 매개 변수 설정으로 두 개의 평균 범위 지표를 사용하여 거래 신호를 생성합니다. 이 전략은 비트코인과 같은 매우 변동적인 디지털 자산에 적합합니다.

전략 논리

이 전략은 다른 기간 길이를 가진 두 개의 부드러운 범위 지표를 사용합니다: 빠른 범위 지표 (예정 기간 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")



더 많은