ダブル移動平均クロスオーバー戦略は,異なる期間の移動平均を計算して価格傾向方向を判断し,トレンドフォローを実現する.短い期間の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 を採用することで,短期的および長期的動向を判断できます.
利益とストップロスの論理は 利益とリスクを制御します
フィルターは ある程度 誤った信号を 避けるのに役立ちます
パラメータは自由に設定し,期間は異なる市場環境に最適化できます.
単一要素戦略として,取引信号は十分に安定していない可能性があります.価格統合中にウィップソーが発生することがあります.
クロスオーバーが起こると 価格が上昇/下落し始めている可能性があり 高い価格で購入し 低い価格で販売するリスクがあります
取引コストは考慮されない 実際の収益は低いかもしれません
ストップ・ロスはなく 極端な市場状況で 無制限の損失を リスクにします
解決策:
より安定した信号のために MA 期間を最適化します.
フィルター信号に他の指標を追加します.
貿易規模を拡大してコストを削減する
最大損失を制限するために適切なストップ損失を設定します.
戦略は以下の側面で最適化できます.
最適な組み合わせを見つけるために MA 期間を最適化するか, 最適な期間を動的に選択するために適応性最適化を使用します.
MACD,KDなどの他の技術指標を追加してシグナルをフィルタリングして品質を向上させたり,機械学習を使用してシグナルをスコアして偽のシグナルをフィルタリングします.
音量分析を組み込む.MAクロスオーバーで音量が不十分なら信号を取らない.
クロスオーバーが起こる前に価格変動をチェックします. レンジング市場のクロスオーバーは誤った信号かもしれません.
ストップ・ロスの距離を減らすため,ストップ・ロスの遅れ,チェンデリア・エグジットなどのダイナミックなストップ・ロスのメカニズムを構築し,効果を保ちます.
ポジションのサイズを固定/動的/レバレッジで最適化して,より合理的な利益/損失比を達成する.
取引コスト,スリップを包括的に考慮し,ライブ取引で収益性を確保するために,利益/ストップ損失比を最適化します.
この戦略の全体的な構造は健全で,トレンド方向を決定するためのダブル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 = " ")