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

作者: リン・ハーンチャオチャン,日付:2023年11月16日 17:50:52
タグ:

img

概要

ダブル移動平均クロスオーバー戦略は,異なる期間の移動平均を計算して価格傾向方向を判断し,トレンドフォローを実現する.短い期間のMAが長い期間のMAを横切ると長くなって,短い期間のMAが長い期間のMAを下回ると短くなってしまいます.これは典型的なトレンドフォロー戦略です.

戦略の論理

この戦略は9,21および50期間の指数関数移動平均値 (EMA) をベースにしています. 9期間のEMAは短期トレンド,21期間のEMAは中期トレンド,50期間のEMAは長期トレンドを表しています.

9期EMAが21期EMAを横切ると,短期的には上昇傾向を示す.21期EMAを下回ると,短期的には下落傾向を示す.クロスオーバー (crossover) 関数は,MAs間のクロスオーバーを決定するために使用される.

ロング/ショートエントリー,テイク・プロフィート,ストップ・ロスのロジックは設定されています.エントリー条件はMAのクロスオーバーです.ロングテイク・プロフィートはエントリー価格 * (1 + インプットテイク・プロフィート比),ショートテイク・プロフィートはエントリー価格 * (1 - インプットテイク・プロフィート比).ロング・ストップ・ロスはエントリー価格 * (1 - インプットストップ・ロスの比),ショート・ストップ・ロスはエントリー価格 * (1 + インプットストップ・ロスの比).

また,トレンドフィルタは横向を避けるため,戦略のエクイティが低すぎると取引を避けるため,エクイティフィルタも追加されます.これらのフィルタは,いくつかの誤った信号を避けるのに役立ちます.

要するに,この戦略は,価格トレンド方向を決定するために二重EMAクロスオーバーを使用し,適切な利益とストップ損失論理を使用して,中期から長期間のトレンドを把握することができます. しかし,単一要因戦略として,シグナルが十分に安定していない場合があり,さらに最適化することができます.

利点分析

  • 2つのMAクロスオーバーを使用してトレンド方向を決定すると,論理は単純で理解しやすい.

  • 異なる期間の EMA を採用することで,短期的および長期的動向を判断できます.

  • 利益とストップロスの論理は 利益とリスクを制御します

  • フィルターは ある程度 誤った信号を 避けるのに役立ちます

  • パラメータは自由に設定し,期間は異なる市場環境に最適化できます.

リスク分析

  • 単一要素戦略として,取引信号は十分に安定していない可能性があります.価格統合中にウィップソーが発生することがあります.

  • クロスオーバーが起こると 価格が上昇/下落し始めている可能性があり 高い価格で購入し 低い価格で販売するリスクがあります

  • 取引コストは考慮されない 実際の収益は低いかもしれません

  • ストップ・ロスはなく 極端な市場状況で 無制限の損失を リスクにします

解決策:

  1. より安定した信号のために MA 期間を最適化します.

  2. フィルター信号に他の指標を追加します.

  3. 貿易規模を拡大してコストを削減する

  4. 最大損失を制限するために適切なストップ損失を設定します.

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

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

  1. 最適な組み合わせを見つけるために MA 期間を最適化するか, 最適な期間を動的に選択するために適応性最適化を使用します.

  2. MACD,KDなどの他の技術指標を追加してシグナルをフィルタリングして品質を向上させたり,機械学習を使用してシグナルをスコアして偽のシグナルをフィルタリングします.

  3. 音量分析を組み込む.MAクロスオーバーで音量が不十分なら信号を取らない.

  4. クロスオーバーが起こる前に価格変動をチェックします. レンジング市場のクロスオーバーは誤った信号かもしれません.

  5. ストップ・ロスの距離を減らすため,ストップ・ロスの遅れ,チェンデリア・エグジットなどのダイナミックなストップ・ロスのメカニズムを構築し,効果を保ちます.

  6. ポジションのサイズを固定/動的/レバレッジで最適化して,より合理的な利益/損失比を達成する.

  7. 取引コスト,スリップを包括的に考慮し,ライブ取引で収益性を確保するために,利益/ストップ損失比を最適化します.

結論

この戦略の全体的な構造は健全で,トレンド方向を決定するためのダブルEMAクロスオーバーの単純な論理,トレンドを把握するための利益とストップ損失の論理と結合している.単一要素戦略として,パラメータ,シグナルフィルターなどでさらに最適化され,より堅牢なものになります.適切なストップ損失とポジションサイズ化により,リスクはさらに軽減できます.全体的に,最適化と調整後に一貫した利益を達成できる戦略フレームワークに従う堅固なトレンドを提供します.


/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-15 00:00:00
period: 1h
basePeriod: 15m
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/
// © TradingMentalist

//@version=4
strategy("Initial template",initial_capital=1000, overlay=true, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.04, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inputs
//turn on/off longs/shorts / extraneous conditions
longinc=input(true, title="include longs?")
lConSw2=input(true, title="condition two?")
lConSw3=input(true, title="condition three?")
shotinc=input(true, title="include shorts?")
sConSw2=input(true, title="condition two?")
sConSw3=input(true, title="condition three?")

//turn on/off / adjust trade filters (average range/average equity)
sidein2     = input(200, step=10, title='lookback for average range (bars)')
sidein      = input(1, title='filter trades if range is less than (%)')/100
equityIn    = input(40, title='filter trades if equity is below ema()')
sidewayssw  = input(true, title='sideways filter?')
equitysw    = input(true, title='equity filter?')
longtpin    = input(1,step=0.1, title='long TP %')/100
longslin    = input(0.4,step=0.1, title='long SL %')/100
shorttpin   = input(1,step=0.1, title='short TP %')/100
shortslin   = input(0.4,step=0.1, title='short SL %')/100

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////filters
//(leave as is)
side1       = (close[1] + close[sidein2]) / 2
side2       = close[1] - close[sidein2] 
side3       = side2 / side1
notsideways = side3 > sidein
equityMa    = equitysw ? ema(strategy.equity, equityIn) : 0
equityCon   = strategy.equity >= equityMa

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////indicators
ma1 = ema(close, 9)
ma2 = ema(close, 21)
ma3 = ema(close, 50)

plot(ma1, color=color.new(#E8B6B0,50))
plot(ma2, color=color.new(#B0E8BE,50))
plot(ma3, color=color.new(#00EEFF,50))

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////conditions
//adjust conditions
//-------------------------------------------
longCondition1  = crossover(ma2,ma3)
longCondition2  = close[5] > close[10]
longCondition3  = close[1] > close[2]

shortCondition1 = crossover(ma3,ma2)
shortCondition2 = close[5] < close[10]
shortCondition3 = close[1] < close[2]

closelong       = shortCondition1
closeshort      = longCondition1
//-------------------------------------------

//(leave as is)
longCondition1in  = longCondition1
longCondition2in  = lConSw2 ? longCondition2 : true
longCondition3in  = lConSw3 ? longCondition3 : true
shortCondition1in = shortCondition1
shortCondition2in = sConSw2 ? shortCondition2: true
shortCondition3in = sConSw3 ? shortCondition3: true
longConditions    = longCondition1in and longCondition2in and longCondition3in
shortConditions   = shortCondition1in and shortCondition2in and shortCondition3in

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////execution
//(leave as is)
long            = sidewayssw ? notsideways and equityCon and longConditions : equityCon and longConditions
short           = sidewayssw ? notsideways and equityCon and shortConditions : equityCon and shortConditions

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////risk
//(leave as is)
longtplevel     = strategy.position_avg_price * (1 + longtpin)
longsllevel     = strategy.position_avg_price * (1 - longslin)
shorttplevel    = strategy.position_avg_price * (1 - shorttpin)
shortsllevel    = strategy.position_avg_price * (1 + shortslin)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////timeframe
//adjust timeframe
//-------------------------------------------
startyear   = 2000
startmonth  = 1
startday    = 1

stopyear    = 9999
stopmonth   = 12
stopday     = 31
//-------------------------------------------

//(leave as is)
startperiod = timestamp(startyear,startmonth,startday,0,0)
periodstop  = timestamp(stopyear,stopmonth,stopday,0,0)
timeframe()    =>
    time >= startperiod and time <= periodstop ? true : false

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////orders
//comments are empty characters for clear chart
if timeframe()
    if longinc
        if strategy.position_size == 0 or strategy.position_size > 0 
            strategy.entry(id="long", long=true, when=long, comment=" ")
            strategy.exit("stop","long", limit=longtplevel, stop=longsllevel,comment=" ")
            strategy.close(id="long", when=closelong, comment = " ")
    if shotinc
        if strategy.position_size == 0 or strategy.position_size < 0 
            strategy.entry(id="short", long=false, when=short, comment = " ")
            strategy.exit("stop","short", limit=shorttplevel, stop=shortsllevel,comment = " ")
            strategy.close(id="short", when=closeshort, comment = " ")

もっと