RSI 축적 이동 평균 크로스오버 전략

저자:차오장, 날짜: 2023-11-23 16:45:55
태그:

img

전반적인 설명

RSI 축적 이동 평균 크로스오버 전략은 RSI 지표와 간단한 이동 평균 라인을 계산하고 둘 사이의 황금 십자가와 죽은 십자가를 관찰하여 거래 신호를 생성합니다. 이 전략은 또한 RSI 축적 이동 평균 라인에 대한 지원 / 저항 판단을 추가하기 위해 볼링거 밴드를 포함합니다.

전략 논리

이 전략은 먼저 14일 RSI 지표를 계산하고, 그 다음 RSI 지표의 8일 간단한 이동 평균 라인을 계산합니다. RSI 지표가 이동 평균 라인을 넘을 때 구매 신호가 생성되며, RSI가 이동 평균 라인을 넘을 때 판매 신호가 생성됩니다.

동시에, 전략은 표준편차를 계산하여 RSI 축적 이동평균선이 상대적으로 과밀인지 여부를 결정하기 위해 볼린저 밴드를 추가하여, 따라서 최고를 구매하고 바닥을 판매하는 것을 피합니다.

이점 분석

RSI 축적 이동 평균 크로스오버 전략은 트렌드 지표 RSI와 곡선을 따르는 지표 이동 평균선을 결합하여 시장 추세와 무작위성을 효과적으로 결정할 수 있습니다. RSI 지표의 수학적 평균은 신호에 대한 가격 변동의 영향을 부드럽게 할 수 있습니다.

이 전략에 추가된 볼링거 밴드는 상단 및 하단 트랙의 폭을 자동으로 조정하기 위해 표준편차의 원리를 사용하여 잘못된 거래 신호를 효과적으로 방지합니다. 볼링거 밴드가 좁아지면 변화가 점차 느려지고 있음을 나타냅니다. 이는 역전 기회를 찾는 데 적합합니다. 볼링거 밴드가 확장되면 격렬한 시장 변동의 기간을 나타냅니다. 이는 트렌드를 추적하는 데 적합합니다.

위험 분석

RSI 축적 이동 평균 크로스오버 전략의 가장 큰 위험은 RSI 지표와 이동 평균 라인의 뒤떨림입니다. 빠른 시장 움직임이 발생하면 지표 계산과 트렌드 판단이 어느 정도 뒤떨어질 것입니다. 이것은 구매 지점을 높이고 판매 지점을 낮추게됩니다.

또 다른 주요 위험은 시장 트렌드가 황소에서 호황으로 변하거나 반대로 RSI와 MA 지표가 적시에 반응하지 않아 거래 손실로 이어질 때 지표의 오도입니다.

해결책은 RSI 매개 변수를 적절히 조정하고 MA 기간을 단축하고 판단에 도움이되는 트렌드 지표를 추가하고 적절한 중지 손실 범위를 넓히는 것을 포함합니다.

최적화 방향

RSI 축적 이동 평균 크로스오버 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.

  1. RSI 매개 변수를 최적화: 감수성과 안정성을 균형 잡기 위해 RSI 길이를 조정

  2. MA 매개 변수를 최적화: 트렌드 추적을 최적화하기 위해 MA 유형 및 기간 매개 변수를 조정합니다.

  3. 중지 손실 메커니즘을 추가: 이동 또는 시간 중지 손실을 설정 단일 손실을 제어

  4. 트렌드 지표를 포함: MACD, KDJ 등을 추가하여 반전 판단 오류를 피합니다.

  5. 여러 시간 프레임 검증: 함정에 빠지지 않도록 추세를 결정하기 위해 더 긴 시간 프레임을 사용

결론

RSI 축적 이동 평균 크로스오버 전략은 전반적으로 성숙한 양적 거래 전략이다. 여러 기술적 지표의 장점을 결합하고 매개 변수 조정 및 다차원 최적화를 통해 주류 시장 움직임을 잡을 수 있습니다. 가장 큰 위험은 지표의 지연입니다. 손실을 제어하기 위해 손해를 막아야합니다. 올바르게 구현되면이 전략은 비교적 안정적인 투자 수익을 얻을 수 있습니다.


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

//@version=5
// Copyright (c) 2020-present, Alex Orekhov (everget)
// Corrected Moving Average script may be freely distributed under the terms of the GPL-3.0 license.
strategy('rsisma', shorttitle='rsisma')

ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "Bollinger Bands" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

rsiLengthInput = input.int(14, minval=1, title="RSI Length", group="RSI Settings")
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
maTypeInput = input.string("SMA", title="MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA Settings")
maLengthInput = input.int(14, title="MA Length", group="MA Settings")
bbMultInput = input.float(2.0, minval=0.001, maxval=50, title="BB StdDev", group="MA Settings")

up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
rsiMA = ma(rsi, maLengthInput, maTypeInput)
isBB = maTypeInput == "Bollinger Bands"

plot(rsi, "RSI", color=#7E57C2)
plot(rsiMA, "RSI-based MA", color=color.blue)
rsiUpperBand = hline(70, "RSI Upper Band", color=#787B86)
hline(50, "RSI Middle Band", color=color.new(#787B86, 50))
rsiLowerBand = hline(30, "RSI Lower Band", color=#787B86)
fill(rsiUpperBand, rsiLowerBand, color=color.rgb(126, 87, 194, 90), title="RSI Background Fill")
bbUpperBand = plot(isBB ? rsiMA + ta.stdev(rsi, maLengthInput) * bbMultInput : na, title = "Upper Bollinger Band", color=color.green)
bbLowerBand = plot(isBB ? rsiMA - ta.stdev(rsi, maLengthInput) * bbMultInput : na, title = "Lower Bollinger Band", color=color.green)
fill(bbUpperBand, bbLowerBand, color= isBB ? color.new(color.green, 90) : na, title="Bollinger Bands Background Fill")


long = ta.crossover(rsi, rsiMA)
short = ta.crossunder(rsi, rsiMA)
if long
    strategy.entry("long", strategy.long)
if short
    strategy.close("long", comment = "long TP")

 
// long1 = close * 9
// long2 = long1 / 100
// long3 = long2 + close


//plot(long3,color=color.blue)
// if short
//     strategy.entry("short", strategy.short)
// if long
//     strategy.close("short", comment = "short TP")




더 많은