この戦略は,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の金クロストレンド追跡戦略は,全体としてシンプルで実用的なもので,信号の信頼性を保証する二重指標判断,合理的なストップ・ロスト・ストップ・ブレーキ方式を設定することで利益をロックする.主要にパラメータ選択,指標组合,資金管理などで最適化する余地がある.さらにテストを最適化すれば,この戦略が効率的なトレンド追跡戦略の一つになると信じている.
/*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)