고급 WaveTrend 및 EMA 리본 퓨전 트레이딩 전략

WT EMA HLC3 SMA MA
생성 날짜: 2025-01-06 15:21:57 마지막으로 수정됨: 2025-01-06 15:21:57
복사: 3 클릭수: 405
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

고급 WaveTrend 및 EMA 리본 퓨전 트레이딩 전략

개요

이 전략은 WaveTrend 오실레이터와 EMA 이동 평균 대역을 결합한 고급 거래 시스템입니다. 이 두 가지 기술 지표를 통합하면 시장 추세의 전환점을 정확하게 포착할 수 있는 거래 전략이 형성됩니다. 이 전략은 역동적인 손절매 및 손절매 설정을 채택하여 자본 안전을 보호하는 동시에 더 높은 수익을 추구합니다.

전략 원칙

전략의 핵심은 WaveTrend 지표와 8개의 EMA 이동 평균을 조정하여 거래 신호를 식별하는 것입니다. WaveTrend 지표는 가격과 이동 평균선 간의 편차를 계산하여 시장의 매수 과다 또는 매도 과다 상태를 측정합니다. EMA 이동평균선은 다양한 기간의 이동평균선을 교차하여 추세 방향을 확인합니다. 구체적으로:

  1. EMA2가 EMA8을 교차하거나 파란색 삼각형 신호가 나타나고(EMA2가 EMA3을 교차) 블러드 다이아몬드 패턴이 없으면 롱 신호가 발생합니다.
  2. EMA8이 EMA2를 교차하거나 피 묻은 다이아몬드 패턴이 나타나면 짧은 신호가 발생합니다.
  3. 손절매 설정은 이전 역방향 신호 이후의 극점을 사용하여 위험을 효과적으로 제어할 수 있습니다.
  4. 이익 목표는 손절매 거리의 2~3배로 설정되어 있어 양호한 위험 대비 수익률을 반영합니다.

전략적 이점

  1. 이중 확인 메커니즘으로 거래 신호의 신뢰성 향상
  2. 동적 손절매 설정은 시장 변동에 더 잘 적응할 수 있습니다.
  3. 명확한 위험-수익 비율 설정
  4. EMA 이동 평균 대역을 사용하면 전체 시장 추세를 파악하는 데 도움이 됩니다.
  5. WaveTrend 지표는 매수 과다 및 매도 과다 시장 상황을 효과적으로 식별할 수 있습니다.
  6. 전략 논리는 명확하고 이해하기 쉬우며 구현하기 쉽습니다.

전략적 위험

  1. 변동성이 큰 시장에서는 잘못된 신호가 자주 발생할 수 있습니다.
  2. 변동성이 큰 상황에서는 동적 손절매가 쉽게 발생할 수 있습니다.
  3. 과거 데이터에 의존하는 지표는 시장이 급격하게 변화할 경우 실패할 수 있습니다.
  4. 여러 기술 지표를 사용하면 신호가 지연될 수 있습니다. 해결책:
  • 변동성 필터를 추가하면 변동성 시장에서 잘못된 신호를 줄일 수 있습니다.
  • 더 느슨한 손절매 설정을 사용하는 것을 고려하세요
  • 추세 강도 확인 메커니즘 추가

전략 최적화 방향

  1. 시장 변동성 지표(예: ATR)를 도입하여 손절매 거리를 동적으로 조정합니다.
  2. 신호 안정성을 향상시키기 위해 볼륨 확인 메커니즘 추가
  3. 강력한 추세 시장에서만 거래하려면 추세 강도 필터를 추가하는 것을 고려하세요.
  4. 다양한 시장 환경에 더 잘 적응하기 위해 WaveTrend 매개변수를 최적화합니다.
  5. 다양한 시간대의 신호 시너지 연구

요약하다

이는 추세 추종과 기술 분석의 오실레이터를 결합한 완전한 거래 시스템입니다. WaveTrend와 EMA 이동평균선을 함께 사용하면 전반적인 추세를 파악할 수 있을 뿐만 아니라 추세의 전환점에서 적절한 시기에 시장에 진입할 수도 있습니다. 역동적인 손절매 및 손절매 관리 메커니즘은 전략에 우수한 위험 관리 역량을 제공합니다. 전략의 최적화 공간은 주로 신호 ​​필터링과 위험 관리의 개선에 있습니다.

전략 소스 코드
/*backtest
start: 2024-12-06 00:00:00
end: 2025-01-04 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("VuManChu Cipher A Strategy", overlay=true, initial_capital=10000, default_qty_type=strategy.fixed, default_qty_value=1.0)

// === 函数定义 ===
// WaveTrend函数
f_wavetrend(_src, _chlen, _avg, _malen) =>
    _esa = ta.ema(_src, _chlen)
    _de = ta.ema(math.abs(_src - _esa), _chlen)
    _ci = (_src - _esa) / (0.015 * _de)
    _tci = ta.ema(_ci, _avg)
    _wt1 = _tci
    _wt2 = ta.sma(_wt1, _malen)
    [_wt1, _wt2]

// EMA Ribbon函数
f_emaRibbon(_src, _e1, _e2, _e3, _e4, _e5, _e6, _e7, _e8) =>
    _ema1 = ta.ema(_src, _e1)
    _ema2 = ta.ema(_src, _e2)
    _ema3 = ta.ema(_src, _e3)
    _ema4 = ta.ema(_src, _e4)
    _ema5 = ta.ema(_src, _e5)
    _ema6 = ta.ema(_src, _e6)
    _ema7 = ta.ema(_src, _e7)
    _ema8 = ta.ema(_src, _e8)
    [_ema1, _ema2, _ema3, _ema4, _ema5, _ema6, _ema7, _ema8]

// === 变量声明 ===
var float stopPrice = na      // 止损价格变量
var float targetPrice = na    // 止盈价格变量
var float lastLongPrice = na
var float lastShortPrice = na
var float highestSinceLastLong = na
var float lowestSinceLastShort = na

// === WaveTrend参数 ===
wtChannelLen = input.int(9, title = 'WT Channel Length')
wtAverageLen = input.int(13, title = 'WT Average Length')
wtMASource = hlc3
wtMALen = input.int(3, title = 'WT MA Length')

// === EMA Ribbon参数 ===
ema1Len = input.int(5, "EMA 1 Length")
ema2Len = input.int(11, "EMA 2 Length")
ema3Len = input.int(15, "EMA 3 Length")
ema4Len = input.int(18, "EMA 4 Length")
ema5Len = input.int(21, "EMA 5 Length")
ema6Len = input.int(24, "EMA 6 Length")
ema7Len = input.int(28, "EMA 7 Length")
ema8Len = input.int(34, "EMA 8 Length")

// === 计算指标 ===
// WaveTrend计算
[wt1, wt2] = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen)

// WaveTrend交叉条件
wtCross = ta.cross(wt1, wt2)
wtCrossDown = wt2 - wt1 >= 0

// EMA Ribbon计算
[ema1, ema2, ema3, ema4, ema5, ema6, ema7, ema8] = f_emaRibbon(close, ema1Len, ema2Len, ema3Len, ema4Len, ema5Len, ema6Len, ema7Len, ema8Len)

// === 交易信号 ===
longEma = ta.crossover(ema2, ema8)
shortEma = ta.crossover(ema8, ema2)
redCross = ta.crossunder(ema1, ema2)
blueTriangle = ta.crossover(ema2, ema3)
redDiamond = wtCross and wtCrossDown
bloodDiamond = redDiamond and redCross

// 更新最高最低价
if not na(lastLongPrice)
    highestSinceLastLong := math.max(high, nz(highestSinceLastLong))
if not na(lastShortPrice)
    lowestSinceLastShort := math.min(low, nz(lowestSinceLastShort))

// === 交易信号条件 ===
longCondition = longEma or (blueTriangle and not bloodDiamond)
shortCondition = shortEma or bloodDiamond

// === 执行交易 ===
if (longCondition)
    // 记录多头入场价格
    lastLongPrice := close
    // 重置最高价跟踪
    highestSinceLastLong := high
    
    stopPrice := nz(lowestSinceLastShort, close * 0.98)  // 使用前一个空头信号后的最低价作为止损
    float riskAmount = math.abs(close - stopPrice)
    targetPrice := close + (riskAmount * 2)  // 止盈为止损距离的2倍
    
    strategy.entry("做多", strategy.long)
    strategy.exit("多头止盈止损", "做多", limit=targetPrice, stop=stopPrice)

if (shortCondition)
    // 记录空头入场价格
    lastShortPrice := close
    // 重置最低价跟踪
    lowestSinceLastShort := low
    
    stopPrice := nz(highestSinceLastLong, close * 1.02)  // 使用前一个多头信号后的最高价作为止损
    float riskAmount = math.abs(stopPrice - close)
    targetPrice := close - (riskAmount * 3)  // 止盈为止损距离的2倍
    
    strategy.entry("做空", strategy.short)
    strategy.exit("空头止盈止损", "做空", limit=targetPrice, stop=stopPrice)

// === 绘制信号 ===
plotshape(longCondition, style=shape.triangleup, color=color.green, location=location.belowbar, size=size.small, title="做多信号")
plotshape(shortCondition, style=shape.triangledown, color=color.red, location=location.abovebar, size=size.small, title="做空信号")

// 绘制止损线
plot(strategy.position_size > 0 ? stopPrice : na, color=color.red, style=plot.style_linebr, linewidth=2, title="多头止损线")
plot(strategy.position_size < 0 ? stopPrice : na, color=color.red, style=plot.style_linebr, linewidth=2, title="空头止损线")

// 绘制止盈线
plot(strategy.position_size > 0 ? targetPrice : na, color=color.green, style=plot.style_linebr, linewidth=2, title="多头止盈线")
plot(strategy.position_size < 0 ? targetPrice : na, color=color.green, style=plot.style_linebr, linewidth=2, title="空头止盈线")