JMAがRSIを横断する取引戦略

作者: リン・ハーンチャオチャン,日付: 2023-09-18 21:42:50
タグ:

概要

この戦略は,ジュリック移動平均値 (JMA) とRSIインジケーターの交差によって取引信号を生成する.JMAがRSIを超えると長くなって,下を横切ると短くなります.この戦略は,2つのインジケーターを組み合わせて偽信号をフィルタリングし,トレンドがより明らかになると取引します.

原則

戦略は主に2種類の指標を使用します.

  1. JMA指標: パワーマルチプリキュアを用いた滑らかな移動平均値で,遅延が低く,価格変動を把握する速度が速い.

  2. RSI インディケーター: 買い/売りの勢いを反映する一般的な強度指標.

JMAがRSIを超えると,長期トレンドよりも短期上向きが強くなり,購入信号を生成する.RSIを下回ると,売却信号を提示する.

シグナルが出ると,戦略は対応する方向で取引を開始し,価格が既定の利益率に達したときまたは指標が逆方向に交差すると終了します.

利点

  1. 調整可能なJMAパラメータ,異なる期間に適応できる.

  2. RSIは偽の脱出をフィルターする

  3. 二重指示器の組み合わせは 偽信号を減らす.

  4. 内蔵ストップ損失制御

  5. 利潤指針化のための調整可能な利潤比

リスクと緩和策

  1. 2つのインディケーターのコンボで 信号が少ない

  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)



もっと