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

作者: リン・ハーンチャオチャン,日付: 2023年11月27日 16:21:45
タグ:

img

概要

この戦略は,急速な30日間の単純な移動平均値と,株価の遅い33日間の単純な移動平均値が交差するときに,LONGまたはSHORTエントリー信号を生成する.逆の信号が発生するとすぐにポジションを退場する.これは,トレンドの変化を効果的に捉える.

戦略原則

この戦略の核心は,高速30日MAと遅い33日MAを計算することです.高速線は価格変化により速く反応することができ,スローラインはより優れたフィルタリング効果を持っています.高速線がスローラインを上向きに突破すると,購入信号が生成されます.これは,価格が上昇し始め,スローラインがまだ遅れながら高速線が反応したことを示します.高速線がスローラインを下向きに突破すると,販売信号が生成されます.これは,高速線が反応した一方で価格が低下し始めることを示します.しかし,スローラインはまだ遅れています.

このような高速かつ遅いMAクロスオーバー設計により,新しいトレンドが開始され,反対信号で終了すると取引信号を生成し,中期から長期間の価格トレンドを効果的に捉えることができます.同時に,市場変動に誤導されるのを避けることができます.

利点分析

この戦略には以下の利点があります.

  1. シンプルな移動平均を用いて,理解し,実行するのは簡単です
  2. 急速なラインと遅いラインの組み合わせは,価格変化に迅速に対応し,フィルタリング効果を持っています
  3. 金色の十字架と死の十字架の信号は シンプルで明瞭で 操作が簡単です
  4. 中期から長期間の傾向を効果的に把握できる
  5. リスクを制御するために,反対の信号で迅速に終了する.

リスク分析

この戦略にはいくつかのリスクもあります:

  1. 価格が範囲に制限されているときに複数の誤った信号を生成し,過剰な取引を引き起こす可能性があります.
  2. 予期せぬ出来事によって引き起こされる極端な価格変動をうまく処理できない
  3. MA 期間のようなパラメータは最適化が必要で,不適切な設定は戦略のパフォーマンスに影響します
  4. 取引コストが収益性に影響を及ぼす

パラメータ最適化,ストップ・ロスのレベル設定,トレンドが明確であるときにのみ取引などのような方法がこれらのリスクを制御し,軽減するために使用できます.

オプティマイゼーションの方向性

戦略は以下の側面で最適化できます.

  1. 最適なパラメータ組み合わせを見つけるために,MA期間とクロスオーバータイプを最適化します.
  2. 他の技術指標フィルター (取引量,MACDなど) を追加して誤った信号を減らす
  3. 単に反対信号停止損失の代わりに適応停止損失メカニズムを追加
  4. 設計パラメータセットと異なる製品のストップ損失規則
  5. パラメータを動的に調整するための機械学習方法を組み込む

テストと最適化によって,戦略ルールは,さまざまな市場環境でより信頼性の高い取引信号を得るために継続的に改善することができます.

概要

概要すると,このダブルMAクロスオーバーブレイクストラテジーは非常にシンプルで実用的です.高速MAと遅いMAを組み合わせることで,中長期トレンドの始まりを効果的に特定し,比較的信頼できる取引信号を生成することができます.また,ストップロスのルールは実装が簡単です.さらなる最適化により,この戦略は価値のある長期的定量システムになることができます.


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

//@version=3
//future strategy
//strategy(title = "es1!_1minute_hull", default_qty_type = strategy.fixed, initial_capital=250000,  overlay = true, commission_type=strategy.commission.cash_per_contract,commission_value=2, calc_on_order_fills=false, calc_on_every_tick=false,pyramiding=0)
//strategy.risk.max_position_size(2)
//stock strategy
strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=1000000, overlay = false)//, calc_on_order_fills=true, calc_on_every_tick=true)
//forex strategy
//strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100,  overlay = true,initial_capital=250000, default_qty_type = strategy.percent_of_equity)
//crypto strategy
//strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100,  overlay = true, commission_type=strategy.commission.percent,commission_value=.005,default_qty_value=10000)
//strategy.risk.allow_entry_in(strategy.direction.long) // There will be no short entries, only exits from long.




testStartYear = 2010
testStartMonth = 1
testStartDay = 1
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)


testEndYear = 2039
testEndMonth = 1
testEndDay = 1
testPeriodEnd = timestamp(testEndYear,testEndMonth,testEndDay,0,0)


testPeriod() =>
    //true
    time >= testPeriodStart and time <= testPeriodEnd ? true : false

fast_length = 30
slow_length = 33

ema1 = 0.0
ema2 = 0.0

volumeSum1 = sum(volume, fast_length)
volumeSum2 = sum(volume, slow_length)

//ema1 := (((volumeSum1 - volume) * nz(ema1[1]) + volume * close) / volumeSum1)
ema1 :=  ema(close,fast_length)
//ema2 := (((volumeSum2 - volume) * nz(ema2[1]) + volume * close) / volumeSum2)
ema2 :=  ema(close,slow_length)



plot(ema1,color=#00ff00, linewidth=3)
plot(ema2, color=#ffff00, linewidth=3)

go_long = crossover(ema1,ema2)
go_short = crossunder(ema1,ema2)

if testPeriod()
    strategy.entry("long_ride", strategy.long, when=go_long)
    strategy.entry("short_ride", strategy.short,when=go_short)
    
        
    strategy.close("long_ride",when=go_short)
    strategy.close("short_ride",when=go_long)
    

もっと