この戦略は,MACD指標とその信号線移動平均間のクロスオーバーを計算することによってトレンド方向を決定し,トレンドを追跡するためにEMA指標で現在のトレンドの強さを判断する.MACD線が信号線を上向きに突破すると長くなって,下向きに突破すると短くなってしまいます.EMA線はまた,誤ったブレイクをフィルタリングするためにトレンドの強さを判断することができます.
この戦略の核心は,MACD指標に基づいてトレンド方向とエントリータイミングを決定することである.MACDラインとシグナルラインのクロスオーバーは価格傾向の逆転を示唆する.したがって,ロングとショートポジションはブレイクアウト方向に応じて決定される.特に,閉値がEMAラインの上にあり,MACDラインが下からシグナルラインを突破すると,ロング;閉値がEMAラインの下にあり,MACDラインが上からシグナルラインを突破すると,ショート.
EMA線は,トレンドを判断するのに役立つ.価格がEMA線以上であれば,上昇傾向を示す.この時点で,MACDの下からの突破は黄金のクロス信号を形成する可能性が高い.価格がEMA線以下であれば,下向きの傾向を示す.この時点で,MACD上からの突破は死亡クロス信号を形成する可能性が高い.EMA長さは,トレンド判断の中長期的程度も決定する.
この方法により 価格が逆転し 新しいトレンドを形成し始めるときに 市場に間に合うようにでき トレンド追跡効果が得られます
この戦略は,価格のトレンド方向を考慮し,特定のエントリータイミングを決定するために指標を使用し,偽のブレイクのリスクを回避し,戦略の信頼性を高め,二重判断条件を組み合わせます.MACD指標のみを使用すると比較して,この戦略は新しいトレンドの開始をより正確に決定することができます.
EMA線の適用は,短期変動の影響をフィルタリングし,中期および長期的傾向を一定程度に固定することを戦略に可能にします.これは,逆転を判断するMACD指標の有効性を開発するのに非常に役立ちます.
さらに,この戦略は,長期と短期の両方の条件を定めており,この条件は,牛や熊のハエ市場に適用され,戦略の適応性を高めます.
この戦略の主なリスクは,MACDインジケーター自体がFakeout信号を誤判する可能性が高いことである.この時点で,EMAラインの補助機能が必要であるが,特殊な市場条件では失敗は起こりうる.
さらに,戦略は,ストップ・ロストと利益取得条件を設定するために利益因子を採用し,これはある程度の主観性を伴う.不適切な設定も戦略の業績に影響を与える可能性があります.
最後に,この戦略では,直接取引でもいくつかのリスクをもたらすファンド管理の問題を考慮せずに,ポジションサイズをアカウントの資本の100%に設定するだけです.
この戦略の主要な最適化方向は以下の通りである.
判断のための他の指標を増やして複数の指標組み合わせを形成し,MACDが誤った信号を生む可能性をさらに回避する.例えば,KDJとBOLLは検討することができます.
EMA線長は,トレンド方向を判断するための最適なパラメータを見つけるために多パラメータ最適化することができます.
MACDパラメータは,逆転タイミングを決定するための最も正確な値を見つけるためにさらに最適化することができます.
資本管理モジュールを追加します.例えば,利益因子は動的入力として使用され,スリップストップも設定できます.
暗号通貨,インデックス先物など,さまざまなタイプの契約に対する影響をテストし,最も適した取引品種を見つけます.
MACD EMAのクロスオーバートレンドトラッキング戦略は,比較的シンプルで実用的です.この戦略は,デュアル指標条件を通じて信号の信頼性と,合理的なストップロストとテイクプロフィート方法を通じて利益のロックを保証します.主な最適化空間は,パラメータ選択,指標組み合わせ,資本管理などにあります.さらなる最適化とテストにより,この戦略は最も効率的なトレンドトラッキング戦略の1つになることができると考えられています.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="MACD EMA Strategy", shorttitle="MACD EMA STRAT", overlay = true, pyramiding = 0, max_bars_back=3000, calc_on_order_fills = false, commission_type = strategy.commission.percent, commission_value = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=5000, currency=currency.USD) // Time Range FromMonth=input(defval=1,title="FromMonth",minval=1,maxval=12) FromDay=input(defval=1,title="FromDay",minval=1,maxval=31) FromYear=input(defval=2020,title="FromYear",minval=2016) ToMonth=input(defval=1,title="ToMonth",minval=1,maxval=12) ToDay=input(defval=1,title="ToDay",minval=1,maxval=31) ToYear=input(defval=9999,title="ToYear",minval=2017) start=timestamp(FromYear,FromMonth,FromDay,00,00) finish=timestamp(ToYear,ToMonth,ToDay,23,59) window()=>true // STEP 2: // See if this bar's time happened on/after start date afterStartDate = true //EMA emasrc = close res = input(title="EMA Timeframe", type=input.resolution, defval="15") len1 = input(title="EMA Length", type=input.integer, defval=206) col1 = color.yellow // Calculate EMA ema1 = ema(emasrc, len1) emaSmooth = security(syminfo.tickerid, res, ema1, barmerge.gaps_on, barmerge.lookahead_off) // Draw EMA plot(emaSmooth, title="EMA", linewidth=1, color=col1) //MACD fast_length = input(title="Fast Length", type=input.integer, defval=15) slow_length = input(title="Slow Length", type=input.integer, defval=24) 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=true) sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=true) zeroline = 0 // 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) //plot(zeroline, title="Zero Line", color=color.black, transp=0) ///////////////////////////LONG//////////////////////////////////////////////////////////////////// enablelong = input(true, title="Enable long?") //Long Signal upcondition = close > emaSmooth and close[1] > emaSmooth[1] macdunderhis = macd < zeroline macdcrossup = crossover(macd, signal) longcondition = upcondition and macdunderhis and macdcrossup //strategy buy long if (longcondition) and (afterStartDate) and strategy.opentrades < 1 and (enablelong == true) strategy.entry("long", strategy.long) //////////////////////////////////////SHORT////////////////////////////////////////////////////////////////////////////////// enableshort = input(true, title="Enable short?") //Short Signal downcondition = close < emaSmooth and close[1] < emaSmooth[1] macdoverhis = macd > zeroline macdcrosunder = crossunder(macd, signal) shortcondition = downcondition and macdoverhis and macdcrosunder //strategy buy short if (shortcondition) and (afterStartDate) and strategy.opentrades < 1 and (enableshort == true) strategy.entry("short", strategy.short) //////////////////////////////////////EXIT CONDITION////////////////////////////////////////////////////////////////////////////////// bought = strategy.position_size[1] < strategy.position_size sold = strategy.position_size[1] > strategy.position_size barsbought = barssince(bought) barssold = barssince(sold) //////LOWEST LOW////// //Lowest Low LONG profitfactorlong = input(title="ProfitfactorLong", type=input.float, step=0.1, defval=1.9) loLen = input(title="Lowest Low Lookback", type=input.integer, defval=46, minval=2) stop_level_long = lowest(low, loLen)[1] if strategy.position_size>0 profit_level_long = strategy.position_avg_price + ((strategy.position_avg_price - stop_level_long[barsbought])*profitfactorlong) strategy.exit(id="TP/ SL", stop=stop_level_long[barsbought], limit=profit_level_long) //Lowest Low SHORT profitfactorshort = input(title="ProfitfactorShort", type=input.float, step=0.1, defval=2.1) highLen = input(title="highest high lookback", type=input.integer, defval=25, minval=2) stop_level_short = highest(high, highLen)[1] if strategy.position_size<0 profit_level_short = strategy.position_avg_price - ((stop_level_short[barssold] - strategy.position_avg_price)*profitfactorshort) strategy.exit(id="TP/ SL", stop=stop_level_short[barssold], limit=profit_level_short) //PLOTT TP SL plot(stop_level_long, title="SL Long", linewidth=1, color=color.red) plot(stop_level_short, title="SL Short", linewidth=1, color=color.red)