지수 이동 평균 교차 B-Xtrender 전략


생성 날짜: 2024-02-20 14:45:17 마지막으로 수정됨: 2024-02-20 14:45:17
복사: 0 클릭수: 1666
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

지수 이동 평균 교차 B-Xtrender 전략

개요

이 전략은 지수 평행선 교차 원칙에 기반한 거래 전략이다. 이 전략은 RSI 지표와 평행선 필터를 결합하여 보다 완전한 트렌드 추적 및 역전 거래 시스템을 형성한다.

전략 원칙

  1. 지수 이동 평균의 빠른 느린 교차를 이용하여 거래 신호를 형성한다. 빠른 선의 파라미터는 5일과 20일선의 EMA 교차, 느린 선의 파라미터는 20일과 15일선의 EMA 교차이다.
  2. 빠른 선에서 느린 선을 통과할 때 더 많이 하고, 빠른 선 아래의 느린 선을 통과할 때 공백을 한다. RSI 지표를 사용하여 2차 검증을 하고, RSI도 동방향 교차할 때만 거래 신호의 유효성을 확인한다.
  3. 200일 이동 평균을 필터로 사용하면, 가격이 그 평균선을 넘으면 거래 신호를 발산할 수 있으며, 이로 인해 충격적인 상황에서 여러 개의 가짜 교차가 발생하지 않습니다.

전략적 이점

  1. 이중 EMA 교차는 RSI 지표와 결합하여 신호의 신뢰성을 크게 높이고, 가짜 신호의 비율을 낮춘다.
  2. 빠른 속도 EMA 파라미터를 조합하여 거래 신호의 민감성을 고려하고 신호의 안정성을 보장합니다.
  3. 평선 필터를 추가하여 진동 시 발생하는 소음을 효과적으로 필터링하여 불필요한 거래를 방지합니다.

전략적 위험

  1. EMA는 지연 지표이며, 가격의 급격한 변화로 인해 명백한 지연이 발생합니다. 이것은 손실을 증가시키거나 신호가 누락되는 위험을 초래합니다.
  2. RSI 파라미터를 잘못 설정하면 신호가 지연될 수 있다.
  3. 평행 필터는 동요시장을 피할 수 있지만, 트렌드 초기에는 초기 진입 기회를 필터링 할 수 있습니다.

전략 최적화 방향

  1. 동적으로 EMA 변수를 조정하여 다른 주기에서 최적의 변수 조합을 선택한다.
  2. 다른 지표들, 예를 들어 MACD와 RSI를 조합해보세요.
  3. 비소음과 기회의 균형을 잡기 위해 일률적인 필터 변수를 최적화하십시오.

요약하다

이 전략은 전반적으로 더 완전한 지수 이동 평균 거래 시스템을 구축하는 것이다. 거래 신호를 확보하는 데 기초하여 RSI 지표를 추가로 도입하여 다층 검증을 한다. 이것은 의심의 여지없이 신호 품질을 크게 향상시킬 수 있으며, 학습 및 최적화 할 가치가있는 전략이다. 물론 지표 자체의 지연 특성으로 인해 상쇄 손실을 예방하는 데 주의를 기울여야 한다.

전략 소스 코드
/*backtest
start: 2023-02-13 00:00:00
end: 2024-02-19 00:00:00
period: 1d
basePeriod: 1h
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/
// © QuantTherapy
//@version=4
strategy("B-Xtrender [Backtest Edition] @QuantTherapy")

i_short_l1  = input(5 , title="[Short] L1")
i_short_l2  = input(20, title="[Short] L2")
i_short_l3  = input(15, title="[Short] L3")

i_long_l1   = input(20, title="[Long] L1")
i_long_l2   = input(15, title="[Long] L2")

i_ma_use    = input(true , title="[MA Filter] Yes/No" )
i_ma_len    = input(200  , title="[MA Filter] length" )
i_ma_type   = input("EMA", title="[MA Filter] type", options = ["SMA", "EMA"])

shortTermXtrender = rsi( ema(close, i_short_l1) - ema(close, i_short_l2), i_short_l3 ) - 50
longTermXtrender  = rsi( ema(close, i_long_l1), i_long_l2 ) - 50

shortXtrenderCol = shortTermXtrender > 0 ? shortTermXtrender > shortTermXtrender[1] ? color.lime : #228B22 : shortTermXtrender > shortTermXtrender[1] ? color.red : #8B0000
plot(shortTermXtrender, color=shortXtrenderCol, style=plot.style_columns, linewidth=1, title="B-Xtrender Osc. - Histogram", transp = 40)

longXtrenderCol   = longTermXtrender> 0 ? longTermXtrender > longTermXtrender[1] ? color.lime : #228B22 : longTermXtrender > longTermXtrender[1] ? color.red : #8B0000
macollongXtrenderCol =  longTermXtrender > longTermXtrender[1] ? color.lime : color.red
plot(longTermXtrender , color=longXtrenderCol, style=plot.style_columns, linewidth=2, title="B-Xtrender Trend - Histogram", transp = 90)

plot(longTermXtrender , color=#000000             , style=plot.style_line, linewidth=5, title="B-Xtrender Trend - Line", transp = 100)
plot(longTermXtrender , color=macollongXtrenderCol, style=plot.style_line, linewidth=3, title="B-Xtrender Trend - Line", transp = 100)

// --- Initialize MA Filter
ma = i_ma_type == "EMA" ? ema(close, i_ma_len) : sma(close, i_ma_len)
maFilterLong = true
maFilterShort = true
if i_ma_use
    maFilterLong  := close > ma ? true : false
    maFilterShort := close < ma ? true : false

long  = shortTermXtrender > 0 and longTermXtrender > 0 and maFilterLong
closeLong = shortTermXtrender < 0 or longTermXtrender < 0 
short = shortTermXtrender < 0 and longTermXtrender < 0 and maFilterShort
closeShort = shortTermXtrender > 0 or longTermXtrender > 0 

plotshape(long[1]==true  and long[2]==false  ? 0 : na , location=location.absolute, style=shape.labelup  , color=color.lime, size=size.small, transp=10)
plotshape(short[1]==true and short[2]==false ? 0 : na, location=location.absolute, style=shape.labeldown, color=color.red , size=size.small, transp=10)
plotshape(closeLong[1]==true and closeLong[2]==false
 or closeShort[1]==true and closeShort[2]==false ? 0 : na, location=location.absolute, style=shape.circle, color=color.orange , size=size.small)

i_perc     = input(defval = 20.0, title = "[TSL-%] Percent"  , minval = 0.1 )
i_src = close // constant for calculation
sl_val = i_src * i_perc / 100

strategy.entry("Long", strategy.long, when = long ) 
strategy.close("Long", when = closeLong)

strategy.entry("Short", strategy.short, when = short) 
strategy.close("Short", when = closeShort)

// Calculate SL
longStopPrice = 0.0, shortStopPrice = 0.0
longStopPrice := if (strategy.position_size > 0)
    stopValue = close - sl_val
    max(stopValue, longStopPrice[1])
else
    0

shortStopPrice := if (strategy.position_size < 0)
    stopValue = close + sl_val
    min(stopValue, shortStopPrice[1])
else
    syminfo.mintick*1000000

// For TSL Visualisation on Chart    
// plot(series=(strategy.position_size > 0) ? longStopPrice : na,
//      color=color.fuchsia, style = plot.style_circles,
//      linewidth=1, title="Long Trail Stop")
     
// plot(series=(strategy.position_size < 0) ? shortStopPrice : na,
//      color=color.fuchsia, style = plot.style_circles,
//      linewidth=1, title="Short Trail Stop")

if (strategy.position_size > 0)
    strategy.exit(id="TSL Long", stop=longStopPrice)

if (strategy.position_size < 0)
    strategy.exit(id="TSL Short", stop=shortStopPrice)