JMA 지표 교차 RSI 지표 거래 전략


생성 날짜: 2023-09-18 21:42:50 마지막으로 수정됨: 2023-09-18 21:42:50
복사: 0 클릭수: 1340
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 주릭 이동 평균 ((JMA) 과 RSI 지표의 교차로 매매 신호를 생성한다. JMA 상위 RSI를 통과할 때 더하고, JMA 하위 RSI를 통과할 때 비어있다. 이 전략은 두 지표의 조합을 사용하여 가짜 신호를 필터링하고, 트렌드가 더 분명할 때 거래를 시도한다.

원칙

이 전략은 크게 두 가지의 지표들을 이용한 조합입니다.

  1. JMA 지표: 을 곱하는 평평한 이동 평균, 낮은 지연성을 가지고 가격 변화를 더 빨리 포착할 수 있다.

  2. RSI 지표: 시장의 구매와 매매력을 반영하는, 더 흔한 강약 지표이다.

JMA 상위 RSI를 넘으면, 단기 가격 상승 동력이 장기적인 경향보다 강하다는 것을 나타내며, 구매 신호를 생성합니다. JMA 하위 RSI를 넘으면, 빈 신호를提示합니다.

교차 신호가 발신된 후, 거래는 상대방 방향으로 포지션을 열었다. 평소 포지션 조건은 가격이 지정된 목표 비율을 초과하거나 지표가 다시 교차 역전되었다.

장점

  1. JMA 지표의 매개 변수는 조정 가능하며, 다른 주기들에 대해 최적화할 수 있다.

  2. RSI 지표는 가짜 브레이크를 필터링 할 수 있습니다.

  3. 이중 지표 조합을 사용하면 잘못된 신호를 줄일 수 있다.

  4. 내장된 손해 방지 장치로 손실을 제한할 수 있습니다.

  5. 수익률을 조정하여 수익 목표를 달성합니다.

위험과 해결책

  1. 이중 지표 조합 inating, 신호 생성 주파수가 너무 낮을 수 있다. 지표를 더 민감하게 만들기 위해 매개 변수를 조정할 수 있다.

  2. JMA 지표는 뒤떨어지고 있으며, 가격 전환점을 놓칠 수 있다. 다른 선도 지표와 결합하여 최적화할 수 있다.

  3. 부적절한 스톱포인트 설정은 파격되어 손실이 확대될 수 있다. 적절한 스톱포인트는 역사 데이터 테스트에 따라 결정되어야 한다.

  4. 지표에만 의존하면 가짜 신호가 발생한다. 거래량이나 변동률 지표에 필터링을 추가할 수 있다.

더 나은 생각

  1. JMA 변수를 테스트하여 최적의 변수 조합을 찾습니다.

  2. 다른 RSI 변수 설정을 시도하여 지표 효과를 최적화하십시오.

  3. 이동식 손해배상 장치가 추가되어 손해배상 장치가 더 적응할 수 있습니다.

  4. 창고 창고 관리 논리를 최적화합니다. 예를 들어, 추가 창고 및 배치 창고 조건을 추가합니다.

  5. KD, MACD 등과 같은 다른 지표 필터 신호를 연구한다.

요약하다

이 전략은 JMA와 RSI 두 지표의 교차 구현 트렌드 추적을 기반으로 하고, 위험을 제한하기 위해 스톱을 구성할 수 있다. 그러나 여전히 약간의 가짜 신호 가능성이 있으며, 실수 거래를 줄이기 위해 지표 파라미터와 필터 조건을 계속 최적화 할 필요가 있다. 스톱 전략은 또한 피드백 데이터를 기반으로 최적화 테스트를 필요로 한다. 이 전략은 쌍 지표의 교차 거래에 대한 기본 프레임 워크를 제공하며, 확장 할 여지가 있다.

전략 소스 코드
/*backtest
start: 2023-01-01 00:00:00
end: 2023-03-15 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Stratégie marche le mieux sur du 2 jours
strategy("JMA(7,50,RSI) crossing RSI(14,close)", overlay=false, currency=currency.EUR, default_qty_type=strategy.cash, default_qty_value=5000)

// Strategy Tester Start Time
sYear = input(2019, title = "Start Year")
sMonth = input(06, title = "Start Month", minval = 01, maxval = 12)
sDay = input(01, title = "Start Day", minval = 01, maxval = 31)
sHour = input(00, title = "Start Hour", minval = 00, maxval = 23)
sMinute = input(00, title = "Start Minute", minval = 00, maxval = 59)
startTime = true

// Strategy Tester End Time
eYear = input(2019, title = "End Year")
eMonth = input(12, title = "End Month", minval = 01, maxval = 12)
eDay = input(01, title = "End Day", minval = 01, maxval = 31)
eHour = input(00, title = "End Hour", minval = 00, maxval = 23)
eMinute = input(00, title = "End Minute", minval = 00, maxval = 59)
endTime = true

// === RSI ===
src = close, len = input(14, minval=1, title="Length")
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
plot(rsi, color=color.purple)
band1 = hline(70)
band0 = hline(30)

// === JMA ===
_length = input(7, title="Length")
_phase = input(50, title="Phase")
_power = input(2, title="Power")
highlightMovements = input(true, title="Highlight Movements ?")

// srcJMA = input(rsi, title="Source")
srcJMA = rsi

phaseRatio = _phase < -100 ? 0.5 : _phase > 100 ? 2.5 : _phase / 100 + 1.5
beta = 0.45 * (_length - 1) / (0.45 * (_length - 1) + 2)
alpha = pow(beta, _power)
jma = 0.0
e0 = 0.0
e0 := (1 - alpha) * srcJMA + alpha * nz(e0[1])
e1 = 0.0
e1 := (srcJMA - e0) * (1 - beta) + beta * nz(e1[1])
e2 = 0.0
e2 := (e0 + phaseRatio * e1 - nz(jma[1])) * pow(1 - alpha, 2) + pow(alpha, 2) * nz(e2[1])
jma := e2 + nz(jma[1])
// === End of JMA def ===

jmaColor = highlightMovements ? (jma > jma[1] ? color.green : color.red) : #6d1e7f
plot(jma, title="JMA switch", linewidth=2, color=jmaColor, transp=0)

// === Inputs ===
// risk management
useStop = input(true, title = "Use Initial Stop Loss?")

goLong() => crossover(rsi, jma)
killLong() => crossunder(rsi, jma)

// ======= DEBUGGGGGGGG ============
long_price = 0.0
short_price = 0.0

if(startTime and endTime)
    if(goLong())
        long_price := close
    strategy.entry("Buy", strategy.long, when = goLong())
    strategy.close("Buy", when = killLong() and close > long_price)

// Shorting if using
goShort() => killLong()
killShort() => goLong()

if(startTime and endTime)
    if(goShort())
        short_price := close
    strategy.entry("Sell", strategy.short, when = goShort() and close < short_price)
    strategy.close("Sell", when = killShort())
// =========================

if (useStop)
    strategy.exit("XLS", from_entry ="Buy", stop = strategy.position_avg_price / 1.08)
    strategy.exit("XSS", from_entry ="Sell", stop = strategy.position_avg_price * 1.08)