2つの移動平均のクロスオーバー戦略

作者: リン・ハーンチャオチャン,日付: 2024-02-27 16:21:02
タグ:

img

概要

この戦略は典型的な移動平均クロスオーバー戦略で,移動平均の2組,一つは速い,一つは遅い. 速い移動平均がゆっくり移動平均を横切ると,購入信号が生成される. 速い平均がゆっくり移動平均を下回ると,販売信号が生成される. この戦略は,移動平均のためにEMAとSMAの両方を使用し,EMAは速い線とSMAは遅い線である.複数の移動平均を使用することで,偽信号をフィルタリングし,信頼性を向上させるのに役立ちます.

戦略の論理

基本論理は,入口と出口を決定するために,高速と遅い移動平均線間の交差点に依存しています.

具体的には,2つのセットの高速移動平均値と遅い移動平均値が計算されます.

  • 第1回 急速EMA 8日間
  • 第2回 急速EMA 21日
  • 第1回 スローSMA,長さ50日
  • 2nd スロー SMA,長さ200日

低速SMAと低速EMAの間のクロスオーバーをチェックします.

  • 8日間のEMAが50日間のSMAを横切ると,黄金のクロス信号が表示されます.
  • 8日間のEMAが50日間のSMAを下回る場合は,デッドクロスシグナル

偽信号をフィルタリングするには,確認のために2度目のEMA/SMAクロスオーバーが必要です.

  • 取引信号は,21日間のEMAが50日間のSMAを超えて/下回る時のみ起動されます.

2つの高速/遅いMAクロスオーバーを必要とすることで,多くの誤った信号をフィルタリングし,信頼性を向上させることができます.

シグナルトリガーを購入するときは,ロング,シグナルトリガーを販売するときはショート.

戦略では,入場価格から入場価格の割合に基づいて,利益とストップロスを設定します.

利点分析

この戦略の利点は以下の通りです.

  1. ダブルMA設計は偽信号をフィルターし,精度を向上させる
  2. EMAとSMAの組み合わせは,EMAの感度とSMAのスムーズさを利用する.
  3. 利益とストップロスを取り,利益とリスクを制御する
  4. シンプルな論理,理解し,修正しやすい
  5. 調整可能なパラメータは,異なる市場環境に適しています.

リスク分析

戦略のリスク:

  1. MA ストラットは,不安定な市場で多くの小さな勝利/損失を生む傾向があります.
  2. 強いトレンド市場では大きな損失に直面する
  3. パラメータの調節が悪ければ 性能が低下します

リスクを制御するために

  1. 異なる市場条件にパラメータを調整する
  2. バックテストをベースに最適化し,ターゲット市場に適合
  3. ストップ・ロスを使って損失の大きさを制限する.

改善 の 方向

戦略は以下によってさらに最適化できます.

  1. 最適なMAの組み合わせをテストする
  2. 自動最適化のために機械学習や遺伝子アルゴリズムを使用します
  3. トレンドに反する取引を避けるためにトレンドフィルターを追加する
  4. 利益をロックするために後続ストップ損失を追加する
  5. 信号の確認のためにボリュームや波動性フィルターを組み込む
  6. 低相関性を利用するために他の層/製品と組み合わせる

結論

概要すると,ダブルMAクロスオーバー戦略は,高速/遅いMAクロス,セットの利益とストップ損失をコントロールするリスクのシグナルを生成し,シンプルで直感的で簡単に実装できます.パラメータは調節し,より良いパフォーマンスのために他の指標と組み合わせることができます.定量取引で大きな有用性があります.


/*backtest
start: 2023-02-20 00:00:00
end: 2024-02-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © JMLSlop

//@version=4

src = close
strategy("Crossover moving averages", shorttitle="Cross MA-EMA", overlay=true, calc_on_order_fills=false)

// first fast EMA
len = input(8, "Length", type=input.integer, minval=1)
doma1 = input(true, title="EMA")
out1 = ema(src, len) 

//Second fast EMA
len2 = input(21, minval=1, title="Length")
doma2 = input(true, title="EMA")
out2 = ema(src, len2)

//First slow MA
len3 = input(50, minval=1, title="Length")
doma3 = input(true, title="SMA")
out3 = sma(src, len3)

//Second slow MA
len4 = input(200, minval=1, title="Length")
doma4 = input(true, title="SMA")
out4 = sma(src, len4)

// Profit
profit = input(8, "Profit/lost %", type=input.float, minval=1) * 0.01


plot(doma1 and out1 ? out1: na, color=color.blue, linewidth=1, title="1st EMA")
plot(doma2 and out2 ? out2: na, color=color.red, linewidth=1, title="2nd EMA")
plot(doma3 and out3 ? out3: na, color=color.green, linewidth=2, title="1st MA")
plot(doma4 and out4 ? out4: na, color=color.orange, linewidth=3, title="2nd MA")

// Orders config
takeProfitPrice =
     (strategy.position_size > 0) ? strategy.position_avg_price + open*profit : (strategy.position_size < 0) ? strategy.position_avg_price - (open*profit) : na

longStopPrice  = strategy.position_avg_price * (1 - profit)
shortStopPrice = strategy.position_avg_price * (1 + profit)

longCondition2 = (out2>out3 and (crossover(out1, out4) or crossover(out1[1], out4[1]) or crossover(out1[2], out4[2]) or (crossover(out1[3], out4[3]))) or (out2>out3 and (crossover(out1, out3) or crossover(out1[1], out3[1]) or crossover(out1[2], out3[2]) or crossover(out1[3], out3[3]))))
if (longCondition2)
    strategy.entry("Enter L", strategy.long)

shortCondition2 = (out2<out3 and (crossunder(out1, out4) or crossunder(out1[1], out4[1]) or crossunder(out1[2], out4[2]) or crossunder(out1[3], out4[3]))) or (out2<out3 and (crossunder(out1, out3) or crossunder(out1[1], out3[1]) or crossunder(out1[2], out3[2]) or crossunder(out1[3], out3[3])))
if (shortCondition2)
    strategy.entry("Enter S", strategy.short)


if (strategy.position_size > 0)
    strategy.exit("Exit L", limit=takeProfitPrice, stop=longStopPrice)

if (strategy.position_size < 0)
    strategy.exit("Exit S", limit=takeProfitPrice, stop=shortStopPrice)


もっと