木星と土星のモメンタム MA クロスオーバー フィルター戦略


作成日: 2023-11-03 16:13:20 最終変更日: 2023-11-03 16:13:20
コピー: 0 クリック数: 655
1
フォロー
1617
フォロワー

木星と土星のモメンタム MA クロスオーバー フィルター戦略

概要

この戦略は,両移動平均の交差を取引信号として使用し,波幅指標BBとカスタム動能指標と組み合わせたフィルタリングを行います.MA交差信号の信頼性を高め,偽信号を減らすことを目的としています.

原則

  1. 50周期EMAと200周期SMAを用いて金叉死叉信号を形成する.

  2. 価格が上昇傾向にあるとき,価格が200日線以上とカスタム動能指標値が25未満であることを要求して買取シグナルを生成する.

  3. 価格が下方傾向にあるとき,価格が200日線以下で,カスタム動能指標値が75より大きいことを要求してセールシグナルを生成する.

  4. 自定義動能指標はBB中線と上下線の距離に基づいて0-100の範囲にマッピングする. 統計的距離の最大最小値を遡って,归一化処理を行う.

  5. 動能指標は,価格の相対波幅の位置情報を反映し,値を設定してフィルタリングし,偽交差を効果的に減らすことができます.

優位分析

  1. EMAとSMAの優位性を利用して,中長線トレンドを捉える.

  2. 動能指数を増やしてフィルタリングを行うことで,信頼性が高く,偽信号が少なくなる.

  3. BB上下軌道の距離は波動力を反映し,遡及統計と組み合わせて標準化処理を行い,パラメータ依存を回避する.

  4. EMAとSMAの周期および動能指標の値下げをカスタマイズして,異なる市場環境に対応します.

  5. 戦略は明快でわかりやすい,パラメータ調整の余地があり,実用性が強い.

リスク分析

  1. EMAとSMA自身は遅滞しており,ショートラインの機会を逃しているかもしれない.

  2. 双線交差は本質的にトレンド追跡戦略であり,震の状況には適さない.

  3. 動能指標の値は,適切なパラメータを決定するために反復テストを必要とし,曲線最適化のリスクがある.

  4. 大周期平均線戦略で,収益は比較的安定しているが,絶対的な収益は限られている可能性がある.

  5. 平均周期を適当に短縮したり,他の指標を追加したりすることで,戦略の適応性を向上させることができます.

最適化の方向

  1. 異なる均線組み合わせをテストし,最適なパラメータを探します.

  2. MACD,KDなどの補助判断を追加する.

  3. 運動エネルギー指標のパラメータを最適化します.例えば,回帰周期,マッピング範囲などです.

  4. リスク管理のためのストップダストメカニズムを追加する.

  5. 異なる品種のパラメータが一致しない場合,機械学習の特性を抽出することを検討できます.

  6. 余計な交差信号を避けるために,エネルギー指数を加える.

要約する

この戦略は,集積周期的なトレンド追跡とカスタム動能指標の二重フィルタリングの優位性がある.信頼性が高く,実戦価値は高い.パラメータ最適化と補助技術指標の強化により,より優れたパフォーマンスを得ることが期待されています.この戦略は,他のトレンド追跡戦略に借用できる新しいアイデアであり,量化取引戦略庫に価値ある追加です.

ストラテジーソースコード
/*backtest
start: 2023-10-26 00:00:00
end: 2023-10-27 13:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="EMA Difference Mapping with Trades", shorttitle="EMA Diff Map", overlay=false)

// Inputs
emaLength = input(20, "EMA Length")
stdDevLength = input(2, "Standard Deviation Length")
priceSource = close
takeProfitPoints = input(1000, title="Take Profit (in Points)")
stopLossPoints = input(2500, title="Stop Loss (in Points)")

// Calculate EMA
ema = ema(priceSource, emaLength)

// Calculate Standard Deviation
stdDev = stdev(priceSource, stdDevLength)

// Calculate differences
diff1 = (ema + stdDev) - ema
diff2 = ema - (ema - stdDev)

// Calculate min and max differences from last year
lookbackPeriod = 504 // Number of trading days in a year
minDiff1 = lowest(diff1, lookbackPeriod)
maxDiff1 = highest(diff1, lookbackPeriod)
minDiff2 = lowest(diff2, lookbackPeriod)
maxDiff2 = highest(diff2, lookbackPeriod)

// Map differences based on requirements
mappedDiff1 = 50 + 50 * ((diff1 - minDiff1) / (maxDiff1 - minDiff1))
mappedDiff2 = 50 - 50 * ((diff2 - minDiff2) / (maxDiff2 - minDiff2))

// Combine mapped differences into a single line
mappedLine = if close > ema
    mappedDiff1
else
    mappedDiff2

// Plot 'mappedLine' in the main chart area conditionally
plot(mappedLine, title="EMA Difference Mapping", color=(close > ema ? color.blue : na), style=plot.style_line, linewidth=2)

// Calculate the 50EMA and 200SMA
ema50 = ema(close, 50)
sma200 = sma(close, 200)

// Plot the 50EMA and 200SMA on the main chart
plot(ema50, color=color.blue, title="50 SMA", linewidth=2)
plot(sma200, color=color.red, title="200 SMA", linewidth=2)

// Initialize trade variables
var bool waitingForBuy = na
var bool waitingForSell = na
var bool buyConditionMet = false
var bool sellConditionMet = false

if not sellConditionMet and crossunder(ema50, sma200)
    sellConditionMet := true
    waitingForBuy := false

if sellConditionMet 
    waitingForSell := true
    sellConditionMet := false

if waitingForSell and close < sma200 and mappedLine > 75
    strategy.entry("Sell", strategy.short)
    strategy.exit("Sell Exit", "Sell", profit=takeProfitPoints, loss=stopLossPoints)
    waitingForSell := false

// Define the strategy conditions and execute trades
if not buyConditionMet  and crossover(ema50, sma200)
    buyConditionMet := true
    waitingForSell := false

if buyConditionMet 
    waitingForBuy := true
    buyConditionMet := false

if waitingForBuy and close > sma200 and mappedLine < 25
    strategy.entry("Buy", strategy.long)
    strategy.exit("Buy Exit", "Buy", profit=takeProfitPoints, loss=stopLossPoints)
    waitingForBuy := false