리소스 로딩... 로딩...

고급 웨이브 트렌드와 EMA 리본 퓨전 거래 전략

저자:차오장, 날짜: 2025-01-06 15:21:57
태그:WTEMAHLC3SMAMA

img

전반적인 설명

이 전략은 웨이브트렌드 오시일레이터 지표와 EMA 리본을 결합한 고급 거래 시스템이다. 이 두 가지 기술적 지표를 통합함으로써 시장 트렌드 역전 지점을 정확하게 파악할 수있는 거래 전략을 만듭니다. 이 전략은 자본을 보호하면서 더 높은 수익을 추구하기 위해 동적 스톱 로스 및 영업 취득 설정을 사용합니다.

전략 원칙

이 전략의 핵심은 거래 신호를 식별하기 위해 웨이브 트렌드 지표와 8 개의 EMA 라인의 시너지 사용에 있다. 웨이브 트렌드 지표는 가격과 이동 평균 사이의 오차를 계산하여 시장 과잉 구매 및 과잉 판매 조건을 측정한다. EMA 리본은 다른 기간 이동 평균의 크로스오버를 통해 트렌드 방향을 확인한다. 구체적으로:

  1. 긴 신호는 EMA2가 EMA8를 넘을 때 또는 파란색 삼각형 신호가 나타나면 (EMA2가 EMA3를 넘을 때) 혈액 다이아몬드 패턴이없는 경우 발생합니다.
  2. EMA8가 EMA2를 넘을 때 또는 혈액 다이아몬드 패턴이 나타날 때 짧은 신호가 발생합니다.
  3. 스톱 로스는 이전 카운터 신호 이후 극심한 지점에 설정되어 있으며, 효과적으로 위험을 제어합니다.
  4. 이윤을 취득하는 목표가 스톱-러스 거리의 2-3배로 설정되어 있으며, 좋은 리스크-리워드 비율을 보여줍니다.

전략적 장점

  1. 이중 확인 메커니즘은 거래 신호 신뢰성을 향상시킵니다.
  2. 동적 스톱 로스 설정은 시장 변동성에 더 잘 적응합니다.
  3. 명확한 위험/이익 비율 설정
  4. EMA 리본은 전체 시장 동향을 결정하는 데 도움이됩니다
  5. 웨이브트렌드 지표는 시장의 과잉 구매/ 과잉 판매 상황을 효과적으로 식별합니다.
  6. 이해하고 실행하기 쉬운 명확한 전략 논리

전략 위험

  1. 다양한 시장에서 자주 잘못된 신호를 생성 할 수 있습니다.
  2. 극심한 변동성 (severe volatility) 에서 다이내믹 스톱 (dynamic stops) 은 쉽게 발동될 수 있습니다.
  3. 역사적인 데이터에 기반한 지표는 시장 체제 변화 중 실패할 수 있습니다.
  4. 여러 가지 기술 지표가 신호 지연을 초래할 수 있습니다. 해결책:
  • 다양한 시장에서 잘못된 신호를 줄이기 위해 변동성 필터를 추가합니다.
  • 더 넓은 스톱 로스 설정을 고려하십시오.
  • 트렌드 강도를 확인하는 메커니즘을 추가

최적화 방향

  1. 동적 스톱 로스 조정을 위해 변동성 지표 (ATR 같은) 를 도입
  2. 신호 신뢰성을 향상시키기 위해 볼륨 확인 메커니즘을 추가
  3. 트렌드 강도 필터를 강한 트렌드 시장에서만 거래하도록 고려하십시오.
  4. 다른 시장 조건에 더 잘 적응하기 위해 WaveTrend 매개 변수를 최적화
  5. 다른 시간 프레임에 걸쳐 신호 시너지를 연구

요약

이 시스템은 트렌드 추적 및 오시일레이터 지표를 기술 분석에서 결합한 완전한 거래 시스템이다. 웨이브트렌드 및 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="空头止盈线")

관련

더 많은