
다중 시간 프레임 파동 트렌드 추적기 전략은 WaveTrend 지표에 기반한 다중 시간 프레임 트렌드 추적 거래 시스템이다. 이 전략은 15분 시간 프레임에 특별히 최적화되어 있으며, 3 계층의 시간 프레임 조화 방법을 사용한다. 240분 WaveTrend은 거시적인 트렌드 필터로, 30분 WaveTrend은 동력 확인을 위해, 15분 WaveTrend은 신호 생성을 위해 사용된다. 이 전략은 다양한 시간 프레임에 WaveTrend 지표의 교차를 식별하여 입점과 출구를 결정하는 데에 중점을 두고 있으며, 최대의 수익에 기반한 추적 논리와 백분율에 기반한 회수 허용을 포함한 첨단 추적 중지 메커니즘을 결합하여 수익을 극대화하고 위험을 효과적으로 제어한다.
이 전략의 핵심 원칙은 WaveTrend 지표가 여러 시간 프레임에 대한 연동 작용을 사용하여 트렌드 방향과 전환점을 식별하는 것입니다. WaveTrend 지표 자체는 가격과 지수 이동 평균 (EMA) 의 관계를 계산하여 변동성 인자와 결합하여 가격 과매매 상태를 측정하는 기술 지표입니다.
이 전략의 실행 과정은 다음과 같습니다.
먼저 WaveTrend 함수를 정의해 두 가지 주요 값을 계산한다:
전략은 세 시간 프레임에 걸쳐 WaveTrend 지표를 적용합니다.
입장 조건:
손해배상과 출장 메커니즘은 복합적으로 적용됩니다.
전략은 각 거래의 입시 가격, 입시 기둥, 그리고 최대 수익률을 기록하고 추적합니다. 이러한 매개 변수는 동적으로 출구 지점을 조정하는 데 사용됩니다.
다중 시간 프레임 협동다양한 시간 프레임에 대한 WaveTrend 지표를 분석함으로써 전략은 시장 추세를 더 포괄적으로 파악하고, 가짜 신호 방해를 줄이고, 거래 정확도를 향상시킵니다. 낮은 시간 프레임은 정확한 진입 지점을 제공하며, 높은 시간 프레임은 거래 방향이 주 트렌드와 일치하도록합니다.
동적 상쇄 메커니즘이 전략은 세 가지의 손실 보호 시스템을 사용합니다. 고정 비율의 손실, 수익 기반의 추적 손실 및 최대 수익 보호 장치가 포함됩니다. 이 복합 손실 전략은 자금을 보호하면서 트렌드에 대한 수익을 최대한 포착 할 수 있습니다.
시각적 피드백 시스템: 거래 입출점은 색상 표기 ((🔴) 를 통해 직관적으로 표시되며, 기둥 번호 정보를 포함하여 분석 및 거래 재검토를 가능하게 한다.
매개 변수는 유연하게 조정할 수 있습니다.: 전략은 여러 가지 사용자 정의 가능한 매개 변수를 제공 합니다. 그 중에는 트래킹 스톱 손실 트리거 비율, 트래킹 트래킹 비율 및 최대 허용 철회 비율이 포함되어 있습니다. 사용자는 자신의 위험 선호도 및 시장 상황에 따라 조정할 수 있습니다.
코드 구조가 명확합니다.정책은 기능적으로 설계되어 있으며, 각 부분의 논리가 명확하고, 이해하기 쉽고 유지 관리 할 수 있으며, 추가적으로 최적화 및 확장 할 수 있습니다.
추세 전환 반응 지연: 트렌드 추적 전략으로, 트렌드 전환점에는 지연 반응이 있을 수 있으며, 시장이 역전될 때 더 큰 회수 현상이 발생할 수 있습니다. 해결 방법은 스톱 로즈 파라미터를 조정하거나 추가적인 트렌드 전환 지표를 보조로 추가하는 것입니다.
변동성 시장의 부진: 수평 정리 또는 급격히 변동하는 시장 환경에서, 전략은 빈번한 잘못된 신호와 상실을 유발할 수 있으며, 이로 인해 연속적인 손실이 발생할 수 있습니다. 시장이 명백한 추세에 있다는 것을 확인했을 때만 전략을 활성화하는 것이 좋습니다.
매개변수 민감도: 전략의 성능은 WaveTrend의 파라미터 설정 (n1=10, n2=21) 과 스톱 로즈 파라미터에 상당히 민감하다. 지나치게 느린 파라미터는 너무 늦은 스톱 로즈로 이어질 수 있고, 지나치게 긴밀한 파라미터는 너무 일찍 유리한 추세에서 탈퇴할 수 있다. 이러한 파라미터는 역사적인 재검토를 통해 최적화해야 한다.
유동성 위험: 코드에서 기본으로 상대적인 자금량을 사용하여 ((10%) 거래하지만, 낮은 유동성 시장에서 이것은 슬라이드 포인트가 증가하거나 거래가 어려워질 수 있습니다. 실제 거래 품종의 유동성에 따라 포지션 크기를 조정해야합니다.
외부 데이터 의존 요청전략: request.security() 함수를 사용하여 더 높은 시간 프레임 데이터를 얻습니다. 이는 일부 거래 플랫폼에서 지연 또는 데이터 사용 불가능의 위험이 있습니다. 거래 환경이 여러 시간 프레임 데이터 요청을 지원하는지 확인해야합니다.
동적 변수 조정: 현재 전략은 고정된 WaveTrend 파라미터와 스톱 비율을 사용하며, 시장의 변동성 (예: ATR) 에 따라 이러한 파라미터를 동적으로 조정하는 것을 고려할 수 있습니다. 예를 들어, 높은 변동성 환경에서 스톱 거리를 늘리고, 낮은 변동성 환경에서 스톱을 강화하여 다른 시장 조건에 적응합니다.
트렌드 강도 필터링트렌드 강도를 측정하기 위해 ADX 또는 유사한 지표를 추가할 수 있으며, 트렌드 강도가 특정 하락점을 초과했을 때만 거래를 수행하여 약한 트렌드 또는 가로 시장에서 과도한 거래를 피하십시오.
최적화 시간 프레임 선택현재 전략은 15분, 30분, 60분 시간 프레임을 사용하며, 역전 분석을 통해 최적의 시간 프레임 조합을 찾을 수 있으며, 다른 거래 품종의 특성에 따라 시간 프레임을 조정할 수 있습니다.
트랜잭션 수량 확인: 거래량 지표를 입시 조건에 통합하여 거래량이 지지되는 추세에서만 입시를 보장하고 신호 품질을 향상시킵니다.
출전 메커니즘 개선: 현재 출전은 주로 스톱 로드 트리거에 의존하고 있으며, 파스 트렌드 지표 자체에 기반한 수익 목표 또는 역전 신호를 적극적인 출전 조건으로 추가하는 것이 고려될 수 있습니다.
포지션 관리 논리를 추가현재 전략은 고정 비율의 자금 관리를 사용하며, 변동성이나 신호 강도에 따라 역동적으로 위치 크기를 조정하는 것을 고려할 수 있습니다. 더 확실 한 거래에서 위치를 늘리고, 불확실성이 높은 거래에서 위험을 줄일 수 있습니다.
멀티 타임 프레임 웨이브 트렌드 트래커 전략은 잘 설계된 트렌드 트래커 시스템으로, 멀티 타임 프레임 웨이브 트렌드 지표의 연동 작용을 통해, 유연한 추적 중지 메커니즘과 결합하여, 시장 추세를 효과적으로 포착하고 위험을 통제한다. 이 전략의 주요 장점은 전체적인 시장 관점과 동적인 위험 관리 방법이지만, 변동 시장에서 도전을 받을 수 있다.
/*backtest
start: 2024-07-07 00:00:00
end: 2024-11-28 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("WT-FLOW: MTF WaveTrend Trend-Follower", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// === WaveTrend Fonksiyonu ===
waveTrend(_src, _n1, _n2) =>
esa = ta.ema(_src, _n1)
d = ta.ema(math.abs(_src - esa), _n1)
ci = (_src - esa) / (0.015 * d)
wt1 = ta.ema(ci, _n2)
wt2 = ta.sma(wt1, 4)
[wt1, wt2]
// === Giriş Fiyatı ve Maksimum Kazanç Değişkenleri ===
var float longEntryPrice = na
var float shortEntryPrice = na
var float maxGainLong = 0.0
var float maxGainShort = 0.0
var int longEntryBar = na
var int shortEntryBar = na
var string currentPosition = ""
// === WT Değerlerini Al (Farklı Zaman Dilimleri) ===
var int n1 = 10
var int n2 = 21
ap = hlc3
[wt1_15, wt2_15] = waveTrend(ap, n1, n2)
[wt1_30, wt2_30] = request.security(syminfo.tickerid, "30", waveTrend(ap, n1, n2))
[wt1_60, wt2_60] = request.security(syminfo.tickerid, "60", waveTrend(ap, n1, n2))
// === Kullanıcı Girdileri: Trailing Stop Parametreleri ===
marginStopPerc = input.float(2.0, "Marjinal Stop (%)")
trailTriggerPerc = input.float(1.5, "Trailing Tetikleyici (%)")
trailFollowPerc = input.float(0.8, "Trailing Takip (%)")
trailMaxDropPerc = input.float(3.0, "Maksimum Düşüş (%)")
// === ATR için tr hesaplaması ===
tr = ta.tr(true)
// === Sinyal Koşulları ===
trendUp = wt1_30 > wt2_30
trendDown = wt1_30 < wt2_30
entryLong = ta.crossover(wt1_15, wt2_15) and wt1_15 > -60 and trendUp
entryShort = ta.crossunder(wt1_15, wt2_15) and wt1_15 < 20 and trendDown
// === Pozisyon Girişleri ===
if entryLong and currentPosition != "Long"
strategy.entry("Long", strategy.long)
longEntryPrice := close
maxGainLong := 0.0
longEntryBar := bar_index
currentPosition := "Long"
label.new(bar_index, high + 2 * tr, "🟢 Giriş Long #" + str.tostring(bar_index), style=label.style_label_up, color=color.green, textcolor=color.white)
if entryShort and currentPosition != "Short"
strategy.entry("Short", strategy.short)
shortEntryPrice := close
maxGainShort := 0.0
shortEntryBar := bar_index
currentPosition := "Short"
label.new(bar_index, low - 2 * tr, "🔴 Giriş Short #" + str.tostring(bar_index), style=label.style_label_down, color=color.red, textcolor=color.white)
// === Trailing Stop ve Marjinal Stop Seviyeleri ===
if currentPosition == "Long" and not na(longEntryPrice)
gainFromEntry = (close - longEntryPrice) / longEntryPrice * 100
maxGainLong := math.max(maxGainLong, gainFromEntry)
trailTriggerReached = gainFromEntry >= trailTriggerPerc
trailStop = close * (1 - trailFollowPerc / 100)
dropStop = longEntryPrice * (1 + (maxGainLong - trailMaxDropPerc) / 100)
finalStop = trailTriggerReached ? math.max(trailStop, dropStop) : longEntryPrice * (1 - marginStopPerc / 100)
if close <= finalStop
strategy.close("Long")
label.new(bar_index, low - 2 * tr, "❅ Çıkış Long #" + str.tostring(longEntryBar), style=label.style_label_down, color=color.red, textcolor=color.white)
longEntryPrice := na
longEntryBar := na
currentPosition := ""
if currentPosition == "Short" and not na(shortEntryPrice)
gainFromEntryShort = (shortEntryPrice - close) / shortEntryPrice * 100
maxGainShort := math.max(maxGainShort, gainFromEntryShort)
trailTriggerReachedShort = gainFromEntryShort >= trailTriggerPerc
trailStopShort = close * (1 + trailFollowPerc / 100)
dropStopShort = shortEntryPrice * (1 - (maxGainShort - trailMaxDropPerc) / 100)
finalStopShort = trailTriggerReachedShort ? math.min(trailStopShort, dropStopShort) : shortEntryPrice * (1 + marginStopPerc / 100)
if close >= finalStopShort
strategy.close("Short")
label.new(bar_index, high + 2 * tr, "❄ Çıkış Short #" + str.tostring(shortEntryBar), style=label.style_label_up, color=color.green, textcolor=color.white)
shortEntryPrice := na
shortEntryBar := na
currentPosition := ""