
Strategi ini menentukan arah trend dengan mengira persimpangan antara indikator MACD dan garis isyarat purata bergeraknya, dan digabungkan dengan indikator EMA untuk menilai kekuatan trend semasa dan kelemahan, untuk mencapai trend tracking. Apabila garis MACD melakukan lebih banyak apabila ia menembusi garis isyarat dari bawah ke atas, ia menembusi kosong dari atas ke bawah, dan garis EMA juga dapat menentukan kekuatan trend dan menyaring penembusan palsu.
Strategi ini adalah berdasarkan arah trend dan masa masuk berdasarkan indikator MACD. Garis MACD menunjukkan bahawa garis isyarat harga telah berbalik, oleh itu, berdasarkan arah penembusan, lebih banyak penembusan dilakukan. Logik penilaian khusus adalah, apabila harga penutupan lebih tinggi daripada purata EMA, dan garis MACD dari bawah menembusi garis isyarat, lebih banyak; apabila harga penutupan lebih rendah daripada purata EMA, dan garis MACD dari arah atas menembusi garis isyarat.
EMA bertindak sebagai penyokong untuk menentukan trend, jika harga lebih tinggi daripada EMA yang menunjukkan arah rata-rata dalam trend ke atas, maka MACD yang lebih rendah dapat membentuk tanda silang emas yang berfungsi; jika harga lebih rendah daripada EMA yang menunjukkan arah rata-rata dalam trend ke bawah, maka MACD yang lebih tinggi dapat membentuk tanda silang mati. Panjang EMA juga menentukan jangka masa yang panjang untuk menentukan trend.
Dengan cara di atas, anda boleh memasuki pasaran tepat pada masanya apabila harga mula berbalik dan membentuk trend baru, untuk mencapai kesan pengesanan trend.
Strategi ini menggabungkan syarat penilaian ganda, kedua-dua mengambil kira arah trend harga, dan menggunakan penunjuk untuk menilai masa masuk tertentu, mengelakkan risiko penembusan palsu, meningkatkan kebolehpercayaan strategi. Berbanding dengan penggunaan penunjuk MACD tunggal, strategi ini dapat menilai permulaan trend baru dengan lebih tepat.
Penggunaan EMA rata-rata juga membolehkan strategi untuk menyaring kesan turun naik jangka pendek dan mengunci trend garis tengah yang panjang. Ini sangat membantu untuk memainkan kesan pembalikan keputusan MACD.
Di samping itu, strategi ini menetapkan kedua-dua syarat saham lebihan dan saham rendah yang boleh digunakan dalam keadaan pasaran lotus yang jatuh dan jatuh, yang juga meningkatkan daya serap strategi.
Risiko utama strategi ini adalah bahawa indikator MACD sendiri mempunyai kebarangkalian yang lebih tinggi untuk menilai Fakeout, dan isyarat mungkin salah dikenali. Pada masa ini, fungsi tambahan EMA rata-rata diperlukan, tetapi dalam keadaan khusus, ia mungkin tidak berfungsi.
Di samping itu, peratusan keuntungan dan kerugian digunakan dalam strategi untuk menetapkan syarat-syarat hentian kerugian, yang mempunyai tahap subjektif, dan jika tidak betul, ia akan menjejaskan kesan strategi.
Akhirnya, strategi ini hanya menetapkan jumlah kedudukan terbuka sebagai 100% hak milik akaun, tanpa mempertimbangkan masalah pengurusan wang, yang juga mempunyai risiko tertentu dalam pasaran sebenar.
Strategi ini mempunyai beberapa arah pengoptimuman:
Menambah penghakiman indikator lain, membentuk beberapa kombinasi indikator, dapat mengelakkan lebih jauh kebarangkalian MACD menghantar isyarat yang salah. Sebagai contoh, KDJ, BOLL dan sebagainya boleh dipertimbangkan.
Panjang garisan purata EMA boleh dioptimumkan dalam pelbagai kombinasi untuk mencari parameter terbaik untuk menentukan arah trend.
Parameter MACD juga boleh dioptimumkan lebih jauh untuk mencari nilai parameter yang paling tepat untuk menentukan masa pembalikan.
Tambah modul pengurusan wang, seperti kadar keuntungan dan kerugian boleh digunakan sebagai input dinamik, juga boleh menetapkan titik berhenti kehilangan dan sebagainya.
Uji kelayakan pelbagai jenis kontrak untuk mencari jenis dagangan yang paling sesuai, seperti mata wang kripto, indeks saham dan sebagainya.
Strategi pengesanan trend silang emas MACD EMA secara keseluruhan agak mudah dan praktikal, memastikan kebolehpercayaan isyarat dengan penilaian dua indikator, menetapkan cara menghentikan kerugian yang munasabah untuk mengunci keuntungan. Ruang pengoptimuman utama adalah dalam pemilihan parameter, gabungan indikator, pengurusan wang.
/*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)