戦略をフォローするダブル移動平均クロスオーバーMACDトレンド

作者: リン・ハーンチャオチャン,日付: 2024-01-23 11:22:02
タグ:

img

概要

この戦略は,MACD技術指標の二重移動平均クロスオーバーに基づいた自動化された取引戦略である.MACDの信号ラインクロスオーバーを使用して,トレンドフォローのトレンド方向を決定する.

戦略の論理

この戦略は,まずMACD指標の3つの線を計算します. 速い線,スローライン,ヒストグラム. 速い線は短い期間におけるより速い移動平均線であり,スローラインは長い期間におけるより遅い移動平均線です. ヒストグラムは,速い線とスローラインの違いです. 速い線がスローラインを越えると,それは購入信号を示す黄金十字信号です. 速い線がスローラインを下に越えると,それは販売信号を示す死亡十字信号です.

この戦略は,この論理を利用して,金色のクロスでロング,死色のクロスでクローズする;または,死色のクロスでショート,金色のクロスでクローズする,トレンドを自動的にフォローする.一方,この戦略は,絶対MACD線が正または負であるかどうかを判断し,誤った信号を回避し,トレンド逆転点を真に把握することを保証します.

戦略 の 利点

  • トレンド方向を正確に決定し,トレンド逆転を捕捉するために二重移動平均クロスオーバーを使用します.
  • MACD技術指標は誤った信号を減少させ,信号の質を向上させる.
  • 長期または短期または長期/短期のみの柔軟性
  • 調整可能なパラメータは,異なる市場環境に対応します.

戦略 の リスク

  • 二重移動平均のクロスオーバーは遅延効果があり,逆転の開始時に部分的な利益を見逃す可能性があります.
  • 市場統合中に誤った信号に易しいMACD指標
  • パラメータは,過度に敏感または無活性化しないために適切に調整する必要があります

リスク軽減

  • 他の指標と組み合わせてシグナルをフィルタリングする
  • 取引頻度を下げるパラメータを調整する
  • 傾向が明らかになる時のみ戦略を採用する

強化 分野

戦略は次の側面から強化される:

  1. KDJ,ボリンジャー帯など他の指標を組み込む 信号を確認し,偽信号をフィルター

  2. 入力メカニズムの改善,例えば,早速または遅刻入力を避けるため,ブレイクアウトフィルターを追加する

  3. パラメータ設定を最適化し,異なるタイムフレームと市場体制に基づいて,高速と遅いライン期間を調整します

  4. 単一の取引損失を制御するためにストップロスを追加する

  5. 外国為替,暗号通貨などの他の製品に拡大

概要

二重移動平均クロスオーバーMACDトレンドフォロー戦略は,シグナルラインクロスオーバーと組み合わせたMACD指標を使用してトレンド方向を決定し,シグナルを効果的にフィルタリングし,自動的なトレンドフォローのためにトレンド逆転を捕捉する.利点は,正確なトレンド判断,柔軟なパラメータチューニング,市場環境に対応している.リスク管理は,誤った信号を避けるために重要です.追加の技術指標とパラメータチューニングによるさらなる最適化は戦略のパフォーマンスを向上させることができます.


/*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/
// © DeMindSET

//@version=4
strategy("MACD Trend Follow Strategy", overlay=false)
// Getting inputs
LSB = input(title="Long/Short", defval="Long only", options=["Long only", "Short only" , "Both"]) 
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal

plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
plot(macd, title="MACD", color=col_macd, transp=0)
plot(signal, title="Signal", color=col_signal, transp=0)
//
Bull= macd > signal
Bear= macd < signal
ConBull=macd>0
ConBear=macd<0
//
Green= Bull and ConBull
Red= Bear and ConBear
Yellow= Bull and ConBear
Blue= Bear and ConBull
//
bcolor = Green ? color.green : Red ? color.red : Yellow ? color.yellow : Blue ? color.blue : na
barcolor(color=bcolor)
// === INPUT BACKTEST RANGE ===
FromYear  = input(defval = 2019, title = "From Year", minval = 1920)
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2009)
ToMonth   = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 31, title = "To Day", minval = 1, maxval = 31)

// === 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"

if LSB == "Long only" and Green
    strategy.entry("L",true)
if LSB == "Long only" and Red
    strategy.close("L",qty_percent=100,comment="TP Long")
if LSB == "Both" and Green
    strategy.entry("L",true)
if LSB == "Both" and Red
    strategy.entry("S",false)
if LSB == "Short only" and Red
    strategy.entry("S",false)
if LSB == "Short only" and Green
    strategy.close("S",qty_percent=100,comment="TP Short")


もっと