Strategi Pelacakan Tren Crossover MACD EMA

Penulis:ChaoZhang, Tanggal: 2024-02-18 15:17:36
Tag:

img

Gambaran umum

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.

Logika Strategi

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.

Analisis Keuntungan

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.

Analisis Risiko

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.

Arahan Optimasi

Arah optimasi utama untuk strategi ini meliputi:

  1. Meningkatkan indikator lain untuk penilaian untuk membentuk kombinasi indikator ganda untuk lebih menghindari kemungkinan MACD menghasilkan sinyal yang salah.

  2. Panjang garis EMA dapat dioptimalkan multi-parameter untuk menemukan parameter optimal untuk menilai arah tren.

  3. Parameter MACD juga dapat dioptimalkan lebih lanjut untuk menemukan nilai yang paling akurat untuk menentukan waktu pembalikan.

  4. Tambahkan modul manajemen modal. Misalnya, faktor keuntungan dapat digunakan sebagai input dinamis, dan stop slippage juga dapat ditetapkan.

  5. Uji efek pada berbagai jenis kontrak, seperti cryptocurrency, indeks berjangka, dll untuk menemukan varietas perdagangan yang paling cocok.

Kesimpulan

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)

Lebih banyak