資源の読み込みに... 荷物...

多指標動的モメントクロス戦略

作者: リン・ハーンチャオチャン開催日:2025-01-06 14:00:47
タグ:エイマRSISMAマックドADX

img

概要

この戦略は,主に指数移動平均値 (EMA),相対強度指数 (RSI),距離計算を組み合わせた複数の技術指標に基づいた取引システムである.この戦略は,市場のトレンド強さと勢力の変化を動的に監視し,シグナル安定性を維持し,誤ったブレイクと不安定な市場を効果的に回避する.システムは複数の確認メカニズムを使用し,指標と動的値間の相対距離を計算し,正確な市場状態評価を達成する.

戦略原則

この戦略は,異なる期間の4つのEMA (5, 13, 40, 55) を利用し,市場指向判断のためのRSI指標 (14期) によって強化されたトレンドフレームワークを構築します.具体的には:

  1. 5 期間の EMA が 13 期間の EMA を越え,40 期間の EMA が 55 期間の EMA を越えるときに長信号が生成されます.
  2. トレンド確認には,RSIが50以上で,14期間の平均値よりも高い必要があります.
  3. このシステムは,EMA5とEMA13の間の距離を計算し,過去5個のキャンドルの平均距離と比較して,トレンド強さを判断します.
  4. RSIが60を超えると強い買い信号が発信され,40を下回ると強い売り信号が発信されます.
  5. トレンド持続性は,EMA40とEMA13の距離変化を計算することによって確認されます.

戦略 の 利点

  1. 複数の確認メカニズムにより 誤った信号が大幅に減少します
  2. 動的距離計算は,トレンド強度の変化を特定するのに役立ちます
  3. RSIの値設計は,市場強さの追加評価を提供します.
  4. シグナル持続メカニズムは,頻繁に取引するリスクを軽減します.
  5. トレンド逆転早期警告機能は,先行位置付けの支援
  6. このシステムは,異なる市場環境に適性があることを示しています

戦略リスク

  1. 横向市場で過剰な中立信号を生む可能性があります
  2. 複数の指標が信号遅延を引き起こす可能性があります
  3. パラメータの最適化により,オーバーフィッティングが発生する可能性があります.
  4. 急速なトレンド逆転の際に大きな引き上げが可能です
  5. EMAのクロスオーバーからの偽の突破は,追加のフィルタリングを必要とする.

戦略の最適化方向

  1. 信号の信頼性を高めるため,音量指標を組み込む
  2. 市場のターニングポイント予測を改善するために RSI パラメータを最適化
  3. ダイナミックストップ・ロース調整のためのATRインジケータを追加する
  4. 戦略の安定性を高めるための適応性のあるパラメータシステムを開発する
  5. 複数のタイムフレームの信号確認メカニズムを構築
  6. 偽信号を減らすため,変動フィルターを導入する

概要

この戦略は,複数の技術指標のシネージを通じてシグナル安定性を維持しながら,効果的なリスク制御を達成する. システムの設計は,適応性を高めるために動的値と距離計算を使用して,市場の多様性を徹底的に考慮する. 継続的な最適化と改善を通じて,戦略はさまざまな市場条件で安定したパフォーマンスを維持する約束を示している.


/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("EMA Crossover Strategy with RSI Average, Distance, and Signal Persistence", overlay=true, fill_orders_on_standard_ohlc=true)

// Define EMAs
ema5 = ta.ema(close, 5)
ema13 = ta.ema(close, 13)
ema40 = ta.ema(close, 40)
ema55 = ta.ema(close, 55)

// Calculate 14-period RSI
rsi = ta.rsi(close, 14)

// Calculate the RSI average
averageRsiLength = 14  // Length for RSI average
averageRsi = ta.sma(rsi, averageRsiLength)

// Define conditions
emaShortTermCondition = ema5 > ema13  // EMA 5 > EMA 13
emaLongTermCondition = ema40 > ema55  // EMA 40 > EMA 55
rsiCondition = rsi > 50 and rsi > averageRsi  // RSI > 50 and RSI > average RSI

// Track the distance between ema5 and ema13 for the last 5 candles
distance = math.abs(ema5 - ema13)
distanceWindow = 5
distances = array.new_float(distanceWindow, 0.0)
array.shift(distances)
array.push(distances, distance)

// Calculate the average distance of the last 5 distances
avgDistance = array.avg(distances)

// Track distance between EMA40 and EMA13 for the last few candles
distance40_13 = math.abs(ema40 - ema13)
distanceWindow40_13 = 5
distances40_13 = array.new_float(distanceWindow40_13, 0.0)
array.shift(distances40_13)
array.push(distances40_13, distance40_13)

// Calculate the average distance for EMA40 and EMA13
avgDistance40_13 = array.avg(distances40_13)

// Neutral condition: if the current distance is lower than the average of the last 5 distances
neutralCondition = distance < avgDistance or ema13 > ema5

// Short signal condition: EMA40 crosses above EMA55
shortCondition = ema40 > ema55

// Conditions for Green and Red signals (based on RSI thresholds)
greenSignalCondition = rsi > 60  // Green if RSI > 60, regardless of EMAs
redSignalCondition = rsi < 40  // Red if RSI < 40, regardless of EMAs

// Combine conditions for a buy signal (Long)
longCondition = emaShortTermCondition and emaLongTermCondition and rsiCondition and not neutralCondition

// Store the last signal (initialized as na)
var string lastSignal = na

// Track previous distance between EMA40 and EMA13
var float prevDistance40_13 = na

// Check if the current distance between EMA40 and EMA13 is greater than the previous
distanceCondition = (not na(prevDistance40_13)) ? (distance40_13 > prevDistance40_13) : true

// Update the lastSignal only if the current candle closes above EMA5, otherwise recalculate it
if (close > ema5)
    if (longCondition and distanceCondition)
        lastSignal := "long"
    else if (shortCondition and distanceCondition)
        lastSignal := "short"
    else if (neutralCondition)
        lastSignal := "neutral"
    // Add green signal based on RSI
    else if (greenSignalCondition)
        lastSignal := "green"
    // Add red signal based on RSI
    else if (redSignalCondition)
        lastSignal := "red"

// If current candle doesn't close above EMA5, recalculate the signal based on current conditions
if (close <= ema5)
    if (longCondition)
        lastSignal := "long"
    else if (shortCondition)
        lastSignal := "short"
    else if (greenSignalCondition)
        lastSignal := "green"
    else if (redSignalCondition)
        lastSignal := "red"
    else
        lastSignal := "neutral"

// Update previous distance for next comparison
prevDistance40_13 := distance40_13

// Set signal conditions based on lastSignal
isLong = lastSignal == "long"
isShort = lastSignal == "short"
isNeutral = lastSignal == "neutral"
isGreen = lastSignal == "green"
isRed = lastSignal == "red"

// Plot signals with preference for long (green) and short (red), no multiple signals per bar
plotshape(isLong, style=shape.circle, color=color.green, location=location.belowbar, size=size.tiny)
plotshape(isShort and not isLong, style=shape.circle, color=color.red, location=location.abovebar, size=size.tiny)
plotshape(isNeutral and not isLong and not isShort, style=shape.circle, color=color.gray, location=location.abovebar, size=size.tiny)
plotshape(isGreen and not isLong and not isShort and not isNeutral, style=shape.circle, color=color.green, location=location.belowbar, size=size.tiny)
plotshape(isRed and not isLong and not isShort and not isNeutral, style=shape.circle, color=color.red, location=location.abovebar, size=size.tiny)

// Plot EMAs for visualization
plot(ema5, color=color.blue, title="EMA 5")
plot(ema13, color=color.orange, title="EMA 13")
plot(ema40, color=color.green, title="EMA 40")
plot(ema55, color=color.red, title="EMA 55")

// Plot RSI average for debugging (optional, remove if not needed)
// plot(averageRsi, title="Average RSI", color=color.orange)
// hline(50, title="RSI 50", color=color.gray)  // Optional: Comment this out too if not needed


if isLong
    strategy.entry("Enter Long", strategy.long)
else if isShort
    strategy.entry("Enter Short", strategy.short)

関連性

もっと