この戦略は,MACDモメントインジケーターとRSIオーバーバイト/オーバーセールインジケーターを組み合わせます.MACDが上下を横切ると,RSIがより信頼性の高い取引信号を生成するために,バックバック期間に対応する底値/上位逆転も完了しているかチェックします.典型的な短期平均逆転戦略論理.
MACD DIFF,DEA とヒストグラムを計算します.DEA の上のDIFFのクロスオーバーは上昇のクロスオーバー信号,下のクロスオーバーは死亡のクロスオーバー信号になります.
RSI を計算し,過売り回転と過買い回転を特定する.最近底値または上位値が発生したかどうかをチェックする.
MACDの上昇型クロスオーバーが起こると,RSIがバックウィンドウ内で過売りから反転した場合,ロング信号が生成されます.MACDのデスクロスでは,RSIがバックウィンドウを上回った場合,ショート信号が生成されます.
リスク管理へのエントリー後に停止損失を設定します.
MACDは傾向の変化を敏感に識別し,RSIは過剰購入/過剰販売レベルを効果的に判断します.
MACDとRSIの両方のシグナルが必要なら 偽のシグナルをフィルタリングします
後ろの窓は信号の信頼性を向上させる.
ストップ・ロスはリスク管理に役立ちます
MACDとRSIの遅れは,最適なエントリを逃す可能性があります.
二重指標信号の確率が低いということは,取引が少なくなるということです.
より大きなトレンド方向を考慮しないと 罠にかけられる危険性があります
ストップ・ロスの調節が不十分で,幅が幅が広いか狭すぎた場合もあります.
解決 できる 方法:
MACDとRSIのパラメータを調整して遅延を減らす.
インディケーターの限界範囲を拡大して より多くの信号を提供します
逆トレンドのエントリを避けるためにトレンドフィルターを追加します.
ストップ・ロスの異なるパラメータをテストして最適なレベルを測る.
SMAと他の移動平均値をテストする.
フレキシブルストップには ストップ損失を後押しします
進出の質を判断するために 傾向の強さを考慮します
マシン学習を使って インディケーターの動きを予測します
入場時間を最適化するために より多くの要素を組み合わせます
この戦略は,調整されたMACDとRSIを使用して信頼性の高い逆転信号をフィルタリングします.論理は明確で,指標選択,トレンドフィルター,ストップ損失技術などの強化のためにパラメータは柔軟です. 安定性を維持しながらより多くの取引を取得するには,過剰な最適化リスクは避ける必要があります.
/*backtest start: 2023-08-24 00:00:00 end: 2023-09-23 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 //based on Range Strat - MACD/RSI // strategy("MACD/RSI - edited", // overlay=true, // default_qty_type=strategy.percent_of_equity, // default_qty_value=10, precision=2, initial_capital=100000, // pyramiding=2, // commission_value=0.05) //Backtest date range StartDate = input(timestamp("13 Jun 2022"), title="Start Date") EndDate = input(timestamp("13 Jun 2024"), title="Start Date") inDateRange = true // RSI Input Settings rsisrc = input(title="RSI Source", defval=close, group="RSI Settings") length = input(title="Length", defval=14, group="RSI Settings" ) overSold = input(title="Over Sold Threshold", defval=30, group="RSI Settings" ) overBought = input(title="Over Bought Threshold", defval=70, group="RSI Settings" ) rsi_lookback = input(title="RSI cross lookback period", defval=7, group="RSI Settings") // Calculating RSI vrsi = ta.rsi(rsisrc, length) co = ta.crossover(vrsi, overSold) cu = ta.crossunder(vrsi, overBought) // Function looking for a happened condition during lookback period f_somethingHappened(_cond, _lookback) => bool _crossed = false for i = 1 to _lookback if _cond[i] _crossed := true _crossed coCheck = f_somethingHappened(co, rsi_lookback) cuCheck = f_somethingHappened(cu, rsi_lookback) // MACD Input Settings macdsrc = input(title="MACD Source", defval=close, group="MACD Settings") fast_length = input(title="Fast Length", defval=12, group="MACD Settings") slow_length = input(title="Slow Length", defval=26, group="MACD Settings") signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 50, defval = 9, group="MACD Settings") sma_source = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD Settings") sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD Settings") // Calculating MACD fast_ma = sma_source == "SMA" ? ta.sma(macdsrc, fast_length) : ta.ema(macdsrc, fast_length) slow_ma = sma_source == "SMA" ? ta.sma(macdsrc, slow_length) : ta.ema(macdsrc, slow_length) macd = fast_ma - slow_ma signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length) delta = macd - signal MACDcrossover = ta.crossover(delta, 0) MACDcrossunder = ta.crossunder(delta, 0) // Stop Loss Input Settings longLossPerc = input(title="Long Stop Loss (%)", defval=15, group="Stop Loss Settings") * 0.01 shortLossPerc = input(title="Short Stop Loss (%)", defval=15, group="Stop Loss Settings") * 0.01 // Calculating Stop Loss longStopPrice = strategy.position_avg_price * (1 - longLossPerc) shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc) // Strategy Entry if (not na(vrsi)) if (inDateRange and MACDcrossover and coCheck) strategy.entry("LONG", strategy.long, comment="LONG") if (inDateRange and MACDcrossunder and cuCheck) strategy.entry("SHORT", strategy.short, comment="SHORT") // Submit exit orders based on calculated stop loss price if (strategy.position_size > 0) strategy.exit(id="LONG STOP", stop=longStopPrice) if (strategy.position_size < 0) strategy.exit(id="SHORT STOP", stop=shortStopPrice)