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

作者: リン・ハーンチャオチャン,日付: 2023年11月2日 14:21:24
タグ:

img

概要

この戦略は,トレード後のトレンドのためのATRストップと組み合わせた二重移動平均のクロスオーバーを取引信号として使用する. 基本的なアイデアは,高速移動平均がスロー移動平均を越えて,低くなると短く,動的にトラッキングストップのストップ損失レベルを設定するためにATRを使用する.

戦略の論理

この戦略は,主にトレンド方向を決定するために2つの移動平均を使用する. 速い移動平均は25日,ゆっくりとした移動平均は100日. 速いMAがスローMAを超えると購入信号が生成され,下を横切ると販売信号が生成される.

いくつかの誤った信号をフィルタリングするために,この戦略は,crossCountと呼ばれるクロスオーバーカウンタを追加します. 信号は,バックバック期 (デフォルト25日) の速いMAのクロスの数がmaxNoCross (デフォルト10) 未満である場合にのみ起動されます.

さらに,この戦略には確認メカニズムがあり,最初の信号の後,価格が2つの移動平均値の間に再入った場合も信号が確認されます.

ストップ・ロスのレベルを設定するために,戦略はATRを使用する.ATRは一定の期間における価格変動範囲を測定し,ここでその14xはストップ距離として使用されます.ストップレベルは価格動きに応じて浮動します.

利点分析

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

  1. フィルタリング付きのダブルMAクロスを使って,誤った信号を避ける間に強いトレンド動きを効果的に捕捉することができます.

  2. 確認メカニズムは 偽の脱出によって偽造されないようにします

  3. 浮遊型ATRストップ損失は,引き上げを制限しながら利益を最大化するのに役立ちます.

  4. 最適化可能なパラメータは少ないし,実装も簡単です.

  5. 仮想通貨や伝統的な資産を含む市場全体に適用できる.

  6. 耐久性に関する複数の技術指標を組み合わせます

リスク分析

戦略の主なリスクは以下の通りである.

  1. 範囲内での頻繁なMA交差が多重損失を引き起こす可能性があります.

  2. ATR パラメータの設定が正しくない場合,ストップが幅が幅が大きくすぎたり,狭すぎたりすることがあります.

  3. 大きなギャップは 直接停止を誘発します

  4. 波動が大きいニュースイベントも ポジションを停止させる可能性があります

  5. 適切なMAパラメータがない場合,トレンドが欠けているか誤った信号が多すぎる可能性があります.

  6. 最近の価格動向は,ATRストップが時代遅れになる可能性があります.

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

この戦略は,次の側面においてさらに最適化することができる.

  1. より良い組み合わせを見つけるために MA パラメータを最適化し,異なる期間と重度の平均をテストする.

  2. よりよい停止距離を見つけるために異なるATR期間をテストする.

  3. 音量ピークや波動性インディケーターなどの フィルターを追加して 信号の質を向上させます

  4. 動揺する市場では 変化を避けるために 傾向指標を組み込む

  5. バックテストを通じてパラメータを自動最適化するために 機械学習アルゴリズムを追加します

  6. 短期間の騒音を避けるため より長い時間枠で 確認を求めます

  7. 利潤のポジションをスケールアウトする 段階的な利益採取ルールを導入する

概要

この戦略は,デュアルMAクロス,トレンドフィルタリング,確認,および動的なATRストップを組み合わせ,強力なトレンドフォローを可能にします.最適化とリスク管理の改善に余地がある一方で,取引論理はシンプルで複製が容易で,安定したトレンド取引システムになります.


/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("QuantCat Intraday Strategy (15M)", overlay=true)

//MA's for basic signals, can experiment with these values

fastEMA = sma(close, 25)
slowEMA = sma(close, 100)

//Parameters for validation of position

lookback_value = 25
maxNoCross=10 //value used for maximum number of crosses on a certain MA to mitigate noise and maximise value from trending markets

//Amount of crosses on MA to filter out noise

ema25_crossover = (cross(close, fastEMA)) == true ? 1 : 0
ema25_crossover_sum = sum(ema25_crossover, lookback_value) ///potentially change lookback value to alter results
crossCount = (ema25_crossover_sum <= maxNoCross)

//Entries long

agrLong =  ((crossover(fastEMA, slowEMA)) and (crossCount == true)) ? true : false
consLong = ((close < fastEMA) and (close > slowEMA) and (fastEMA > slowEMA) and (crossCount == true)) ? true : false

//Entries short

agrShort =  ((crossunder(fastEMA, slowEMA)) and (crossCount == true)) ? true : false
consShort = ((close > fastEMA) and (close < slowEMA) and (fastEMA < slowEMA) and (crossCount == true)) ? true : false

//ATR

atrLkb = input(14, minval=1, title='ATR Stop Period')
atrRes = input("15",  title='ATR Resolution')
atr = request.security(syminfo.tickerid, atrRes, atr(atrLkb))

//Strategy

longCondition = ((agrLong or consLong) == true)
if (longCondition)
    strategy.entry("Long", strategy.long)

shortCondition = ((agrShort or consShort) == true)
if (shortCondition)
    strategy.entry("Short", strategy.short)

//Stop multiplier 

stopMult = 4

//horizontal stoplosses

longStop = na
longStop :=  shortCondition ? na : longCondition and strategy.position_size <=0 ? close - (atr * stopMult) : longStop[1] 
shortStop = na
shortStop := longCondition ? na : shortCondition and strategy.position_size >=0 ? close + (atr * stopMult) : shortStop[1]

//Strategy exit functions

strategy.exit("Long ATR Stop", "Long", stop=longStop)
strategy.exit("Short ATR Stop", "Short", stop=shortStop)

//Plots 

redgreen = (fastEMA > slowEMA) ? green : red
    
p1 = plot(fastEMA, title="Fast EMA", color=redgreen, linewidth=2) 
p2 = plot(slowEMA, title="Slow EMA", color=redgreen, linewidth=2) 
fill(p1, p2, color=redgreen)

s1 = plot(longStop, style=linebr, color=red, linewidth=2,     title='Long ATR Stop')
s2 = plot(shortStop, style=linebr, color=red, linewidth=2,  title='Short ATR Stop')

fill(p2, s1, color=red, transp=95)
fill(p2, s2, color=red, transp=95)





    




もっと