B-Xtrender 기하급수적인 이동 평균 크로스오버 전략

저자:차오장, 날짜: 2024-02-20 14:45:17
태그:

img

전반적인 설명

이것은 지수적인 이동 평균 (EMA) 크로스오버 원리에 기반한 거래 전략입니다. 또한 RSI 지표와 이동 평균 필터를 통합하여 상대적으로 완전한 트렌드 추적 및 역전 거래 시스템을 형성합니다.

전략 논리

  1. 빠르고 느린 EMA 크로스오버를 통해 거래 신호를 생성합니다. 빠른 라인은 5 및 20 일 EMA 크로스오버를 사용하고 느린 라인은 20 및 15 일 EMA 크로스오버를 사용합니다.
  2. 빠른 선이 느린 선 위에 넘어가면 긴 선으로 이동하고 빠른 선이 아래에 넘어가면 짧은 선으로 이동합니다. RSI를 2차 확인으로 사용하며, RSI가 같은 방향으로 넘어가면 신호만 받습니다.
  3. 200일 이동 평균 필터를 추가하여 불안정한 기간 동안 신호를 피합니다. 거래는 가격이 먼저 이 기본 MA를 통과 할 때만 수행됩니다.

장점

  1. RSI 확인은 신호 신뢰성을 크게 향상시키고 잘못된 신호를 감소시킵니다.
  2. EMA 매개 변수 선택은 감수성과 안정성을 균형을 맞추고 있습니다.
  3. MA 필터는 불필요한 거래를 피하기 위해 소음을 제거합니다.

위험성

  1. EMA는 급격한 가격 변동, 증가하는 손실 또는 신호가 부족해지면서 문제가 있습니다.
  2. 낮은 RSI 설정도 신호 지연을 일으킬 수 있습니다.
  3. MA 필터는 초기 트렌드 신호를 필터링할 수 있습니다.

더 나은 기회

  1. EMA 매개 변수를 순환에 따라 동적으로 최적화합니다.
  2. MACD와 같은 다른 지표와 실험하여 RSI와 결합합니다.
  3. 최적의 노이즈 감축과 기회 포착을 위한 미세 조율 MA 필터 매개 변수

결론

이것은 신호 품질을 높이기 위해 추가 RSI 확인과 함께 완전한 EMA 거래 시스템을 구축하는 전반적인 견고한 전략입니다. 연구와 최적화를 할 가치가 있습니다. 그러나 고유한 지표 지연 위험은 적절한 스톱 로스로 관리되어야합니다.


/*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)    

더 많은