RSI 역전 거래 전략

저자:차오장, 날짜: 2024-01-30 17:06:45
태그:

img

전반적인 설명

이 전략은 RSI 지표를 사용하여 과잉 매입 구역에서 하락 크로스오버에 단축하고 과잉 매매 구역에서 상승 크로스오버에 장면을 취하기 위해 과잉 매입 및 과잉 판매 시장 조건을 식별합니다. 이는 지표에 기반한 반전 거래 전략입니다. 전략은 트렌드 트레일링 스톱과 고정 취득/손실 스톱을 통합하여 거래 위험을 효과적으로 제어합니다.

전략 논리

이 전략의 거래 신호는 RSI 지표의 상승/하락 크로스오버를 기반으로 생성된다. RSI 지표는 일반적으로 30을 과소매 라인, 70을 과소매 라인으로 사용합니다. RSI 라인이 과소매 라인 위에 넘어가면 구매 신호가 생성됩니다. RSI 라인이 과소매 라인 아래에 넘어가면 판매 신호가 생성됩니다. 이 논리에 기초하여 전략은 과소매와 과소매 구역을 식별하고 그에 따른 긴/단 신호를 생성합니다.

포지션에 진입한 후, 전략은 최대/최저 가격을 지속적으로 업데이트하여 최대/최저 가격을 지속적으로 업데이트하여 최대/최저 가격을 계속 유지하며, 최대/최저 가격을 계속 유지하며, 최대/최저 가격을 유지하며, 최대/최저 손실을 달성하거나 최대/최대 손실을 초과할 때 포지션을 종료하는 고정된 수익 및 손실을 취하는 레벨도 있습니다. 이 조합은 거래 위험을 효과적으로 제어할 수 있습니다.

이점 분석

이 전략의 장점은 다음과 같습니다.

  1. 과잉 구매/ 과잉 판매 수준을 식별하기 위해 RSI를 사용하는 것은 시장 전환점을 안정적으로 파악하는 성숙한 거래 기술입니다.

  2. 상승/하락 크로스오버를 사용하면 일부 잘못된 신호를 필터링하고 거래가 더 신뢰할 수 있습니다.

  3. 트렌드 트레일링 스톱은 가능한 한 이익을 잠금하고 동시에 거래 당 손실을 억제하기 위해 빠른 스톱 아웃을 가지고 있습니다.

  4. 고정된 TP/SL 수준은 또한 거래별 리스크를 효과적으로 제어합니다.

  5. 전체적으로 간단하고 명확한 논리, 이해하기 쉽고 실행하기 쉽고 초보자도 적합합니다.

위험 분석

이 전략의 위험은 다음과 같습니다.

  1. RSI 신호는 거짓이 될 수 있고, 패턴 실패의 가능성이 높고, 스톱 로스 트리거로 이어질 수 있습니다.

  2. 고정 TP/SL는 시장 변동에 적응할 수 없으며, 수익을 단축하거나 손실을 줄일 수 있습니다.

  3. 비율 추월은 최고/최저 가격을 따릅니다. 너무 공격적이어서 수익을 남길 수도 있습니다.

  4. 패러미터로서의 과도한 위험은 역사적 데이터에만 최적화 될 수 있습니다.

  5. 높은 거래 빈도 거래 비용과 미끄러짐을 증가시킵니다.

최적화 방향

전략을 개선할 수 있는 방법:

  1. 가장 좋은 결과를 위해 RSI 매개 변수를 최적화합니다.

  2. 더 높은 신호 정확성을 위해 필터 지표를 추가합니다.

  3. 시장 변동성에 기초한 적응식 스톱/이익

  4. 거래 비용을 줄이기 위해 거래 빈도를 제한하십시오.

  5. 거래당 손실을 제한하기 위해 포지션 크기를 추가합니다.

  6. 안정성 테스트를 위해 더 긴 시간 내에 백테스트를 합니다.

결론

요약하자면, 이것은 지나치게 구매/ 지나치게 팔린 것을 식별하기 위해 RSI를 사용하는 전형적인 반전 전략이며, 황소/곰 교차가 신호입니다. 트렌드 트레일링 정지 및 고정 TP/SL는 위험을 관리합니다. 논리는 간단하고 쉽게 구현되며 초보자도 적합합니다. 그러나 잘못된 신호 및 곡선 적합성 같은 위험은 라이브 거래 전에 추가 검증과 최적화로 해결해야합니다.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// LOVE JOY PEACE PATIENCE KINDNESS GOODNESS FAITHFULNESS GENTLENESS SELF-CONTROL 
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// Author: © JoshuaMcGowan
// Taken from https://www.tradingview.com/script/GbZGYi6l-Adding-some-essential-components-to-a-prebuilt-RSI-strategy/
// Just updated to compile in version 4. 

//@version=4

strategy("Adding some essential components to a prebuilt RSI strategy", overlay=true)

/////////////// Component Code Start ///////////////

testStartYear = input(2011, "Backtest Start Year") 
testStartMonth = input(8, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2100, "Backtest Stop Year")
testStopMonth = input(9, "Backtest Stop Month")
testStopDay = input(29, "Backtest Stop Day")
// testStopDay = testStartDay + 1
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
    
/////////////// Component Code Stop ///////////////

// Replace RSI Component, Long/Short, and Long Signal/Short Signal conditions with your trade setup components.
///////////// RSI component /////////////

length = input( 14 )
overSold = input( 30 )
overBought = input( 70 )
price = close

vrsi = rsi(price, length)
notna = not na(vrsi)

/////////////// STRATEGY ///////////////

ts = input(99999, "Trailing Stop") / 100
tp = input(99999, "Take Profit") / 100
sl = input(99999, "Stop Loss") / 100

// Update this with your setup. 
long = notna and crossover(vrsi, overSold)
short = notna and crossunder(vrsi, overBought)

last_long = 0
last_short = 0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

// Update this to reflect your setup. 
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

float last_open_long_signal = 0
float last_open_short_signal = 0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0
last_short_signal = 0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

float last_high = 0
float last_low = 0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

long_ts = not na(last_high) and high <= (last_high - ts) //and high >= last_open_long_signal
short_ts = not na(last_low) and low >= (last_low + ts) //and low <= last_open_short_signal

long_tp = high >= (last_open_long_signal + tp)
short_tp = low <= (last_open_short_signal - tp)

long_sl = low <= (last_open_long_signal - sl)
short_sl = high >= (last_open_short_signal + sl)

leverage = input(200, "Leverage")
long_call = last_open_long_signal - (0.8 + 0.2 * (1/leverage)) / leverage * last_open_long_signal
short_call = last_open_short_signal + (0.78 + 0.2 * (1/leverage)) / leverage * last_open_short_signal
long_call_signal = low <= long_call
short_call_signal = high >= short_call

if testPeriod()
    strategy.entry("Long", strategy.long, when=long_signal)
    strategy.entry("Short", strategy.short, when=short_signal)

    // plot(long_call, color=color.red)
    // plot(short_call, color=color.green)
    strategy.close("Long", when=long_call_signal)
    strategy.close("Short", when=short_call_signal)
    strategy.close("Long", when=long_tp)
    strategy.close("Short", when=short_tp)
    strategy.close("Long", when=long_sl)
    strategy.close("Short", when=short_sl)
    strategy.close("Long", when=long_ts)
    strategy.close("Short", when=short_ts)







더 많은