MACDゴールデンクロスとデッドクロストレンド追跡戦略


作成日: 2023-12-22 11:45:54 最終変更日: 2023-12-22 11:45:54
コピー: 1 クリック数: 1112
1
フォロー
1623
フォロワー

MACDゴールデンクロスとデッドクロストレンド追跡戦略

概要

この戦略は,MACD指標の金叉死叉によってトレンドの方向を判断し,ATR指標と連携してストップ・ストップを行い,トレンドを追跡する取引を実現する.戦略の名前にある金叉死叉という言葉は,MACD指標の金叉死叉信号を使用することを突出している.

戦略原則

MACD線がシグナル線を上下から横切って正の値に変化すると,買い信号が生じます.これは金叉信号で,株価の上昇傾向が形成されます. MACD線がシグナル線を上下から横切って負の値に変化すると,売り信号が生じます.これは死叉信号で,株価の下降傾向が形成されます.

この戦略は,金叉時に多行し,死叉時に空行し,トレンド追跡を実現するものです. 同時に,戦略は,ATR指標を導入し,ストップ・ロスの計算を止めて,取引システムの構築を完了します.

具体的には,戦略はまず,急速移動平均,遅い移動平均,MACD差値,シグナルラインなどの標準MACD指標を計算する.それから,選択された5つの信号 ((継続信号,反転信号,柱状図信号,MACD零軸交差,Signal零軸交差) に基づいて金叉死交を判断する.最後にATR指標と組み合わせてストップ・ローズを設定し,入場と出場の論理を完了する.

優位分析

この戦略の利点は以下の通りです.

  1. MACD指数は,トレンドの方向を判断する上で正確で信頼性があり,長年にわたってトレンドの判断においてMACD指数は顕著に表れている.

  2. ATR指数と組み合わせたストップ・ストップ・セットは,単一の取引のリスク・リターン比率を効果的に制御し,損失の確率を下げる.

  3. 5つの選択可能なシグナルが提供され,異なる市場に対してより適切なシグナルを適用して,戦略の適応性を向上させることができます.

  4. パラメータの最適化により,よりよい取引結果が得られます.

リスクと解決策

この戦略にはいくつかのリスクがあります.

  1. MACD指標は誤信号を生じやすく,不必要な損失を引き起こす可能性があります.他の指標のフィルター信号と組み合わせることができます.

  2. ATR指標は,最近の波動のみをモデル化しており,極端な状況に対して正確なストップダスを行うことはできません. ダイナミックストップダスを導入することで解決できます.

  3. 選択信号の効果は不安定であり,最適なパラメータを決定するために大量の反測が必要である.

  4. 信号パラメータとリスク管理パラメータを同時に最適化する必要がある.そうでなければ,最適化を行うことは困難である.段階的な最適化方法を採用することを推奨する.

改善の提案

この戦略は,以下の点で最適化できます.

  1. TMA,hullMAなどの他の移動平均を試し,MACD信号をフィルターする.

  2. ダイナミック・ストップ・メカニズムを試すことで,極端な状況の変動をうまく処理できます.

  3. MACD指標の従来のパラメータの組み合わせを細工して最適化し,よりよいパラメータを見つけます.

  4. 機械学習により,最適のATRの倍数を見つけ,より優れたリスク管理を実現します.

  5. 5種類の信号タイプをそれぞれ再テストし,最適な信号を決定した.

  6. ニューラルネットワークを訓練し,MACDベースの新しい信号を探し出す.

要約する

このMACD金叉死叉トレンド追跡戦略は,MACD指標を使用してトレンドの方向を判断し,ATR指標と連携してストップストップを行い,トレンド取引機会を効果的に得ることができる.戦略には,指標パラメータの最適化,ストップメカニズムの完成,シグナルタイプの選択など,複数の利点があります.次の作業は,信号品質の向上,ストップメカニズムの改善,パラメータ選択の最適化などで開始され,より優れた反測と実盤結果が得られます.

ストラテジーソースコード
/*backtest
start: 2023-11-21 00:00:00
end: 2023-12-21 00:00:00
period: 1h
basePeriod: 15m
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/
// © vuagnouxb

//@version=4
strategy("BV's MACD SIGNAL TESTER", overlay=true)

//------------------------------------------------------------------------
//----------            Confirmation Calculation              ------------ INPUT
//------------------------------------------------------------------------

// Getting inputs
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)

// -- Trade entry signals

signalChoice = input(title = "Choose your signal", defval = "Continuation", options = ["Continuation", "Reversal", "Histogram", "MACD Line ZC", "Signal Line ZC"])

continuationSignalLong = signalChoice == "Continuation" ? crossover(macd, signal) and macd > 0 :
   signalChoice == "Reversal" ? crossover(macd, signal) and macd < 0 : 
   signalChoice == "Histogram" ? crossover(hist, 0) : 
   signalChoice == "MACD Line ZC" ? crossover(macd, 0) :
   signalChoice == "Signal Line ZC" ? crossover(signal, 0) :
   false
   
continuationSignalShort = signalChoice == "Continuation" ? crossunder(macd, signal) and macd < 0 :
   signalChoice == "Reversal" ? crossover(signal, macd) and macd > 0 : 
   signalChoice == "Histogram" ? crossunder(hist, 0) : 
   signalChoice == "MACD Line ZC" ? crossunder(macd, 0) :
   signalChoice == "Signal Line ZC" ? crossunder(signal, 0) :
   false

longCondition = continuationSignalLong

shortCondition = continuationSignalShort

//------------------------------------------------------------------------
//----------             ATR MONEY MANAGEMENT                 ------------
//------------------------------------------------------------------------

SLmultiplier = 1.5
TPmultiplier = 1

JPYPair = input(type = input.bool, title = "JPY Pair ?", defval = false)
pipAdjuster = JPYPair ? 1000 : 100000


ATR = atr(14) * pipAdjuster // 1000 for jpy pairs : 100000
SL = ATR * SLmultiplier
TP = ATR * TPmultiplier

//------------------------------------------------------------------------
//----------                  TIME FILTER                     ------------
//------------------------------------------------------------------------

YearOfTesting = input(title = "How many years of testing ?" , type = input.integer, defval = 3)

_time = 2020 - YearOfTesting

timeFilter = (year > _time) 

//------------------------------------------------------------------------
//---------                 ENTRY FUNCTIONS                    ----------- INPUT
//------------------------------------------------------------------------

if (longCondition and timeFilter)  
    strategy.entry("Long", strategy.long)

if (shortCondition and timeFilter) 
    strategy.entry("Short", strategy.short)
    
//------------------------------------------------------------------------
//---------                 EXIT  FUNCTIONS                    -----------
//------------------------------------------------------------------------


strategy.exit("ATR", from_entry = "Long", profit = TP, loss = SL)  

strategy.exit("ATR", from_entry = "Short", profit = TP, loss = SL)