듀얼 레인지 필터 모멘텀 거래 전략

저자:차오장, 날짜: 2024-04-01 10:54:47
태그:

img

전반적인 설명

이 전략은 이중 범위 필터를 기반으로 한 모멘텀 트레이딩 전략이다. 이 전략은 현재 가격 트렌드를 결정하는 데 사용되는 포괄적인 범위 필터를 얻기 위해 빠르고 느린 기간에 대한 부드러운 범위를 계산합니다. 가격이 이 범위를 넘어서면 / 이 범위를 넘어서면 전략은 구매 / 판매 신호를 생성합니다. 또한 전략은 위험을 제어하고 이익을 잠금하기 위해 4 개의 경사 이익 취득 수준과 1 개의 중지 손실 수준을 설정합니다.

전략 원칙

  1. 빠른 기간과 느린 기간을 위한 부드러운 범위를 계산합니다. 빠른 범위는 짧은 기간과 더 작은 배수를 사용하지만 느린 범위는 더 긴 기간과 더 큰 배수를 사용합니다.
  2. 전체 범위 필터 (TRF) 로 빠른 범위와 느린 범위의 평균을 사용한다.
  3. 현재 가격을 이전 가격과 비교하여 상승과 하락 추세를 결정합니다.
  4. 동적 상위 (FUB) 및 하위 (FLB) 대역을 추세에 대한 참조로 계산합니다.
  5. 종료 가격과 TRF 사이의 관계를 기반으로 구매 및 판매 신호를 생성합니다.
  6. 4개의 그래디언트 취익 레벨과 1개의 스톱 로스 레벨을 설정하여 서로 다른 포지션 비율과 수익/손실 비율을 나타냅니다.

이점 분석

  1. 이중 범주 필터는 빠른 기간과 느린 기간을 결합하여 전략이 다른 시장 속도에 적응하고 더 많은 거래 기회를 잡을 수 있습니다.
  2. 역동적인 상위 및 하위 대역의 설계는 전략이 현재 추세에 맞춰지고 잘못된 신호를 줄이는 데 도움이됩니다.
  3. 네 가지 차원 차원의 수익은 트렌드가 계속될 때 더 많은 수익을 확보할 수 있고 트렌드가 역전될 때 부분적인 수익을 얻을 수 있습니다.
  4. 스톱 로스 설정은 거래당 최대 손실을 제어하고 계정 안전을 보호합니다.

위험 분석

  1. 시장 변동이나 범위 조건에서 전략은 많은 잘못된 신호를 생성하여 거래 및 수수료 손실이 자주 발생할 수 있습니다.
  2. 그레디언트 (gradient) 취익 설정은 일부 이익이 조기에 잠금되는 것을 초래할 수 있으며, 트렌드 움직임에서 전략이 완전히 이익을 얻을 수 없습니다.
  3. 스톱 로스 설정은 블랙 스완 이벤트로 인한 극심한 손실을 완전히 피할 수 없습니다.

최적화 방향

  1. 더 많은 기술적 지표 또는 시장 정서 지표를 트렌드 결정의 보조 조건으로 포함하는 것을 고려하여 잘못된 신호를 줄이십시오.
  2. 이윤을 취하고 손실을 멈추는 설정을 위해 전략의 적응력을 향상시키기 위해 다른 시장 환경과 거래 도구에 따라 동적으로 조정하십시오.
  3. 백테스팅 결과를 기반으로 빠른 범위와 느린 범위 기간 선택과 수익 및 스톱-러스 레벨의 비율 설정과 같은 매개 변수 설정을 더 이상 최적화하여 전략의 안정성과 수익성을 향상시킵니다.

요약

이중 범위 필터 모멘텀 거래 전략은 가격 추세를 결정하고 구매/판매 신호를 생성하기 위해 동적 상위 및 하위 대역과 결합하여 빠르고 느린 기간의 부드러운 범위를 사용하여 포괄적인 필터를 구축합니다. 전략은 또한 위험을 제어하고 수익을 잠금하기 위해 4 개의 경사 수익 레벨과 1 개의 스톱-러스 레벨을 설정합니다. 이 전략은 트렌딩 시장에서 사용하기에 적합하지만 변동 시장에서 더 많은 잘못된 신호를 생성 할 수 있습니다. 미래에 더 많은 지표를 도입하고, 수익 및 스톱-러스 설정을 최적화하고, 전략의 적응성과 안정성을 향상시키기 위해 매개 변수를 동적으로 조정하는 것을 고려하십시오.


/*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 source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
//@version=5
strategy(title='2"Twin Range Filter', overlay=true)
strat_dir_input = input.string(title='İşlem Yönü', defval='Alis', options=['Alis', 'Satis', 'Tum'])
strat_dir_value = strat_dir_input == 'Alis' ? strategy.direction.long : strat_dir_input == 'Satis' ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)

////////////////////////////

// Backtest inputs
BaslangicAy = input.int(defval=1, title='İlk ay', minval=1, maxval=12)
BaslangicGun = input.int(defval=1, title='İlk Gün', minval=1, maxval=31)
BaslangicYil = input.int(defval=2023, title='İlk Yil', minval=2000)
SonAy = input.int(defval=1, title='Son Ay', minval=1, maxval=12)
SonGun = input.int(defval=1, title='Son Gün', minval=1, maxval=31)
SonYil = input.int(defval=9999, title='Son Yıl', minval=2000)

start = timestamp(BaslangicYil, BaslangicAy, BaslangicGun, 00, 00)  // backtest start window
finish = timestamp(SonYil, SonAy, SonGun, 23, 59)  // backtest finish window
window() => true

source = input(defval=close, title='Source')
showsignals = input(title='Show Buy/Sell Signals ?', defval=true)
per1 = input.int(defval=27, minval=1, title='Fast period')
mult1 = input.float(defval=1.6, minval=0.1, title='Fast range')
per2 = input.int(defval=55, minval=1, title='Slow period')
mult2 = input.float(defval=2, minval=0.1, title='Slow range')
smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper) * m
    smoothrng
smrng1 = smoothrng(source, per1, mult1)
smrng2 = smoothrng(source, per2, mult2)
smrng = (smrng1 + smrng2) / 2
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])
STR = filt + smrng
STS = filt - smrng
FUB = 0.0
FUB := STR < nz(FUB[1]) or close[1] > nz(FUB[1]) ? STR : nz(FUB[1])
FLB = 0.0
FLB := STS > nz(FLB[1]) or close[1] < nz(FLB[1]) ? STS : nz(FLB[1])
TRF = 0.0
TRF := nz(TRF[1]) == FUB[1] and close <= FUB ? FUB : nz(TRF[1]) == FUB[1] and close >= FUB ? FLB : nz(TRF[1]) == FLB[1] and close >= FLB ? FLB : nz(TRF[1]) == FLB[1] and close <= FLB ? FUB : FUB
al = ta.crossover(close, TRF)
sat = ta.crossunder(close, TRF)
plotshape(showsignals and al, title='Long', text='BUY', style=shape.labelup, textcolor=color.white, size=size.tiny, location=location.belowbar, color=color.rgb(0, 19, 230))
plotshape(showsignals and sat, title='Short', text='SELL', style=shape.labeldown, textcolor=color.white, size=size.tiny, location=location.abovebar, color=color.rgb(0, 19, 230))
alertcondition(al, title='Long', message='Long')
alertcondition(sat, title='Short', message='Short')
Trfff = plot(TRF)
mPlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0)
longFillColor = close > TRF ? color.green : na
shortFillColor = close < TRF ? color.red : na
fill(mPlot, Trfff, title='UpTrend Highligter', color=longFillColor, transp=90)
fill(mPlot, Trfff, title='DownTrend Highligter', color=shortFillColor, transp=90)

//////////////////////



renk1 = input(true, "Mum Renk Ayarları?")
mumrenk = input(true,title="Trend Bazlı Mum Rengi Değişimi?")
htaColor = renk1 ? (al ? color.rgb(224, 230, 57) : #E56337) : #c92626
barcolor(color = mumrenk ? (renk1 ? htaColor : na) : na)
if (al) and window()
    strategy.entry("Al", strategy.long)
if (sat) and window()
    strategy.entry("Sat", strategy.short)


per1(pcnt) =>
    strategy.position_size != 0 ? math.round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)
zarkesmgb = input.float(title='Zarar Kes Yüzdesi', defval=100, minval=0.01)
zarkeslos = per1(zarkesmgb)
q1 = input.int(title='Satış Lot Sayısı 1.Kısım %', defval=5, minval=1)
q2 = input.int(title='Satış Lot Sayısı 2.Kısım %', defval=8, minval=1)
q3 = input.int(title='Satış Lot Sayısı 3.Kısım %', defval=13, minval=1)
q4 = input.int(title='Satış Lot Sayısı 4.Kısım %', defval=21, minval=1)
tp1 = input.float(title='Kar Yüzdesi 1.Kısım', defval=13, minval=0.01)
tp2 = input.float(title='Kar Yüzdesi 2.Kısım', defval=21, minval=0.01)
tp3 = input.float(title='Kar Yüzdesi 3.Kısım', defval=29, minval=0.01)
tp4 = input.float(title='Kar Yüzdesi 4.Kısım', defval=34, minval=0.01)
strategy.exit('✨KS1', qty_percent=q1, profit=per1(tp1), loss=zarkeslos)
strategy.exit('✨KS2', qty_percent=q2, profit=per1(tp2), loss=zarkeslos)
strategy.exit('✨KS3', qty_percent=q3, profit=per1(tp3), loss=zarkeslos)
strategy.exit('✨KS4', qty_percent=q4, profit=per1(tp4), loss=zarkeslos)



더 많은