移動平均傾斜クロスオーバートレンドフォロー戦略


作成日: 2023-10-17 17:02:30 最終変更日: 2023-10-17 17:02:30
コピー: 0 クリック数: 848
1
フォロー
1617
フォロワー

移動平均傾斜クロスオーバートレンドフォロー戦略

概要

この戦略は,2つの異なる長さの指数移動平均 ((EMA) の斜率交差を利用してトレンドフォロー信号を生成する. 130と400の長さのEMAをデフォルトで使用し,この2つのパラメータの組み合わせがうまく機能する.

快線EMA斜率上は慢線EMA斜率を貫通し,価格が200周期以上のEMAであるとき,多行する.快線EMA斜率下は慢線EMA斜率を貫通し,価格が200周期以下のEMAであるとき,空きする.

斜率方向の逆の交差時に平仓する.

この戦略は,ビットコインと流動性の高い,市場価値の高いアルトコインに最適ですが,特にトレンドが頻繁に見られる場合,波動性の高い資産にもうまく機能します.

4時間枠で最適です

また,選択可能な波動率フィルターが付属し,価格横軸の振動が信号よりもはるかに大きいときにポジションを開くのを避けるために,特定の値よりも大きな差がある場合にのみポジションを開きます.

効果は素晴らしいです 楽しんでください

戦略原則

この戦略の核心は,2つの異なる長さのEMA指数移動平均の傾斜を比較することである.

まず,長さ130と400のEMAを計算し,それぞれの斜率を計算し,それぞれの斜率の長さ3のEMAを計算し,平らな斜率曲線を得る.

ショートラインEMA斜面上から慢線EMA斜面を通るときに買信信号を生成し,ショートラインEMA斜面下から慢線EMA斜面を通るときに売信信号を生成する.

振動をフィルターするために,200周期のEMAをトレンドフィルターとして選択し,価格がEMAより高い場合にのみ多信号を考慮し,空白信号を考慮するよりも低い場合にのみ考慮する.

さらに,斜率の交差がデフォルトの値より大きい場合にのみ信号を生成する波動率フィルタをオプションで装備して,斜率の交差が不十分な波動率をフィルタリングすることができます.

傾きが逆の交差点になると,ポジションを平らにして損をするのをやめます.

優位分析

  1. 斜率交差を用いて信号を生成し,トレンドを効果的に追跡する.

  2. 異なる市場環境に対応するために,EMAサイクルパラメータの組み合わせを調整

  3. トレンドフィルターは,揺れ動向の誤導を防ぐことができます.

  4. 波動率フィルターは偽信号をフィルターする

  5. 規則はシンプルでわかりやすく,理解しやすい.

  6. 複数のタイムフレームで使用できます.

リスク分析

  1. 大規模な震動が頻繁に起こりうる.

  2. EMA周期パラメータが不適切で,トレンドの転換点を逃す可能性があります.

  3. 市場環境の変化に適したパラメータの組み合わせを調整する

  4. MAシステムと同様に,大トレンドの終わりには損失を逆戻す可能性があります.

最適化の方向

  1. EMA周期の組み合わせのパラメータを試し,最適なパラメータを探します.

  2. 異なる通貨の特性および市場環境による選択パラメータ

  3. リスクコントロールのストップ・ストラトジーを追加することも考えられます.

  4. EMA周期パラメータを動的に調整することも考慮できます.

  5. 異なる波動率の値パラメータを試す

  6. 異なる時間枠でのテスト

要約する

この戦略の全体的な構想は明快で分かりやすい. EMAの斜率交差を利用して信号を生成し,トレンドを効果的に追跡することができる.トレンドフィルターと波動率フィルターを配合することで,ノイズ取引を減らすことができる. EMA周期パラメータの組み合わせを調整することで,異なる市場環境に適応することができる.

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

//@version=4
// strategy(title="Slopes",initial_capital=1000, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, commission_value=0.06, slippage = 2, default_qty_value=30, overlay=false)

//definizione input

start = timestamp(input(2018, "start year"), input(1, "start month"), input(1, "start day"), 00, 00)
end = timestamp(input(2020, "end year"), input(1, "end month"), input(1, "end day"), 00, 00)

average = input (title="Source MA Type", type=input.string, defval="EMA",options=["EMA","SMA"])

len1=input(130,title="Fast MA Length")
len2=input(400,title="Slow MA Length")

smoothingavg = input (title="Smoothing MAs Type", type=input.string, defval="EMA",options=["EMA","SMA"])
smoothingavglen = input (3,title="Smoothing MAs Length")

trendfilter=input(true,title="Trend Filter")
trendfilterperiod=input(200,title="Trend Filter MA Period")
trendfiltertype=input (title="Trend Filter MA Type", type=input.string, defval="EMA",options=["EMA","SMA"])

volatilityfilter=input(false,title="Volatility Filter")
volatilitydelta=input(0.0003,step=0.0001,title="Delta Slopes EMA")

//variabili

m1 = if average == "EMA" 
    ema(close,len1)
else
    sma(close,len1)

m2=if average == "EMA" 
    ema(close,len2)
else
    sma(close,len2)

slp1=(m1-m1[1])/m1
slp2=(m2-m2[1])/m2

e1=if smoothingavg == "EMA" 
    ema(slp1,smoothingavglen)
else
    sma(slp1,smoothingavglen)

e2=if smoothingavg == "EMA" 
    ema(slp2,smoothingavglen)
else
    sma(slp2,smoothingavglen)

plot(e1,color=color.yellow)
plot(e2,color=color.red)
//plot (abs(e1-e2),color=color.white)
//plot (ema(e1-e2,9),color=color.yellow)

//variabili accessorie e condizioni

TrendConditionL=if trendfiltertype =="EMA"
    close>ema(close,trendfilterperiod)
else
    close>sma(close,trendfilterperiod)
    
TrendConditionS=if trendfiltertype =="EMA"
    close<ema(close,trendfilterperiod)
else
    close<sma(close,trendfilterperiod)
    
VolatilityCondition = abs(e1-e2) > volatilitydelta

ConditionEntryL= if trendfilter == true
    if volatilityfilter == true
        e1>e2 and TrendConditionL and VolatilityCondition
    else
        e1>e2 and TrendConditionL
else
    if volatilityfilter == true
        e1>e2 and VolatilityCondition
    else 
        e1>e2

ConditionEntryS= if trendfilter == true
    if volatilityfilter == true
        e1<e2 and TrendConditionS and VolatilityCondition
    else 
        e1<e2 and TrendConditionS
else
    if volatilityfilter == true
        e1<e2 and VolatilityCondition
    else
        e1<e2

ConditionExitL=crossunder(e1,e2)
ConditionExitS=crossover(e1,e2)

if true
    if ConditionExitS
        if strategy.position_size < 0
            strategy.close("SLPShort")

if true
    if ConditionExitL
        if strategy.position_size > 0
            strategy.close("SLPLong")

if true
    if ConditionEntryL
        strategy.entry ("SLPLong",long=true)
        
if true
    if ConditionEntryS 
        strategy.entry("SLPShort",long=false)