この戦略は,トレンドフォロー戦略に属する,高速EMAと遅いEMAのクロスオーバーとクロスアンダーに基づいた取引信号を生成する.高速EMAが遅いEMAを横切ったときに購入し,高速EMAが遅いEMAを横切ったときに販売し,単純なトレンド追跡戦略を実装する.
この戦略の主な論理は主に以下の部分を含みます.
速さと遅いEMAを計算する:長さのfastInputの速いEMAと長さのslowInputの遅いEMAを計算するためにta.ema() を使用する.
バックテストの時間範囲を設定します. バックテストの時間範囲をフィルタにするかどうかを設定するには useDateFilter を使用し,開始と終了時間を設定するには backtestStartDate と backtestEndDate を使用します.
トレーディング・シグナルを生成する: 速いEMAが遅いEMAを横切ると買い信号を生成し,速いEMAが遅いEMAを横切ると売り信号を生成する.
バックテストの時間範囲外での注文の取り扱い: バックテストの時間範囲外での未完了注文をキャンセルし,すべてのポジションを平らにする.
EMA線をグラフ化します. グラフ上の高速で遅い EMA線をグラフ化します.
これは非常にシンプルなトレンドフォロー戦略で,以下の利点があります.
シンプルな論理で 分かりやすく実行できます
EMAは価格データを平滑させ 取引の騒音を軽減します
調整可能な EMA 期間で,異なる市場環境に適応できます.
柔軟なバックテスト時間範囲で特定の期間をテストする.
導入と離脱条件を最適化し,他の指標と組み合わせることができます.
この戦略にはいくつかのリスクもあります:
双 EMA 戦略は粗末で,市場の変化に柔軟に適応できない.
取引の頻度や繰り返しのリスク
誤った EMA パラメータは,間違った取引信号を引き起こす可能性があります.
バックテストの時間範囲が不合理で オーバーフィットが起こる可能性があります
避けられない減額と損失のリスク
リスクはパラメータの最適化,波動のフィルタリング,ストップ・ロストなどによって管理できます
この戦略は,次の側面で最適化できます.
最適なパラメータの組み合わせを見つけるために EMA 期間を最適化します.
不必要な取引をフィルタリングするための他の指標を追加します.
ストップロスを追加して単一の取引損失を制御します.
取引頻度を減らすためにトレンドや波動性フィルターを組み込む
最も適したものを探すために,様々な製品を試す.
より現実的なバックテストのために,スライドを使用します.
概要すると,これは高速と遅いEMAを比較することで明確な論理を持つ非常にシンプルな二重EMAクロスオーバー戦略である.利点はシンプルな実装であるが,頻繁な取引,オーバーフィッティングなどの問題もある.次のステップは,より堅牢な戦略のためのパラメータ最適化,リスク管理の改善である.
/*backtest start: 2022-11-06 00:00:00 end: 2023-11-12 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("MollyETF_EMA_Crossover", overlay = true, initial_capital = 100000, default_qty_value=100, default_qty_type=strategy.percent_of_equity) fastInput = input( 10, "Fast EMA") slowInput = input( 21, "Slow EMA") // Calculate two moving averages with different lengths. float fastMA = ta.ema(close, fastInput) float slowMA = ta.ema(close, slowInput) // STEP 1. Create inputs that configure the backtest's date range useDateFilter = input.bool(true, title="Filter Date Range of Backtest", group="Backtest Time Period") backtestStartDate = input(timestamp("1 Jan 2018"), title="Start Date", group="Backtest Time Period", tooltip="This start date is in the time zone of the exchange " + "where the chart's instrument trades. It doesn't use the time " + "zone of the chart or of your computer.") backtestEndDate = input(timestamp("7 Sep 2023"), title="End Date", group="Backtest Time Period", tooltip="This end date is in the time zone of the exchange " + "where the chart's instrument trades. It doesn't use the time " + "zone of the chart or of your computer.") // STEP 2. See if current bar falls inside the date range inTradeWindow = true // STEP 3. Include the date filter with the entry order conditions // Enter a long position when `fastMA` crosses over `slowMA`. if inTradeWindow and ta.crossover(fastMA, slowMA) strategy.entry("buy", strategy.long) // Enter a short position when `fastMA` crosses under `slowMA`. if inTradeWindow and ta.crossunder(fastMA, slowMA) strategy.close_all(comment="sell") // STEP 4. With the backtest date range over, exit all open // trades and cancel all unfilled pending orders if not inTradeWindow and inTradeWindow[1] strategy.cancel_all() strategy.close_all(comment="Date Range Exit") // Plot the moving averages. plot(fastMA, "Fast MA", color.aqua) plot(slowMA, "Slow MA", color.orange)