Strategi ini menentukan arah tren dengan menghitung persilangan antara indikator MACD dan rata-rata bergerak garis sinyalnya, dan menilai kekuatan tren saat ini dengan indikator EMA untuk melacak tren.
Inti dari strategi ini adalah untuk menentukan arah tren dan waktu masuk berdasarkan indikator MACD. Perpindahan antara garis MACD dan garis sinyal menunjukkan pembalikan dalam tren harga. Oleh karena itu, posisi panjang dan pendek ditentukan sesuai dengan arah breakout. Secara khusus, ketika harga penutupan berada di atas garis EMA dan garis MACD menerobos garis sinyal dari bawah, pergi panjang; ketika harga penutupan berada di bawah garis EMA dan garis MACD menerobos garis sinyal dari atas, pergi pendek.
Garis EMA berfungsi untuk membantu menilai tren. Jika harga berada di atas garis EMA, itu menunjukkan tren kenaikan. Pada saat ini, terobosan dari MACD di bawah kemungkinan akan membentuk sinyal salib emas. Jika harga berada di bawah garis EMA, itu menunjukkan tren penurunan. Pada saat ini, terobosan dari atas MACD kemungkinan akan membentuk sinyal salib kematian. Panjang EMA juga menentukan tingkat penilaian tren jangka menengah hingga panjang.
Dengan cara ini, kita dapat memasuki pasar secara tepat waktu ketika harga mulai berbalik untuk membentuk tren baru, mencapai efek pelacakan tren.
Strategi ini menggabungkan dua kondisi penilaian, dengan mempertimbangkan arah tren harga dan menggunakan indikator untuk menentukan waktu masuk tertentu, menghindari risiko pecah palsu, dan meningkatkan keandalan strategi.
Aplikasi garis EMA juga memungkinkan strategi untuk menyaring efek fluktuasi jangka pendek dan mengunci tren jangka menengah dan panjang sampai batas tertentu.
Selain itu, strategi menetapkan kondisi baik untuk jangka panjang maupun jangka pendek, yang dapat diterapkan pada pasar banteng dan layang-layang beruang, sehingga meningkatkan kemampuan adaptasi strategi.
Risiko utama dari strategi ini adalah bahwa indikator MACD sendiri memiliki probabilitas tinggi untuk salah menilai sinyal Fakeout. Pada titik ini, fungsi tambahan dari garis EMA diperlukan, tetapi kegagalan masih dapat terjadi dalam kondisi pasar khusus.
Selain itu, strategi mengadopsi faktor keuntungan untuk mengatur kondisi stop loss dan take profit, yang melibatkan beberapa subjektivitas.
Akhirnya, strategi hanya menetapkan ukuran posisi menjadi 100% dari ekuitas akun tanpa mempertimbangkan masalah manajemen dana, yang juga menimbulkan beberapa risiko dalam perdagangan langsung.
Arah optimasi utama untuk strategi ini meliputi:
Meningkatkan indikator lain untuk penilaian untuk membentuk kombinasi indikator ganda untuk lebih menghindari kemungkinan MACD menghasilkan sinyal yang salah.
Panjang garis EMA dapat dioptimalkan multi-parameter untuk menemukan parameter optimal untuk menilai arah tren.
Parameter MACD juga dapat dioptimalkan lebih lanjut untuk menemukan nilai yang paling akurat untuk menentukan waktu pembalikan.
Tambahkan modul manajemen modal. Misalnya, faktor keuntungan dapat digunakan sebagai input dinamis, dan stop slippage juga dapat ditetapkan.
Uji efek pada berbagai jenis kontrak, seperti cryptocurrency, indeks berjangka, dll untuk menemukan varietas perdagangan yang paling cocok.
Secara keseluruhan, strategi MACD EMA Crossover Trend Tracking ini relatif sederhana dan praktis. Ini memastikan keandalan sinyal melalui kondisi indikator ganda dan kunci keuntungan melalui metode stop loss dan take profit yang wajar. Ruang optimasi utama terletak pada pemilihan parameter, kombinasi indikator, manajemen modal, dll. Dengan optimasi dan pengujian lebih lanjut, diyakini bahwa strategi ini dapat menjadi salah satu strategi pelacakan tren yang paling efisien.
/*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)