이 전략의 핵심 아이디어는 다른 사이클의 RSI 지표를 결합하여 현재 가격 범위를 결정하고, 더 큰 사이클 RSI에서 파격이 있을 때 더 작은 사이클에서 대응하는 구매 또는 판매 행동을 취하는 것입니다. 이 전략은 다양한 기간에 걸쳐 기술 지표를 활용하여 여러 시간 차원에서 현재 가격의 상대적 가치를 판단하고 더 나은 입구점을 찾습니다.
가격 범위를 결정하고 거래 기회를 찾는 이 전략의 주요 단계는 다음과 같습니다.
예를 들어, 일일 RSI가 이전 최고치를 깨는 경우, 우리는 현재 황소 시장이라고 판단합니다. 그리고 일일 RSI가 이전 최저치를 넘을 때, 우리는 곰 시장으로 판단합니다. 두 경우 모두 5 분 차트에서 각각 길고 짧은 행동을 취합니다.
한 기간에만 초점을 맞춘 전통적인 전략과 비교하면 이 전략은 다음과 같은 장점을 가지고 있습니다.
현재 상대 가격 가치에 대한 더 정확한 평가. 매일과 같은 더 큰 주기는 단기 시장 소음을 필터링하고 전체 추세와 가치 영역을 결정할 수 있습니다.
기간 간 지표를 결합하면 신호 신뢰성이 향상됩니다. 단일 기간 지표에만 의존하면 여러 기간의 동시 신호가 더 신뢰할 수 있지만 잘못된 신호를 더 쉽게 생성 할 수 있습니다.
단기적인 기회를 보다 효과적으로 활용합니다. 큰 사이클의 파업은 전반적인 방향을 나타냅니다.
더 작은 마감. 교차 기간을 결합 함락을 피하는 데 도움이 됩니다. 우리는 큰 사이클 지표가 역전되기 시작할 때 빨리 빠져 나갈 수 있습니다.
이 전략의 주요 위험은 다음과 같습니다.
큰 사이클 지표에서 잘못된 판단. 매일 RSI 등에서 비효율적 인 값 영역 결정은 잘못된 신호로 이어질 수 있습니다. 정확성을 향상시키기 위해 RSI의 매개 변수 조정이 필요합니다.
작은 사이클 가격 움직임과 큰 사이클 결정 사이의 분산. 때로는 단기 움직임은 큰 그림 트렌드에 대응합니다. 우리는 손실을 제어하기 위해 적절한 스톱 로스를 설정해야합니다.
부적절한 리스크 관리. 부적절한 포지션 사이징으로 인한 단일 거래에서 과도한 손실은 회복 불가능한 마감으로 이어질 수 있습니다. 합리적인 사이징 규칙이 시행되어야합니다.
이 전략은 여전히 크게 개선될 수 있습니다. 주로 다음 측면에서:
주기 매개 변수 조정. 최적의 매개 변수를 찾기 위해 더 많은 기간 조합을 테스트합니다.
RSI 매개 변수 조정. 판단 정확성을 향상시키기 위해 RSI 룩백 등 매개 변수를 조정.
더 많은 지표를 추가합니다. 트렌드 방향을 판단하는 데 도움이 되는 MA와 같은 더 많은 지표를 추가합니다.
스톱 로스 메커니즘을 개선합니다. 마감 조건에 따라 스톱 로스 포인트를 동적으로 조정합니다.
포지션 사이즈 규칙을 최적화하고 각 거래에 대한 특정 포지션 사이즈를 더 과학적으로 관리하십시오.
이 전략은 크로스 기간 RSI의 상승 상태를 평가함으로써 서로 다른 시간 차원 간의 크로스 기간 중재를 실현합니다. 크로스 기간 판단의 그러한 아이디어는 추가 활용을받을 자격이 있습니다. 우리는 매개 변수 조정, 스톱 손실 최적화, 지표 조합을 통해 계속 개선하여 더 유리하게 만들 수 있습니다. 전반적으로,이 전략은 독특한 아이디어와 향상시킬 수있는 거대한 잠재력을 가지고 있습니다.
/*backtest start: 2022-12-05 00:00:00 end: 2023-12-11 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Swing MTF", shorttitle="Swing MTF", overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 10000, slippage = 5) // otf_period = input(defval=2, title="Look Back Period (2nd Timeframe)") otf = input(defval="180", title="Second Momentum Timeframe") // Function to dectect a new bar is_newbar(res) => t = time(res) change(t) != 0 ? true : false // Check how many bars are in our upper timeframe since_new_bar = barssince(is_newbar(otf)) otf_total_bars = na otf_total_bars := since_new_bar == 0 ? since_new_bar[1] : otf_total_bars[1] //Calculate RSI Values ctf_rsi = rsi(open, otf_period) breakline=input(title="Breaks in lines", defval = true, type=bool) so = request.security(syminfo.tickerid, otf, rsi(open, otf_period)) sc = request.security(syminfo.tickerid, otf, rsi(close, otf_period)) final_otf_so = na final_otf_so := barstate.isrealtime ? since_new_bar == otf_total_bars ? so : final_otf_so[1] : so final_otf_sc = na final_otf_sc := barstate.isrealtime ? since_new_bar == otf_total_bars ? sc : final_otf_sc[1] : sc barsback = input(11, title='Bars back to check for a swing') // showsig = input(false, title='Show Signal Markers') swing_detection(index)=> swing_high = false swing_low = false start = (index*2) - 1 // -1 so we have an even number of swing_point_high = final_otf_so[index] swing_point_low = final_otf_sc[index] //Swing Highs for i = 0 to start swing_high := true if i < index if final_otf_so[i] > swing_point_high swing_high := false break // Have to do checks before pivot and after seperately because we can get // two highs of the same value in a row. Notice the > and >= difference if i > index if final_otf_so[i] >= swing_point_high swing_high := false break //Swing lows for i = 0 to start swing_low := true if i < index if final_otf_sc[i] < swing_point_low swing_low := false break // Have to do checks before pivot and after seperately because we can get // two lows of the same value in a row. Notice the > and >= difference if i > index if final_otf_sc[i] <= swing_point_low swing_low := false break [swing_high, swing_low] // Check for a swing [swing_high, swing_low] = swing_detection(barsback) long = final_otf_so > final_otf_sc short = final_otf_so < final_otf_sc if swing_low and long strategy.entry("My Long Entry Id", strategy.long) if swing_high and short strategy.entry("My Short Entry Id", strategy.short)