MACDトレンドフォロー戦略は,MACD指標に基づいた定量的な取引戦略である.この戦略は,市場動向を決定し価格動向を追跡するためにMACD黄金十字と死亡十字のシグナルを識別する.
MACD トレンドフォロー戦略の基本論理は:
このトレンドフォローメカニズムによって 戦略は市場のトレンドを タイミングで把握し 利益を得ることができます
MACD トレンドフォロー戦略には以下の利点があります.
MACD トレンドフォロー戦略には以下のリスクもあります.
上記のリスクに対処するために,以下の最適化措置が可:
MACD トレンドフォロー戦略は,次の側面で最適化することができます:
誤信号率を減らすためにMACD指標パラメータを最適化する.MACDの異なるサイクルパラメータをテストすることができます.
信号をフィルタリングするために取引量などの他の指標を追加します.最小取引量の条件を設定できます.
動的ストップ・ロスト・メカニズムを設定します ストップ・ロスト・ポイントは 変動に応じて動的に調整できます
ポジションを開くための信号決定ロジックを最適化し,より厳格なトリガー条件を設定できます.
信号をフィルタリングするために機械学習モデルを組み込む. 信号の信頼性を判断するためにモデルを訓練することができます.
一般的に,MACDトレンドフォロー戦略は比較的成熟した定量戦略である.市場トレンド方向性を決定するためにMACD指標を利用し,価格動向を効果的に追跡できるストップ・ロスのメカニズムでリスクを制御する.しかし,MACD指標自体は,誤った信号を生成しやすいいくつかの欠点もあります.したがって,この戦略のさらなる最適化のための余地があります.主に指標パラメータ,ストップ・ロスのメカニズム,信号フィルタリングなどの側面です.
/*backtest start: 2023-11-10 00:00:00 end: 2023-12-10 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("MACD Cross Strategy", overlay=true) // Get MACD values [macdLine, signalLine, _] = ta.macd(close, 12, 26, 9) var float entryLongPrice = na var float entryShortPrice = na var float highestLongProfit = 0 var float highestShortProfit = 0 var float highestMACD = 0 var float lowestMACD = 0 var bool haveOpenedLong = false var bool haveOpenedShort = false var float stoploss = 0.04 // To be adjust for different investment var float minProfit = 0.05 // To be adjust for different investment if macdLine > 0 lowestMACD := 0 highestMACD := math.max(highestMACD, macdLine) haveOpenedShort := false else highestMACD := 0 lowestMACD := math.min(lowestMACD, macdLine) haveOpenedLong := false // Enter long position when MACD line crosses above the signal line if ta.crossover(macdLine, signalLine) and macdLine < highestMACD and macdLine > 0 and haveOpenedLong == false strategy.entry("Long", strategy.long) strategy.exit("Exit Long", from_entry = "Long", stop=close*(1 - stoploss)) entryLongPrice := close haveOpenedLong := true if ta.crossunder(macdLine, signalLine) and macdLine > lowestMACD and macdLine < 0 and haveOpenedShort == false strategy.entry("Short", strategy.short) strategy.exit("Exit Short", from_entry = "Short", stop=close*(1 + stoploss)) entryShortPrice := close haveOpenedShort := true // log.info("entryLongPrice:{0}", entryLongPrice) if strategy.position_size > 0 profit = close - entryLongPrice log.info("profit:{0}", profit) if profit > 0 highestLongProfit := math.max(highestLongProfit, profit) if profit / entryLongPrice > minProfit and highestLongProfit * 0.8 > profit strategy.close("Long") highestLongProfit := 0 if strategy.position_size < 0 profit = entryShortPrice - close if profit > 0 highestShortProfit := math.max(highestShortProfit, profit) log.info("highestShortProfit={0}, profit={1}", highestShortProfit, profit) if profit / entryShortPrice > minProfit and highestShortProfit * 0.8 > profit strategy.close("Short") highestShortProfit := 0