JMA RSI를 넘기기 위한 거래 전략

저자:차오장, 날짜: 2023-09-18 21:42:50
태그:

전반적인 설명

이 전략은 주리크 이동 평균 (JMA) 과 RSI 지표의 교차를 통해 거래 신호를 생성합니다. JMA가 RSI를 넘을 때 길고 그 아래를 넘을 때 짧습니다. 전략은 두 가지 지표를 결합하여 잘못된 신호를 필터링하고 트렌드가 더 명백할 때 거래를 시도합니다.

원칙

이 전략은 주로 두 가지 유형의 지표를 사용합니다.

  1. JMA 지표: 전력 곱셈을 사용하여 평탄한 이동 평균, 낮은 지연과 가격 변화를 더 빠르게 포착합니다.

  2. RSI 지표: 구매/판매 동력을 반영하는 일반적인 강도 지표입니다.

JMA가 RSI 위를 넘을 때, 그것은 장기 트렌드보다 강한 단기 상승 추세를 나타내고 구매 신호를 생성합니다. RSI 아래를 넘을 때, 그것은 판매 신호를 요청합니다.

신호에 따라 전략은 해당 방향으로 거래를 시작합니다. 가격이 미리 결정된 이익 비율에 도달하거나 지표가 역 방향으로 교차 할 때 종료됩니다.

장점

  1. 조정 가능한 JMA 매개 변수, 다른 기간에 적응할 수 있습니다.

  2. RSI는 가짜 탈출을 필터링합니다.

  3. 이중 표시기 조합은 잘못된 신호를 줄입니다.

  4. 내장된 스톱 손실 제어

  5. 수익 타겟팅을 위한 사용자 정의 가능한 수익 비율

위험 및 완화

  1. 이중 표시기 조합은 신호가 너무 적어 감수성을 조정할 수 있습니다.

  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)



더 많은