この戦略は,異なる期間の3つの移動平均を計算し,価格突破を組み合わせて取引信号を生成する.これは典型的なトレンドフォロー戦略に属している.この戦略は,市場の中期トレンドを追求することを目的とし,パラメータを動的に調整することによって異なる製品や取引環境に適応することができる.
この戦略には,MA1,MA2,MA3という3つの移動平均値が含まれています.MA1とMA2は取引チャネルを形成し,そのクロスオーバーは取引信号を生成します.MA3は信号をフィルタリングするために使用されます.
急速移動平均MA1が中期移動平均MA2を超えると,短期トレンドの強化を示します.この時点で,価格が長期移動平均MA3を超えると,ロング信号が生成されます.逆に,MA1がMA2を下回り,価格がMA3を下回ると,ショート信号が生成されます.
MA3の役割は,短期間の市場騒音をフィルタリングし,トレンドが中期および長期段階に入っていることを決定した後のみシグナルを生成することです. 3つの移動平均値のパラメータを動的に調整することによって,戦略は異なる市場で最適なパラメータ組み合わせを見つけることができます.
異なる製品のためのMA期間を最適化できる. 単一の損失を制御するためにストップ損失を最適化できる. 信号の有効性を確認し,偽信号を減らすために他の技術指標を組み合わせることができる.
この戦略は,三つの移動平均を計算し,その交差点を観察することによって取引信号を生成する.トレンドを決定するために高速,中等,遅い線を組み合わせるアイデアを使用して,典型的なトレンドフォロー戦略である.この戦略はパラメータ最適化を通じて異なる製品に適応できるが,ウィップソーや欠陥の危険性がある.将来の改善は,信号の有効性を判断するための他の技術指標を導入し,ダイナミックパラメータ最適化メカニズムを開発し,戦略をより柔軟にする可能性がある.
/*backtest start: 2023-01-16 00:00:00 end: 2024-01-22 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/ // © Meesemoo //@version=4 strategy("Custom MA Strategy Tester", overlay = true) MA1Period = input(13, title="MA1 Period") MA1Type = input(title="MA1 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "DEMA", "TEMA"]) MA1Source = input(title="MA1 Source", type=input.source, defval=close) MA1Visible = input(title="MA1 Visible", type=input.bool, defval=true) MA2Period = input(50, title="MA2 Period") MA2Type = input(title="MA2 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "DEMA", "TEMA"]) MA2Source = input(title="MA2 Source", type=input.source, defval=close) MA2Visible = input(title="MA2 Visible", type=input.bool, defval=true) MA3Period = input(200, title="MA3 Period") MA3Type = input(title="MA3 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "DEMA", "TEMA"]) MA3Source = input(title="MA3 Source", type=input.source, defval=close) MA3Visible = input(title="MA3 Visible", type=input.bool, defval=true) ShowCrosses = input(title="Show Crosses", type=input.bool, defval=true) MA1 = if MA1Type == "SMA" sma(MA1Source, MA1Period) else if MA1Type == "EMA" ema(MA1Source, MA1Period) else if MA1Type == "WMA" wma(MA1Source, MA1Period) else if MA1Type == "RMA" rma(MA1Source, MA1Period) else if MA1Type == "HMA" wma(2*wma(MA1Source, MA1Period/2)-wma(MA1Source, MA1Period), round(sqrt(MA1Period))) else if MA1Type == "DEMA" e = ema(MA1Source, MA1Period) 2 * e - ema(e, MA1Period) else if MA1Type == "TEMA" e = ema(MA1Source, MA1Period) 3 * (e - ema(e, MA1Period)) + ema(ema(e, MA1Period), MA1Period) MA2 = if MA2Type == "SMA" sma(MA2Source, MA2Period) else if MA2Type == "EMA" ema(MA2Source, MA2Period) else if MA2Type == "WMA" wma(MA2Source, MA2Period) else if MA2Type == "RMA" rma(MA2Source, MA2Period) else if MA2Type == "HMA" wma(2*wma(MA2Source, MA2Period/2)-wma(MA2Source, MA2Period), round(sqrt(MA2Period))) else if MA2Type == "DEMA" e = ema(MA2Source, MA2Period) 2 * e - ema(e, MA2Period) else if MA2Type == "TEMA" e = ema(MA2Source, MA2Period) 3 * (e - ema(e, MA2Period)) + ema(ema(e, MA2Period), MA2Period) MA3 = if MA3Type == "SMA" sma(MA3Source, MA3Period) else if MA3Type == "EMA" ema(MA3Source, MA3Period) else if MA3Type == "WMA" wma(MA3Source, MA3Period) else if MA3Type == "RMA" rma(MA3Source, MA3Period) else if MA3Type == "HMA" wma(2*wma(MA3Source, MA3Period/2)-wma(MA3Source, MA3Period), round(sqrt(MA3Period))) else if MA3Type == "DEMA" e = ema(MA3Source, MA3Period) 2 * e - ema(e, MA3Period) else if MA3Type == "TEMA" e = ema(MA3Source, MA3Period) 3 * (e - ema(e, MA3Period)) + ema(ema(e, MA3Period), MA3Period) p1 = plot(MA1Visible ? MA1 : na, color=color.green, linewidth=1) p2 = plot(MA2Visible ? MA2 : na, color=color.yellow, linewidth=1) p3 = plot(MA3Visible ? MA3 : na, color=color.red, linewidth=2) fill(p1, p2, color.silver, transp=80, title="Fill") start = timestamp(2019, 1, 1, 1, 0) end = timestamp(2025, 1, 1, 1, 0) if time >= start and time <= end longCondition = crossover(MA1, MA2) and close > MA3 if (longCondition) strategy.entry("Long", strategy.long) shortCondition = crossunder(MA1, MA2) and close < MA3 if (shortCondition) strategy.entry("Short", strategy.short)