다중 시간 프레임 RSI 및 스토카스틱 전략

저자:차오장, 날짜: 2024-02-21 15:56:37
태그:

img

전반적인 설명

멀티 타임프레임 RSI 및 스토카스틱스 전략은 시장에서 과잉 구매 및 과잉 판매 조건을 결정하기 위해 여러 시간 프레임에 걸쳐 RSI 및 스토카스틱스 지표를 결합하는 전략이다. 이는 전체 시장 추진력과 과잉 확장도를 측정하기 위해 4 개의 다른 시간 프레임에서 RSI 및 스토카스틱스의 평균 값을 사용합니다. 이것은 다른 시간 프레임에 걸쳐 지표의 강점을 활용 할 수 있습니다.

전략 논리

1. RSI 지표

RSI 지표는 최근 가격 변화의 크기에 따라 과잉 구매 및 과잉 판매 수준을 측정하는 강력한 오시레이터입니다. RSI 값은 0에서 100 사이로 변동하며, 70 이상의 값은 과잉 구매 및 30 이하의 값은 과잉 판매로 간주됩니다.

이 전략은 14주기 RSI를 사용하여 월간, 일간, 4시간 및 1시간 시간 프레임에서 RSI 값을 얻습니다.

2. 스토카스틱 %K

스토카스틱 %K는 시장에서 0에서 100까지의 스케일에서 과반 구매/ 과반 판매 수준을 나타내는 지표입니다. 일반적으로 80 이상의 값은 과반 구매 시장을 나타내고 20 이하의 값은 과반 판매 시장을 나타냅니다.

이 전략은 14,3 스토카스틱 구성을 사용 하 고 또한 앞서 언급 한 시간 프레임에서 %K 값을 얻습니다.

3. 평균 가치 조합

전략의 핵심은 여러 시간 프레임에 걸쳐 두 지표의 평균을 취하는 데 있습니다. 이것은 전체 시장 조건을 측정 할 때 각 시간 프레임의 강점을 활용 할 수 있습니다. 정확한 공식은 다음과 같습니다:

RSI 평균 = (월간 RSI + 일일 RSI + 4H RSI + 1H RSI) / 4

스토카스틱 평균 = (월간 스토카스틱 + 일일 스토카스틱 + 4H 스토카스틱 + 1H 스토카스틱) / 4

4. 무역 신호

이 전략은 RSI 평균이 30 이하로 떨어지고 스토카스틱 평균이 20 이하로 떨어질 때 장을 트리거하고, RSI 평균이 70 이상으로 상승하고 스토카스틱 평균이 80을 넘을 때 단기를 트리거합니다.

롱 포지션은 스토카스틱 평균이 70보다 높고 RSI 평균이 50보다 올라갈 때 닫습니다. 쇼트 포지션은 스토카스틱 평균이 30 이하로 떨어지고 RSI 평균이 50 이하로 떨어지면 닫습니다.

이점 분석

이 전략의 주요 장점은 여러 시간 프레임에 걸쳐 두 개의 지표를 결합하는 데 있습니다. 이것은 거래 신호의 신뢰성을 크게 향상시키고 잘못된 신호를 최소화합니다. 구체적인 장점은 다음과 같습니다.

  1. RSI와 스토카스틱은 서로 신호로 검증된다. 하나의 지표에만 의존하는 것은 잘못된 신호를 더 자주 생성하는 경향이 있다. 이중 지표 접근법은 정확성을 촉진한다.

  2. 여러 시간 프레임은 더 강력한 분석으로 이어집니다. 예를 들어, 월간 및 일간 시간 프레임은 과잉 매입 시장을 보여줍니다. 그러나 더 작은 시간 프레임은 아직 과잉 확장 수준에 도달하지 않았습니다. 이것은 상승 추세가 계속될 가능성이 있음을 시사합니다. 모든 시간 프레임이 일치하면 신호가 더 신뢰할 수 있습니다.

  3. 구조적 전환점을 더 명확하게 식별할 수 있습니다. 여러 시간 프레임에서 동시에 주요 S/R 레벨이 깨지고 트렌드 반전을 신호합니다.

  4. 평균의 자동 계산은 작업 흐름을 단순화합니다. 코드가 데이터 검색, 지표 계산 및 평균을 자동으로 처리하기 때문에 수동 계산이 필요하지 않습니다.

위험 분석

모든 기술 분석 전략과 마찬가지로 핵심 위험은 윙사와 잘못된 신호에 있습니다. 주요 위험은 다음을 포함합니다.

  1. 트렌드 역전으로 인해 중단됩니다. 예를 들어, 가격은 장기간에 걸쳐 회복하기 전에 지지를 넘어 짧은 기간 동안 돌파합니다. 이러한 경우 출구 논리 때문에 단기 손실이 발생할 수 있습니다.

  2. 주요 S/R 레벨의 무효화로 인해 실패한 후속 정지. 주요 S/R 레벨의 중단은 직접적으로 그 이하로 설계된 정지를 유발하여 평균 이상의 손실을 초래할 수 있습니다.

  3. 부적절한 시간 프레임 구성에서 잘못된 판단. 과소 평형 또는 과소 평형 시간 프레임은 잘못된 오시레이터 값을 제공할 수 있습니다.

  4. 덩케르크 효과를 일으키는 시간 프레임 간의 오차: 더 높은 시간 프레임이 과소 구매 시장을 나타내고 더 낮은 시간 프레임은 과소 판매 조건을 나타내고 평균을 비효율화합니다.

솔루션은 스톱 로스 전략을 최적화하고, 동적 S/R 수준을 추적하고, 시간 프레임 매개 변수를 조정하고 추가 필터를 추가하는 것을 포함합니다.

더 나은 기회

논의된 위험을 고려할 때, 향상 기회는 다음을 포함합니다.

  1. 트레이일링 스톱과 부분 출구를 통합하기 위해 스톱 로스 메커니즘을 최적화합니다. 단일 거래 위험을 제어하면서 이윤을 잠금합니다.

  2. 분기 차트와 같은 더 높은 시간 프레임을 추가합니다. 이것은 잘못된 신호를 필터하는 더 큰 트렌드 가이드링을 허용합니다. 오차가 발생하면 더 높은 시간 프레임에서 판독을 우선 순위로합니다.

  3. 좀비 트렌드를 피하기 위해 황소/곰 오차를 통해 추가 트렌드 검증을 위한 볼륨을 포함합니다.

  4. 주요 역사 S/R 주위에서 브레이크오웃을 기다리거나 최적의 풀백 엔트리를 허용함으로써 입력 신호를 정렬합니다.

  5. 역동적인 정지 위치를 위해 최근 변동성 및 ATR 값에 기초한 적응식 정지를 구현합니다.

결론

멀티 타임프레임 RSI 및 스토카스틱스 전략은 RSI와 스토카스틱스의 조합을 여러 시간 프레임에 걸쳐 사용하여 과반 구매/ 과반 판매 수준을 식별하는 명확하고 신뢰할 수있는 접근법입니다. 가장 큰 강점은 위프사와 잘못된 신호 위험을 최소화하기 위해 지표와 시간 프레임의 상호 검증에 있습니다. 그럼에도 불구하고 모든 기술 전략과 마찬가지로 안정적인 자동화 거래 전략으로 정비하기 위해 스톱 손실 최적화, 시간 프레임 선택 등을 통해 해결해야하는 본질적인 위험에 직면합니다.


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

////////////////////////////////////////// MTF Stochastic & RSI Strategy 🚥 ©️ bykzis /////////////////////////////////////////
//

// *** Inspired by "Binance CHOP Dashboard" from @Cazimiro and "RSI MTF Table" from @mobester16 *** and LOT OF COPY of Indicator-Jones MTF Scanner
// 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//@version=5
strategy('MTF RSI & STOCH Strategy🚥 by kzi', overlay=false,initial_capital=100, currency=currency.USD, commission_value=0.01, commission_type=strategy.commission.percent)


// Pair list
var string GRP1       = '══════════    General    ══════════'
overbought = input.int(80, 'Overbought Level', minval=1, group=GRP1)
oversold = input.int(20, 'Oversold Level', minval=1, group=GRP1)


/// Timeframes
var string GRP2       = '══════════   Timeframes   ══════════'
timeframe1 = input.timeframe(title="Timeframe 1", defval="W", group=GRP2)
timeframe2 = input.timeframe(title="Timeframe 2", defval="D", group=GRP2)
timeframe3 = input.timeframe(title="Timeframe 3", defval="240", group=GRP2)
timeframe4 = input.timeframe(title="Timeframe 4", defval="60", group=GRP2)

// RSI settings
var string GRP3       = '══════════   RSI settings   ══════════'
rsiLength = input.int(14, minval=1, title='RSI length', group=GRP3)
rsiSource = input(close, 'RSI Source', group=GRP3)
rsioverbought = input.int(70, 'RSI Overbought Level', minval=1, group=GRP3)
rsioversold = input.int(30, 'RSI Oversold Level', minval=1, group=GRP3)


/// Get RSI values of each timeframe /////////////////////////////////////////////////////
rsi = ta.rsi(rsiSource, rsiLength)
callRSI(id,timeframe) =>
    rsiValue = request.security(id, str.tostring(timeframe), rsi, gaps=barmerge.gaps_off)
    rsiValue

RSI_TF1 = callRSI(syminfo.tickerid, timeframe1)
RSI_TF2 = callRSI(syminfo.tickerid, timeframe2)
RSI_TF3 = callRSI(syminfo.tickerid, timeframe3)
RSI_TF4 = callRSI(syminfo.tickerid, timeframe4)




/////// Calculate Averages /////////////////////////////////////////////////////////////////
calcAVG(valueTF1, valueTF2, valueTF3, valueTF4) =>
    math.round((valueTF1 + valueTF2 + valueTF3 + valueTF4) / 4, 2)

AVG=calcAVG(RSI_TF1, RSI_TF2, RSI_TF3, RSI_TF4)



// Stochastic settings
var string GRP4       = '══════════   Stochastic settings   ══════════'
periodK = input.int(14, '%K length', minval=1, group=GRP4)
smoothK = input.int(3, 'Smooth K', minval=1, group=GRP4)
stochSource = input(close, 'Stochastic Source', group=GRP4)
stochoverbought = input.int(70, 'Stochastic Overbought Level', minval=1, group=GRP4)
stochoversold = input.int(30, 'Stochastic Oversold Level', minval=1, group=GRP4)


/// Get Stochastic values of each timeframe ////////////////////////////////////////////////
stoch = ta.sma(ta.stoch(stochSource, high, low, periodK), smoothK)
getStochastic(id,timeframe) =>
    stochValue = request.security(id, str.tostring(timeframe), stoch, gaps=barmerge.gaps_off)
    stochValue

Stoch_TF1 = getStochastic(syminfo.tickerid, timeframe1)
Stoch_TF2 = getStochastic(syminfo.tickerid, timeframe2)
Stoch_TF3 = getStochastic(syminfo.tickerid, timeframe3)
Stoch_TF4 = getStochastic(syminfo.tickerid, timeframe4)


AVG_STOCH=calcAVG(Stoch_TF1, Stoch_TF2, Stoch_TF3, Stoch_TF4)


plot(AVG, color = color.blue, title='RSI')
plot(AVG_STOCH, color = color.yellow,title='STOCH')
hline(rsioverbought,color=color.red)
hline(rsioversold, color=color.lime)
hline(50, color=color.white)

//============ signal Generator ==================================//

if AVG <= rsioversold and AVG_STOCH <=stochoversold 
    strategy.entry('Buy_Long', strategy.long)

    
strategy.close("Buy_Long",when=(AVG_STOCH >=70 and AVG >=50 and close >=strategy.position_avg_price),comment="Long_OK")

if AVG >=rsioverbought and AVG_STOCH >=stochoverbought
    strategy.entry('Buy_Short', strategy.short)


strategy.close("Buy_Short",when=(AVG_STOCH <=30 and AVG <=50 and close <=strategy.position_avg_price),comment="Short_OK")


///////////////////////////////////////////////////////////////////////////////////////////





더 많은