この戦略の主なアイデアは,複数の指数関数移動平均値 (EMA) のクロスオーバーに基づいて取引信号を生成することです. 短期EMAがより長期EMAを下からクロスするとロングになり,短期EMAがより長期EMAを下からクロスするとポジションを閉じます. この戦略は複数のEMA期間を構成することができ,各EMAは独立して有効化できます. 戦略はすべての有効化されたEMAでクロスオーバーを取引します.
マルチタイムフレーム・ダイナミック・EMA・トレーディング・戦略
この戦略は8日,13日,21日,34日,55日,89日,144日,233日という8つのEMA期間を設定しています.これらのEMAは独立して有効または無効にすることができます.
短期のEMAが下から長期のEMAを横切るときに長信号を生成する.短期のEMAが上から長期のEMAを横切るときに退出信号を生成する.したがって,2つのEMAが有効である場合,短期のEMA > longerEMAは長信号であり,短めのEMA < longerEMAは退出信号である.
例えば,55日 EMA と 89日 EMA が有効になっている場合,55日 EMA が 89日 EMA を越えるときにストラテジーは長引く.55日 EMA が 89日 EMA を越えるときは終了する.これは,ストラテジーは使用された EMA 組み合わせを動的に調整し,より長いタイムフレームから短く,またはその逆に切り替えることができます.
ポジションのサイズ設定は,EMAのクロスオーバーごとにポジションのサイズが等しくなるように,口座の自己資本を,EMAが有効になった数で割った Closeで割るように設定されます.
EMAを他の指標,例えばチャネルや振動器と組み合わせてシグナルをフィルターするか,トレンドおよび逆転指標を組み込むことを検討する.また,EMAパラメータを最適化することは非常に重要です.異なる市場のために調整する必要があります.
戦略は,いくつかの側面で最適化することができます:
EMAのパラメータを最適化して パラメータスキャンやウォークフォワード分析を行って EMAの組み合わせを最適化します
EMAクロスオーバーにフィルター条件を追加し,誤った信号を避ける.例えば,ボリュームフィルター,波動性フィルターなど.
MACD,KDJ,ボリンジャーバンドなどの他の指標と組み合わせて 互いを補完する利点を得ます
市場変動やトレンド強度に基づいて,各EMAのポジションサイズを動的に調整する.
ストップ・ロスを最適化し 利得レベルを設定して 最良のリスク・リターン比を達成します
EMAは,短期および中期トレンドを把握するために,EMAクロスオーバーからシグナルを生成する非常にシンプルで直接的な戦略である.その主な利点は,トレーダーが自分に適したEMAを選択できるようにするための高度な構成性と柔軟性にある.しかし,EMA単独では,最も大きなリスクである偽信号を容易に与えることができる.他の指標とパラメータ最適化と組み合わせることで,より良い取引パフォーマンスにつながる.
/*backtest start: 2023-11-11 00:00:00 end: 2023-12-11 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("EMA Fan", shorttitle = "EMA Fan", overlay=true) // Revision: 1 // Author: @ToS_MavericK buyprice = 0.0 buyprice := buyprice[1] // === INPUT SMA === EMA1 = input(8) EMA2 = input(13) EMA3 = input(21) EMA4 = input(34) EMA5 = input(55) EMA6 = input(89) EMA7 = input(144) EMA8 = input(233) EnableEMA1 = input(true) EnableEMA2 = input(true) EnableEMA3 = input(true) EnableEMA4 = input(true) EnableEMA5 = input(true) EnableEMA6 = input(true) EnableEMA7 = input(true) EnableEMA8 = input(true) //Profit = input(defval = 5, type = integer, title = "Profit", minval = 1, step = 1) //StopLoss = input(defval = 15, type = integer, title = "StopLoss", minval = 1, step = 1) // === INPUT BACKTEST RANGE === FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2018, title = "From Year", minval = 2012) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 2020, title = "To Year", minval = 2012) // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => true // create function "within window of time" // === SERIES SETUP === vEMA1 = ema(close, EMA1) vEMA2 = ema(close, EMA2) vEMA3 = ema(close, EMA3) vEMA4 = ema(close, EMA4) vEMA5 = ema(close, EMA5) vEMA6 = ema(close, EMA6) vEMA7 = ema(close, EMA7) vEMA8 = ema(close, EMA8) count = -1 if (EnableEMA1 == true) count := count + 1 if (EnableEMA2 == true) count := count + 1 if (EnableEMA3 == true) count := count + 1 if (EnableEMA4 == true) count := count + 1 if (EnableEMA5 == true) count := count + 1 if (EnableEMA6 == true) count := count + 1 if (EnableEMA7 == true) count := count + 1 if (EnableEMA8 == true) count := count + 1 // set position size Amount = 1 / (close * count) // === EXECUTION === strategy.entry("EMA1", strategy.long, qty = Amount, when = window() and crossover(vEMA1,vEMA2) and EnableEMA1 and EnableEMA2) strategy.close("EMA1", time > finish or crossunder(vEMA1,vEMA2)) strategy.entry("EMA2", strategy.long, qty = Amount, when = window() and crossover(vEMA2,vEMA3) and EnableEMA2 and EnableEMA3) strategy.close("EMA2", time > finish or crossunder(vEMA2,vEMA3)) strategy.entry("EMA3", strategy.long, qty = Amount, when = window() and crossover(vEMA3,vEMA4) and EnableEMA3 and EnableEMA4) strategy.close("EMA3", time > finish or crossunder(vEMA3,vEMA4)) strategy.entry("EMA4", strategy.long, qty = Amount, when = window() and crossover(vEMA4,vEMA5) and EnableEMA4 and EnableEMA5) strategy.close("EMA4", time > finish or crossunder(vEMA4,vEMA5)) strategy.entry("EMA5", strategy.long, qty = Amount, when = window() and crossover(vEMA5,vEMA6) and EnableEMA5 and EnableEMA6) strategy.close("EMA5", time > finish or crossunder(vEMA5,vEMA6)) strategy.entry("EMA6", strategy.long, qty = Amount, when = window() and crossover(vEMA6,vEMA7) and EnableEMA6 and EnableEMA7) strategy.close("EMA6", time > finish or crossunder(vEMA6,vEMA7)) strategy.entry("EMA7", strategy.long, qty = Amount, when = window() and crossover(vEMA7,vEMA8) and EnableEMA7 and EnableEMA8) strategy.close("EMA7", time > finish or crossunder(vEMA7,vEMA8)) plot(vEMA1, title = 'EMA1', color = red, linewidth = 2, style = line) // plot FastMA plot(vEMA2, title = 'EMA2', color = orange, linewidth = 2, style = line) // plot SlowMA plot(vEMA3, title = 'EMA3', color = yellow, linewidth = 2, style = line) // plot SlowMA plot(vEMA4, title = 'EMA4', color = green, linewidth = 2, style = line) // plot SlowMA plot(vEMA5, title = 'EMA5', color = teal, linewidth = 2, style = line) // plot SlowMA plot(vEMA6, title = 'EMA6', color = blue, linewidth = 2, style = line) // plot SlowMA plot(vEMA7, title = 'EMA7', color = maroon, linewidth = 2, style = line) // plot SlowMA plot(vEMA8, title = 'EMA8', color = white, linewidth = 2, style = line) // plot SlowMA //plot(long_stop, title = 'High-ATR', color = red, linewidth = 2, style = line) // plot SlowMA //plot(short_stop, title = 'Low+ATR', color = green, linewidth = 2, style = line) // plot SlowMA