다중 지표 트렌드 추적 전략

저자:차오장, 날짜: 2023-12-27 17:15:45
태그:

img

전반적인 설명

이 전략은다중 지표 트렌드 추적 전략그것은 피셔 변환, 가중 이동 평균 (WMA), 상대 강도 지수 (RSI) 및 균형량 (OBV) 을 포함한 여러 지표를 활용하여 시장의 트렌드 방향을 결정하고 거래의 트렌드를 추적합니다.

전략 논리

  1. 피셔 변환은 가격 변화 추세와 동력을 감지합니다. 네 개의 피셔 선이 동기적으로 색을 변경하면 거래 신호가 생성됩니다.
  2. WMA는 주요 트렌드 방향을 결정합니다. RSI는 가짜 신호를 필터합니다.
  3. OBV로 트렌드를 확인합니다.

특히 피셔 변환은 4개의 라인 - 1x, 2x, 4x 및 8x를 포함합니다. 4개의 라인이 동시에 녹색으로 변하면 긴 신호가 생성됩니다. 4개의 라인이 동시에 빨간색으로 변하면 짧은 신호가 생성됩니다. WMA는 주요 트렌드가 상승 또는 하락 여부를 결정합니다. OBV는 트렌드 방향을 확인합니다. RSI는 잘못된 신호를 필터링합니다.

이점 분석

이 전략의 장점:

  1. 피셔 변환은 운동량에 민감합니다. 피셔 선 4개가 동시에 색을 바꾼다면, 트렌드 반전 확률이 높습니다.
  2. WMA는 트렌드에 반하는 거래를 피하기 위해 주요 트렌드를 결정합니다.
  3. OBV는 실제 트렌드를 확인하고 트렌드 없는 시장에서 거짓 파장을 피합니다.
  4. RSI는 가짜 신호를 필터링하여 거래 신호의 신뢰성을 보장합니다.

여러 지표를 조합함으로써 거래 신호의 정확성과 신뢰성을 보장하고 트렌드를 파악하여 좋은 전략 성과를 낼 수 있습니다.

위험 분석

이 전략의 위험:

  1. 피셔 라인은 시장이 통합되는 경우 잘못된 신호를 생성 할 수 있습니다. 이 경우 RSI는 잘못된 신호를 필터링하는 데 도움이됩니다.
  2. 잘못된 WMA 매개 변수 설정은 트렌드 정확성에 영향을 줄 수 있습니다.
  3. 피셔 트랜스포머는 극단기 트렌드에서 좋은 성과를 내지 못합니다.
  4. 폭포의 감소는 엄청난 손실을 초래할 수 있습니다.

리스크를 완화하기 위해, RSI 매개 변수를 그에 따라 조정할 수 있다. WMA 기간을 최적화 할 수 있다. 또한 막 손실을 설정하여 큰 손실을 피할 수 있다.

최적화 방향

이 전략은 다음 측면에서 더 이상 최적화 될 수 있습니다.

  1. 최적의 매개 변수 조합을 찾기 위해 다른 시간 프레임에 걸쳐 효과를 테스트합니다.
  2. 스톱 손실 메커니즘을 추가합니다. 손실이 특정 수준에 도달하면 스톱 손실을 설정합니다.
  3. 피셔 변환 매개 변수를 추가로 조정하여 역 테스트 결과를 기반으로 최적의 매개 변수 조합을 가장 정확하게 찾습니다.
  4. 강도 지수, 편향 지수 등 다른 필터링 지표를 추가하려고 노력합니다.
  5. 위치 크기를 설정하는 다른 전략을 테스트합니다.

결론

이 전략은 트렌드 방향을 결정하기 위해 피셔 트랜스포름, WMA, OBV 및 RSI를 통합합니다. 강력한 확인 능력과 함께 정확한 거래 신호를 생성하여 트렌드를 따라 수익을 효과적으로 잠금 할 수 있습니다. 추가 매개 변수 최적화로 수익 인자를 향상시킬 수 있습니다. 결론적으로 여러 지표의 조합을 통해이 전략은 좋은 성과로 트렌드를 효과적으로 추적합니다.


/*backtest
start: 2022-12-20 00:00:00
end: 2023-12-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//author Sdover0123
strategy(title='FTR, WMA, OBV & RSI Strat', shorttitle='FTR WMA, OBV, RSI',overlay=false, default_qty_type=strategy.percent_of_equity, initial_capital = 100, default_qty_value=100, commission_value = 0.06, pyramiding = 3)
Len = input.int(10, minval=1, group ="Fisher Transform")
mult1 = input.int(1, minval=1, group ="Fisher Transform")
mult2 = input.int(2, minval=1, group ="Fisher Transform")
mult3 = input.int(4, minval=1, group ="Fisher Transform")
mult4 = input.int(8, minval=1, group ="Fisher Transform")
fish(Length, timeMultiplier) =>
    var nValue1 = 0.0
    var nValue2 = 0.0
    var nFish = 0.0
    xHL2 = hl2
    xMaxH = ta.highest(xHL2, Length * timeMultiplier)
    xMinL = ta.lowest(xHL2, Length * timeMultiplier)
    nValue1 := 0.33 * 2 * ((xHL2 - xMinL) / (xMaxH - xMinL) - 0.5) + 0.67 * nz(nValue1[1])
    if nValue1 > .99
        nValue2 := .999
        nValue2
    else if nValue1 < -.99
        nValue2 := -.999
        nValue2
    else
        nValue2 := nValue1
        nValue2
    nFish := 0.5 * math.log((1 + nValue2) / (1 - nValue2)) + 0.5 * nz(nFish[1])
    nFish
Fisher1 = fish(Len, mult1)
Fisher2 = fish(Len, mult2)
Fisher4 = fish(Len, mult3)
Fisher8 = fish(Len, mult4)

rsiLength = input.int(14, minval=1, group ="Moving Averages")
rsiVal = (ta.rsi(close, rsiLength) - 50) / 10
avg = strategy.position_avg_price

wma(source, length) =>
    sum = 0.0
    for i = 0 to length - 1
        sum := sum + source[i] * (length - i)
    wma = sum / (length * (length + 1) / 2)
    wma

wmaLength = input.int(10, "WMA Length", minval=1, group ="Moving Averages")
wmaClose = wma(close, wmaLength)
// Determine if WMA is bullish or bearish
isWmaBullish = wmaClose > wmaClose[1]
isWmaBearish = wmaClose < wmaClose[1]

//OBV 
src = close
length = input.int(20, title="OBV Length", group="On-Balance Volume")
obv1(src) =>
    change_1 = ta.change(src)
    ta.cum(ta.change(src) > 0 ? volume : change_1 < 0 ? -volume : 0 * volume)*0.01
os = obv1(src)
obv_osc = os - ta.ema(os, length)
obc_color = (obv_osc > 0 ? color.rgb(0, 255, 8) : color.rgb(255, 0, 0))
plot(obv_osc, color=obc_color, style=plot.style_line, title='OBV-Points', linewidth=2)
plot(obv_osc, color=color.new(#b2b5be, 70), title='OBV', style=plot.style_area)
obvBullFilter = input.float(0.1, minval = 0, maxval = 5, step = 0.01, title ="OBV Bullish minimum value", group="On-Balance Volume")
obvBearFilter = input.float(-0.1, minval = -5, maxval = 0, step = 0.01, title ="OBV Bearish minimum value", group="On-Balance Volume")
obvBull = obv_osc > obvBullFilter
obvBear = obv_osc < obvBearFilter

// Add buy/sell signals
ReversalFilterDown = input.float(-0.7, 'Reversal Down TP Filter', -4, 4, step = 0.01, group = "RSI Level Filters", tooltip = "This is defined by taking the RSI value -50 and /10. When all Fisher lines are changing colour, this will SL/TP the long")
ReversalFilterUp = input.float(0.7, 'Reversal Up TP Filter', -4, 4, step = 0.01, group = "RSI Level Filters", tooltip = "This is defined by taking the RSI value -50 and /10. When all Fisher lines are changing colour, this will SL/TP the short")
RSILevelBuyFilter = input.float(1.66, 'RSI Level Buy Filter', -4, 4, step = 0.01, group = "RSI Level Filters", tooltip = "This is defined by taking the RSI value -50 and /10. Consider negative values")
RSILevelSellFilter = input.float(1, 'RSI Level Sell Filter', -4, 4, step = 0.01, group = "RSI Level Filters", tooltip = "This is defined by taking the RSI value -50 and /10. Consider negative values")
//buys - if breaking out and all Fisher are green and RSI filter value is met 
buySignal = Fisher1 > Fisher1[1] and Fisher2 > Fisher2[1] and Fisher4 > Fisher4[1] and Fisher8 > Fisher8[1] and rsiVal > RSILevelBuyFilter and isWmaBullish and obvBull
ReversalUp = Fisher1 > Fisher1[1] and Fisher2 > Fisher2[1] and Fisher4 > Fisher4[1] and Fisher8 > Fisher8[1] and rsiVal > ReversalFilterUp
//sells - if breaking down and all Fisher are green and RSI filter value is met 
sellSignal = Fisher1 < Fisher1[1] and Fisher2 < Fisher2[1] and Fisher4 < Fisher4[1] and Fisher8 < Fisher8[1] and rsiVal < RSILevelSellFilter and isWmaBearish and obvBear
ReversalDown = Fisher1 < Fisher1[1] and Fisher2 < Fisher2[1] and Fisher4 < Fisher4[1] and Fisher8 < Fisher8[1] and rsiVal < ReversalFilterDown


// Buy and Sell conditions
if buySignal and time>timestamp(2022, 06, 01, 09, 30) and barstate.isconfirmed
    strategy.close("Sell", comment = "Close Short")
    strategy.entry("Buy", strategy.long, comment = "Long")

if sellSignal and time>timestamp(2022, 06, 01, 09, 30) and barstate.isconfirmed
    strategy.close("Buy", comment = "Close Long")
    strategy.entry("Sell", strategy.short, comment = "Short")

if ReversalDown
    strategy.close("Buy", comment = "Close Long")

if ReversalUp
    strategy.close("Sell", comment = "Close Short")

//Plotting
//Fisher
plot(Fisher1, color=Fisher1 > nz(Fisher1[1]) ? color.green : color.rgb(255, 0, 0), title='Fisher TF:1')
plot(Fisher2, color=Fisher2 > nz(Fisher2[1]) ? color.green : color.rgb(255, 0, 0), title='Fisher TF:1', linewidth=2)
plot(Fisher4, color=Fisher4 > nz(Fisher4[1]) ? #008000 : #b60000, title='Fisher TF:1', linewidth=3)
plot(Fisher8, color=Fisher8 > nz(Fisher8[1]) ? #004f00 : #b60000, title='Fisher TF:1', linewidth=3)
//RSI
plot(rsiVal, color=rsiVal < 0 ? color.purple : color.yellow, linewidth=2, title='RSI')

//WMA
plot(isWmaBullish ? -2 : na, color=color.rgb(76, 175, 79, 20), linewidth=3, style=plot.style_linebr, title="WMA Bullish")
plot(isWmaBearish ? -2 : na, color=color.rgb(255, 82, 82, 20), linewidth=3, style=plot.style_linebr, title="WMA Bearish")

//Buy/Sell Signals
plotshape(buySignal, title='Buy Signal', location=location.bottom, color=color.new(color.lime, 0), style=shape.triangleup, size=size.small)
plotshape(sellSignal, title='Sell Signal', location=location.top, color=color.new(color.red, 0), style=shape.triangledown, size=size.small)

//Orientation
hline(RSILevelBuyFilter, color=color.rgb(25, 36, 99, 20), linestyle=hline.style_dotted, linewidth=2)
hline(RSILevelSellFilter, color=color.rgb(111, 27, 27, 20), linestyle=hline.style_dotted, linewidth=2)
hline(0, color=color.rgb(181, 166, 144, 39), linestyle=hline.style_dashed, linewidth=2, title = "Zero Line")
hline(1.5, color=color.rgb(217, 219, 220, 50), linestyle=hline.style_dotted, linewidth=2, title = "1.5 // 65 Line")
hline(-1.5, color=color.rgb(217, 219, 220, 50), linestyle=hline.style_dotted, linewidth=2, title = "-1.5 // 35 Line")

더 많은