この戦略は,移動平均値のクロスオーバー原則に基づいています. 短期移動平均値が下から長期移動平均値を超えると購入信号を生成する2つの移動平均値を使用します. 価格が他の移動平均値を下回ると販売信号が生成されます. この戦略は,いくつかのノイズ取引を効果的にフィルタリングし,主要なトレンドを把握できるトレンド市場に適しています.
この戦略は,ユーザーに設定可能な短期間の移動平均と長期間の移動平均,出口移動平均の期間,移動平均の計算方法を使用します.
短期移動平均が下から長い移動平均を上回ると,買い信号が生成されます.これは短期トレンドが上昇傾向に切り替わり,私たちは買えることを示します.
閉じる価格が出口移動平均値を下回ると,セールシグナルが生成されます.これはトレンドの逆転を示します.
したがって,戦略の取引信号は,短期および長期移動平均のクロスオーバーと,閉値と出口移動平均の関係から来ます.
この戦略の利点は次のとおりです.
シンプルで簡単に実行できます
パーソナライズ可能なパラメータは 異なる市場条件に適しています
移動平均値は 騒音をフィルタリングして 主なトレンドを把握します
トレンドやサポート/レジスタンスなどの他の技術指標を組み込むことができます.
制御可能なリスク・報酬比で ストップ・ロスのメカニズムがあります
リスクは次のとおりです.
動向しない konsolidiation 市場では誤った信号に敏感です.
パラメータの設定が正しくない場合,トレンドが欠落したり,不正な取引が多すぎたりする可能性があります.
誤ったストップ・ロスは損失を増やす可能性があります
失敗した脱出は 損失を招く可能性があります
パラメータは市場の変化に合わせて 適度に調整する必要があります
解決策には,パラメータを最適化し,他のフィルターを組み込み,ストップを調整し,取引前にトレンドの確認を待つなどが含まれます.
この戦略は,次の方法で改善できます.
傾向決定のメカニズムを開発し,傾向の確認後に取引する.
フィルター信号にボリュームや波動性などのフィルターを追加します
移動平均期間の動的最適化
ストップ・ロスのメカニズムを最適化して トレイリング・ストップを使用します
サポート/レジスタンスおよび他の指標を組み込み,信号をさらに確認する.
異なる製品と時間枠に基づいてパラメータを調整する.
この移動平均クロスオーバー戦略は,単純で実践的なトレンドフォローシステムである.パラメータを調整して市場状況に調整し,トレンド市場の主要なトレンド方向を捉えることができます.しかし,トレンドの誤認などのリスクは注意すべきであり,変化する市場に適応するために常に最適化する必要があります.一般的に,この戦略は良好な可動性を持っています.
/*backtest start: 2022-10-30 00:00:00 end: 2023-11-05 00:00:00 period: 1d basePeriod: 1h 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/ // © TwoChiefs //@version=4 strategy("John EMA Crossover Strategy", overlay=true) //////////////////////////////////////////////////////////////////////////////// // BACKTESTING RANGE // From Date Inputs fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) fromYear = input(defval = 2020, title = "From Year", minval = 1970) // To Date Inputs toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) toYear = input(defval = 2021, title = "To Year", minval = 1970) // Calculate start/end date and time condition startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00) finishDate = timestamp(toYear, toMonth, toDay, 00, 00) time_cond = true //////////////////////////////////////////////////////////////////////////////// //CREATE USER-INPUT VARIABLES periodShort = input(13, minval=1, title="Enter Period for Short Moving Average") smoothingShort = input(title="Choose Smoothing Type for Short Moving Average", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "LSMA"]) periodLong = input(48, minval=1, title="Enter Period for Long Moving Average") smoothingLong = input(title="Choose Smoothing Type for Long Moving Average", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "LSMA"]) periodExit = input(30, minval=1, title="Enter Period for Exit Moving Average") smoothingExit = input(title="Choose Smoothing Type for Exit Moving Average", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "LSMA"]) src1 = close pivot = (high + low + close) / 3 //MA CALCULATION FUNCTION ma(smoothing, src, length) => if smoothing == "RMA" rma(src, length) else if smoothing == "SMA" sma(src, length) else if smoothing == "EMA" ema(src, length) else if smoothing == "WMA" wma(src, length) else if smoothing == "VWMA" vwma(src, length) else if smoothing == "SMMA" na(src[1]) ? sma(src, length) : (src[1] * (length - 1) + src) / length else if smoothing == "HullMA" wma(2 * wma(src, length / 2) - wma(src, length), round(sqrt(length))) //ASSIGN A MOVING AVERAGE RESULT TO A VARIABLE shortMA=ma(smoothingShort, pivot, periodShort) longMA=ma(smoothingLong, pivot, periodLong) exitMA=ma(smoothingExit, pivot, periodExit) //PLOT THOSE VARIABLES plot(shortMA, linewidth=4, color=color.yellow,title="The Short Moving Average") plot(longMA, linewidth=4, color=color.blue,title="The Long Moving Average") plot(exitMA, linewidth=1, color=color.red,title="The Exit CrossUnder Moving Average") //BUY STRATEGY buy = crossover(shortMA,longMA) ? true : na exit = crossunder(close,exitMA) ? true : na strategy.entry("long",true,when=buy and time_cond) strategy.close("long",when=exit and time_cond) if (not time_cond) strategy.close_all()