この戦略は,速い移動平均線と遅い移動平均線の違いを計算してMACDインジケーターを生成し,信号線とともに金融市場のトレンドとオーバーバイト/オーバーセールドエリアを判断する.価格が200日MA以上でゴールデンクロスを形成するときにMACDと信号ラインが長くなって,価格が200日MA以下でデッドクロスを形成するときに短くなってしまいます.これは典型的な二重移動平均クロスオーバーブレイクアウト戦略に属します.
基本論理は,市場トレンド方向を決定するために,速いMAと遅いMAの違いから生成されたMACDインジケーターを使用し,オーバーバイト/オーバーセールレベルを判断するための信号線を使用しています.MACDと信号線が黄金十字を形成すると,それはロングシグナルです.デッドクロスを形成すると,それはショートシグナルです.一方,それは200日MAとの価格の関係を使用してシグナルをフィルタリングします.価格が200日MAを超えるときのロングシグナルと,価格が200日MA未満のときのショートシグナルのみを取り,強いトレンドの間にウィップソウを避けるため.
特定の計算方法は次のとおりです.
MACDがシグナルラインの上を横切ったとき,両方が0を下回っているとき,それはゴールデンクロスロングシグナルである.両者が0を下回っているとき,MACDがシグナルライン下を横切ったとき,それはデッドクロスショートシグナルである.一方,価格が200日MAを下回っているときのみ長引く,価格が200日MAを下回っているときのみ短引く.
リスクを減らすには,MA期間を短縮し,他の指標を追加し,ストップロスを追加する.
1.15mから1Dまでの異なる時間枠でテストされ,リスク調整回帰の4Hで最適な結果
2. 速くて遅いMAを最適化してMACDがサイクルを捕捉します. 7-21は15mに有効です.
3.MACDのHull MAは良い結果を示した.
4.トライリングストップロスはリスク管理を改善する
これは全体的に非常にシンプルで実践的な戦略であり,デュアルインジケーターシステムと価格フィルタリングを通じて高い確率の取引信号を生成する. 比較的高い利益率を有し,過剰な最適化を避けるためにクラシックMACDパラメータの組み合わせを使用する. MAパラメータを調整し,パフォーマンスをさらに改善するために他の指標やストップロスのメカニズムを追加することによって最適化する余地がまだ大きい. 全体的に,基本に基づいた典型的な定量戦略である.
/*backtest start: 2024-02-14 00:00:00 end: 2024-02-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/ // © Hurmun //@version=4 strategy("Simple MACD strategy ", overlay=true, margin_long=100, margin_short=100) 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 movinga2 = input(title="movinga 2", type=input.integer, defval=200) movinga200 = sma(close, movinga2) plot(movinga200, "MA", color.orange) longCondition = crossover(macd, signal) and macd < 0 and signal < 0 and close > movinga200 if (longCondition) strategy.entry("My Long Entry Id", strategy.long) shortCondition = crossunder(macd, signal) and macd > 0 and signal > 0 and close < movinga200 if (shortCondition) strategy.entry("My Short Entry Id", strategy.short) shortProfitPerc = input(title="Short Take Profit (%)", minval=0.0, step=0.1, defval=2) / 100 longProfitPerc = input(title="Long Take Profit (%)", minval=0.0, step=0.1, defval=2) / 100 stoploss = input(title="stoploss in %", minval = 0.0, step=1, defval=2) /100 longStoploss = strategy.position_avg_price * (1 - stoploss) longExitPrice = strategy.position_avg_price * (1 + longProfitPerc) shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc) shortStoploss = strategy.position_avg_price * (1 + stoploss) if (strategy.position_size > 0 ) strategy.exit(id="XL TP", limit=longExitPrice, stop=longStoploss) if (strategy.position_size < 0 ) strategy.exit(id="XS TP", limit=shortExitPrice, stop=shortStoploss)