
Sistem perdagangan integrasi pergerakan linier MACD dengan grafik awan adalah strategi perdagangan kuantitatif yang direka khas untuk persekitaran pasaran berkelajuan yang pantas, yang menggabungkan tiga indikator teknikal yang berbeza dengan kecerdasan: MACD tanpa kelewatan ((Zero Lag MACD), garis asas grafik yang seimbang pada pandangan pertama ((Kijun-sen) dan penunjuk kemudahan bergerak ((Ease of Movement, EOM)). Ketiga indikator ini bekerjasama antara satu sama lain, memberikan pelbagai peringkat bukti ketika mengesahkan isyarat perdagangan, meningkatkan kualiti dan kebolehpercayaan isyarat secara ketara.
Konsep reka bentuk teras strategi ini adalah untuk mencetuskan isyarat perdagangan hanya jika pelbagai syarat dipenuhi pada masa yang sama, untuk menyaring peluang perdagangan berkualiti rendah, mengurangkan isyarat yang salah, dan untuk mencapai pengurusan risiko yang mantap melalui hentian yang dinamik dan nisbah kerugian tetap. Dengan pengoptimuman parameter dan penyaringan syarat, strategi ini dapat menyesuaikan diri dengan keadaan pasaran yang berbeza, memberikan peluang perdagangan berkemungkinan tinggi kepada pedagang.
MACD tanpa lag dan sistem perdagangan yang mengintegrasikan momentum linear dalam grafik awan berfungsi berdasarkan sinergi tiga petunjuk utama:
MACD ((perbaikan versi 1.2)Berbanding dengan MACD tradisional, MACD tanpa kelewatan mengurangkan kelewatan isyarat melalui kaedah pengiraan khas, meningkatkan kepekaan kepada titik perubahan trend. Penunjuk ini digunakan dalam strategi untuk menangkap perubahan momentum yang tepat, proses pengiraan yang merangkumi:
zerolagEMA = (2 * ma1) - ma2danzerolagslowMA = (2 * mas1) - mas2Garis rujukan grafik keseimbangan pertama (Kijun-sen)Sebagai penapis sokongan / rintangan dan trend yang dinamik, garisan Kijun-sen digunakan untuk menentukan arah dominan pasaran. Ia dikira berdasarkan prinsip saluran Dongxian, mengambil purata harga tertinggi dan terendah dalam tempoh tertentu:
baseLine = math.avg(ta.lowest(basePeriods), ta.highest(basePeriods))Indeks kemudahan mudah alih (EOM): Ini adalah pengayun yang berdasarkan jumlah transaksi, untuk mengesahkan pergerakan harga dengan mengukur kesukaran perubahan harga. EOM dikira dengan formula berikut:
eom = ta.sma(div * ta.change(hl2) * (high - low) / volume, eom_length)Syarat kemasukan untuk strategi ini adalah gabungan tiga isyarat:
Syarat kemasukan:
ta.crossover(ZeroLagMACD, signal))ZeroLagMACD < hist)close > baseLine)eom > 0)Syarat kemasukan kosong:
ta.crossunder(ZeroLagMACD, signal))ZeroLagMACD > hist)close < baseLine)eom < 0)Dari segi pengurusan risiko, strategi ini menggunakan stop loss dinamik berdasarkan ATR dengan jarak stop loss 2.5 kali ATR semasa dan menetapkan nisbah pulangan risiko tetap 1: 1.2, memastikan setiap perdagangan mempunyai sasaran keuntungan yang munasabah.
Sistem pengesahan bergandaDengan menggabungkan tiga indikator yang mempunyai ciri yang berbeza (trend, momentum, dan jumlah transaksi), strategi ini dapat menyaring isyarat palsu dengan berkesan, dan hanya masuk apabila peluang perdagangan berkemungkinan tinggi muncul, meningkatkan kadar kejayaan perdagangan dengan ketara.
Mengurangkan ketinggalan zamanPenggunaan MACD tanpa ketinggalan daripada MACD tradisional dapat menangkap titik perubahan pasaran lebih awal, mengurangkan masalah ketinggalan yang sering berlaku dalam indikator tradisional, dan membolehkan peniaga lebih dekat dengan titik masuk yang ideal.
Sangat boleh menyesuaikan diriSemua parameter dalam strategi boleh disesuaikan mengikut keadaan pasaran yang berbeza, jenis perdagangan dan kitaran masa, menjadikannya sangat bersesuaian. Penunjuk teras termasuk parameter kitaran MACD, kitaran Kijun-sen, panjang EOM dan sebagainya dapat dioptimumkan secara khusus.
Mekanisme pengurusan risiko yang baik:
Analisis pasaran menyeluruhStrategi ini mengambil kira pergerakan harga (MACD), struktur harga (Kijun-sen) dan pengesahan jumlah transaksi (EOM) dan menganalisis pasaran dari pelbagai dimensi untuk membentuk sistem keputusan perdagangan yang lebih menyeluruh.
Fungsi visualStrategi menawarkan banyak pilihan visualisasi, termasuk penanda isyarat, paparan garis petunjuk dan panel maklumat, untuk membantu peniaga memahami dan memantau isyarat perdagangan dan keadaan pasaran semasa secara intuitif.
Risiko isyarat palsuWalaupun strategi menggunakan pengesahan pelbagai petunjuk, isyarat palsu mungkin berlaku dalam pasaran yang bergolak tinggi atau menyusun. Pengesahan pelbagai petunjuk mungkin menyebabkan terlalu sedikit isyarat perdagangan dan kehilangan sebahagian peluang perdagangan, terutamanya apabila pasaran sering berubah arah dalam jangka masa yang singkat.
Cabaran pengoptimuman parameterStrategi mempunyai beberapa parameter yang perlu disesuaikan (parameter MACD, kitaran Kijun-sen, panjang EOM, dan lain-lain). Tetapan parameter yang tidak betul boleh menyebabkan data sejarah yang terlalu sesuai dan tidak berfungsi dengan baik dalam keadaan pasaran masa depan.
Titik tergelincir dan risiko kecairanDalam perdagangan kitaran masa rendah, terutamanya untuk pasaran yang bergelombang seperti mata wang kripto, masalah slippage dan kecairan mungkin berlaku, menyebabkan perbezaan antara harga pelaksanaan sebenar dan harga pengiraan strategi.
Stop-loss risiko untuk ditembusiDalam pasaran yang bergelombang dengan cepat, Hentian Kerugian Berasaskan ATR mungkin tidak dapat menangani perubahan harga yang melampau, menyebabkan kerugian sebenar melebihi jangkaan.
Ketergantungan teknologiStrategi ini sangat bergantung kepada petunjuk teknikal, yang mungkin tidak berfungsi dengan baik dalam keadaan pasaran yang bergolak akibat perubahan asas.
Parameter penunjuk menyesuaikan diri: Strategi semasa menggunakan parameter penunjuk tetap, mekanisme penyesuaian penyesuaian penyesuaian yang boleh dipertimbangkan untuk mewujudkan parameter, mengoptimumkan secara automatik MACD, Kijun-sen dan parameter EOM berdasarkan turun naik pasaran atau kitaran perdagangan. Ini akan membolehkan strategi menyesuaikan diri dengan lebih baik dengan tahap pasaran yang berbeza, meningkatkan kestabilan keseluruhan.
Menambah klasifikasi keadaan pasaranDengan menambah modul pengenalan keadaan pasaran, strategi dapat menyesuaikan keadaan perdagangan dan parameter pengurusan risiko berdasarkan apakah pasaran semasa berada dalam trend atau keadaan goyah. Sebagai contoh:
Optimumkan strategi penangguhanStrategi semasa menggunakan nisbah ganjaran risiko tetap (RRR) 1: 1.2) untuk menetapkan penangguhan, mekanisme penangguhan yang lebih fleksibel boleh dipertimbangkan, seperti:
Mengintegrasikan model pembelajaran mesinMenerangkan penggunaan teknologi pembelajaran mesin untuk meningkatkan kebolehan ramalan strategi:
Menambah penapis masaTambahan penapis masa dapat mengelakkan perdagangan pada masa yang tidak cekap:
Sistem perdagangan integrasi MACD tanpa kelewatan dengan pergerakan linear adalah strategi perdagangan kuantitatif yang direka dengan baik, yang membentuk satu sistem pengesahan isyarat perdagangan pelbagai dimensi dengan menggabungkan tiga petunjuk teknikal MACD tanpa kelewatan, Kijun-sen dan EOM. Strategi ini menggunakan mekanisme pengesahan pelbagai yang ketat dalam pengenalan titik masuk, menggabungkan stop loss dinamik dan nisbah pulangan risiko tetap dalam pengurusan risiko, untuk mencapai kawalan keseluruhan proses perdagangan.
Kelebihan utama strategi ini adalah konsep reka bentuknya yang mengurangkan keterbelakangan dan mekanisme kerja sama pelbagai indikator, yang membolehkannya menangkap peluang perdagangan berkemungkinan tinggi dalam pasaran yang berubah dengan cepat. Pada masa yang sama, tetapan parameter yang dapat disesuaikan sepenuhnya membolehkan peniaga menyesuaikan diri secara fleksibel dengan keadaan pasaran yang berbeza dan keutamaan risiko peribadi.
Walaupun terdapat beberapa risiko yang berpotensi dalam strategi ini, seperti cabaran pengoptimuman parameter dan risiko isyarat palsu, strategi ini dapat ditingkatkan lagi dengan penyesuaian arah pengoptimuman yang dicadangkan, seperti penyesuaian parameter penunjuk, klasifikasi keadaan pasaran dan integrasi pembelajaran mesin.
Secara keseluruhannya, ini adalah sistem perdagangan kuantitatif yang canggih dan berstruktur yang sesuai untuk digunakan oleh peniaga yang mempunyai asas analisis teknikal, terutamanya pelabur yang mencari isyarat perdagangan berkualiti tinggi dan bukan perdagangan frekuensi tinggi. Dengan penyesuaian parameter yang munasabah dan pengoptimuman berterusan, strategi ini berpotensi untuk memberikan prestasi perdagangan yang stabil dalam pelbagai persekitaran pasaran.
/*backtest
start: 2024-06-11 00:00:00
end: 2025-06-09 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy(title="Zero Lag MACD + Kijun-sen + EOM Strategy", shorttitle="ZL-KJ-EOM", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// ================================================================================
// INPUT PARAMETERS - ALL INDICATOR SETTINGS
// ================================================================================
// === ZERO LAG MACD SETTINGS ===
group_macd = "Zero Lag MACD Enhanced Settings"
fastLength = input.int(12, title="Fast MM period", minval=1, group=group_macd)
slowLength = input.int(26, title="Slow MM period", minval=1, group=group_macd)
signalLength = input.int(9, title="Signal MM period", minval=1, group=group_macd)
MacdEmaLength = input.int(9, title="MACD EMA period", minval=1, group=group_macd)
useEma = input.bool(true, title="Use EMA (otherwise SMA)", group=group_macd)
useOldAlgo = input.bool(false, title="Use Glaz algo (otherwise 'real' original zero lag)", group=group_macd)
showDots = input.bool(true, title="Show symbols to indicate crossing", group=group_macd)
dotsDistance = input.float(1.5, title="Symbols distance factor", minval=0.1, group=group_macd)
// === KIJUN-SEN SETTINGS ===
group_kijun = "Kijun-Sen Settings"
basePeriods = input.int(26, minval=1, title="Kijun-Sen Period", group=group_kijun)
// === EASE OF MOVEMENT SETTINGS ===
group_eom = "Ease of Movement Settings"
eom_length = input.int(14, minval=1, title="EOM Length", group=group_eom)
div = input.int(10000, title="EOM Divisor", minval=1, group=group_eom)
// === RISK MANAGEMENT SETTINGS ===
group_risk = "Risk Management Settings"
atr_period = input.int(14, title="ATR Period", minval=1, group=group_risk)
atr_multiplier = input.float(2.5, title="ATR Multiplier for Stop Loss", minval=0.1, step=0.1, group=group_risk)
risk_reward_ratio = input.float(1.2, title="Risk-to-Reward Ratio", minval=0.1, step=0.1, group=group_risk)
// === DISPLAY SETTINGS ===
group_display = "Display Settings"
show_macd_plot = input.bool(false, title="Show MACD Plot (Separate Pane)", group=group_display)
show_eom_plot = input.bool(false, title="Show EOM Plot (Separate Pane)", group=group_display)
show_kijun_plot = input.bool(true, title="Show Kijun-Sen Line", group=group_display)
show_signals = input.bool(true, title="Show Entry Signals", group=group_display)
show_info_table = input.bool(true, title="Show Info Table", group=group_display)
// ================================================================================
// ZERO LAG MACD ENHANCED VERSION 1.2 (WITH USER INPUTS)
// ================================================================================
source = close
// Fast line
ma1 = useEma ? ta.ema(source, fastLength) : ta.sma(source, fastLength)
ma2 = useEma ? ta.ema(ma1, fastLength) : ta.sma(ma1, fastLength)
zerolagEMA = ((2 * ma1) - ma2)
// Slow line
mas1 = useEma ? ta.ema(source, slowLength) : ta.sma(source, slowLength)
mas2 = useEma ? ta.ema(mas1, slowLength) : ta.sma(mas1, slowLength)
zerolagslowMA = ((2 * mas1) - mas2)
// MACD line
ZeroLagMACD = zerolagEMA - zerolagslowMA
// Signal line
emasig1 = ta.ema(ZeroLagMACD, signalLength)
emasig2 = ta.ema(emasig1, signalLength)
signal = useOldAlgo ? ta.sma(ZeroLagMACD, signalLength) : (2 * emasig1) - emasig2
// MACD Histogram
hist = ZeroLagMACD - signal
// MACD EMA line
macd_ema = ta.ema(ZeroLagMACD, MacdEmaLength)
// MACD plot components (for separate pane if enabled)
upHist = (hist > 0) ? hist : 0
downHist = (hist <= 0) ? hist : 0
// ================================================================================
// KIJUN-SEN INDICATOR (WITH USER INPUTS)
// ================================================================================
donchian(len) => math.avg(ta.lowest(len), ta.highest(len))
baseLine = donchian(basePeriods)
// ================================================================================
// EASE OF MOVEMENT INDICATOR (WITH USER INPUTS)
// ================================================================================
var cumVol = 0.
cumVol += nz(volume)
if barstate.islast and cumVol == 0
runtime.error("No volume is provided by the data vendor.")
eom = ta.sma(div * ta.change(hl2) * (high - low) / volume, eom_length)
// ================================================================================
// ATR CALCULATION FOR STOP LOSS
// ================================================================================
atr = ta.atr(atr_period)
// ================================================================================
// ENTRY CONDITIONS
// ================================================================================
// Long Entry Conditions
macd_cross_up = ta.crossover(ZeroLagMACD, signal)
macd_below_hist = ZeroLagMACD < hist // MACD line below histogram
price_above_kijun = close > baseLine // Price above Kijun-sen
eom_above_zero = eom > 0 // EOM above zero
long_condition = macd_cross_up and macd_below_hist and price_above_kijun and eom_above_zero
// Short Entry Conditions
macd_cross_down = ta.crossunder(ZeroLagMACD, signal)
macd_above_hist = ZeroLagMACD > hist // MACD line above histogram
price_below_kijun = close < baseLine // Price below Kijun-sen
eom_below_zero = eom < 0 // EOM below zero
short_condition = macd_cross_down and macd_above_hist and price_below_kijun and eom_below_zero
// ================================================================================
// STRATEGY EXECUTION
// ================================================================================
// Entry Logic - Enter at next candle open as specified
if long_condition
strategy.entry("Long", strategy.long, comment="Long Entry")
if short_condition
strategy.entry("Short", strategy.short, comment="Short Entry")
// Exit Logic (Stop Loss and Take Profit)
if strategy.position_size > 0 // Long position
stop_loss = strategy.position_avg_price - (atr * atr_multiplier)
distance_to_sl = strategy.position_avg_price - stop_loss
take_profit = strategy.position_avg_price + (distance_to_sl * risk_reward_ratio)
strategy.exit("Long Exit", "Long", stop=stop_loss, limit=take_profit, comment="Long Exit")
if strategy.position_size < 0 // Short position
stop_loss = strategy.position_avg_price + (atr * atr_multiplier)
distance_to_sl = stop_loss - strategy.position_avg_price
take_profit = strategy.position_avg_price - (distance_to_sl * risk_reward_ratio)
strategy.exit("Short Exit", "Short", stop=stop_loss, limit=take_profit, comment="Short Exit")
// ================================================================================
// PLOTTING INDICATORS
// ================================================================================
// Plot Kijun-sen
plot(show_kijun_plot ? baseLine : na, color=color.new(color.maroon, 0), title="Kijun-Sen", linewidth=2)
// Plot entry signals
plotshape(show_signals and long_condition, title="Long Signal", location=location.belowbar, color=color.new(color.green, 0), style=shape.triangleup, size=size.small, text="LONG")
plotshape(show_signals and short_condition, title="Short Signal", location=location.abovebar, color=color.new(color.red, 0), style=shape.triangledown, size=size.small, text="SHORT")
// Plot stop loss and take profit levels for current position
plot(strategy.position_size > 0 ? strategy.position_avg_price - (atr * atr_multiplier) : na, color=color.new(color.red, 0), style=plot.style_linebr, linewidth=1, title="Long Stop Loss")
plot(strategy.position_size > 0 ? strategy.position_avg_price + ((strategy.position_avg_price - (strategy.position_avg_price - (atr * atr_multiplier))) * risk_reward_ratio) : na, color=color.new(color.green, 0), style=plot.style_linebr, linewidth=1, title="Long Take Profit")
plot(strategy.position_size < 0 ? strategy.position_avg_price + (atr * atr_multiplier) : na, color=color.new(color.red, 0), style=plot.style_linebr, linewidth=1, title="Short Stop Loss")
plot(strategy.position_size < 0 ? strategy.position_avg_price - (((strategy.position_avg_price + (atr * atr_multiplier)) - strategy.position_avg_price) * risk_reward_ratio) : na, color=color.new(color.green, 0), style=plot.style_linebr, linewidth=1, title="Short Take Profit")
// ================================================================================
// SEPARATE PANE PLOTS (OPTIONAL)
// ================================================================================
// MACD Plot (separate pane)
plot(show_macd_plot ? upHist : na, color=color.new(color.green, 40), style=plot.style_columns, title='MACD Positive Histogram')
plot(show_macd_plot ? downHist : na, color=color.new(color.purple, 40), style=plot.style_columns, title='MACD Negative Histogram')
plot(show_macd_plot ? ZeroLagMACD : na, color=color.new(color.black, 0), linewidth=2, title='MACD Line')
plot(show_macd_plot ? signal : na, color=color.new(color.gray, 0), linewidth=2, title='Signal Line')
plot(show_macd_plot ? macd_ema : na, color=color.new(color.red, 0), linewidth=2, title='EMA on MACD Line')
// MACD zero line
plot(show_macd_plot ? 0 : na, "MACD Zero Line", color=color.new(color.gray, 50))
// MACD crossover dots - calculate cross condition globally for consistency
macd_signal_cross = ta.cross(ZeroLagMACD, signal)
circleYPosition = signal * dotsDistance
plot(show_macd_plot and showDots and macd_signal_cross ? circleYPosition : na, style=plot.style_circles, linewidth=4, color=hist > 0 ? color.new(color.green, 0) : color.new(color.purple, 0), title='MACD Cross Dots')
// EOM Plot (separate pane)
plot(show_eom_plot ? eom : na, "EOM", color=color.new(#43A047, 0), linewidth=2)
plot(show_eom_plot ? 0 : na, "EOM Zero Line", color=color.new(color.gray, 50))
// ================================================================================
// INFO TABLE
// ================================================================================
var table info_table = table.new(position.top_right, 2, 8, bgcolor=color.new(color.white, 0), border_width=1)
if show_info_table and barstate.islast
table.cell(info_table, 0, 0, "Position", text_color=color.black, bgcolor=color.new(color.gray, 70))
table.cell(info_table, 1, 0, strategy.position_size > 0 ? "LONG" : strategy.position_size < 0 ? "SHORT" : "FLAT",
text_color=strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : color.black)
table.cell(info_table, 0, 1, "Entry Price", text_color=color.black, bgcolor=color.new(color.gray, 70))
table.cell(info_table, 1, 1, strategy.position_size != 0 ? str.tostring(strategy.position_avg_price, "#.####") : "N/A", text_color=color.black)
table.cell(info_table, 0, 2, "Current ATR", text_color=color.black, bgcolor=color.new(color.gray, 70))
table.cell(info_table, 1, 2, str.tostring(atr, "#.####"), text_color=color.black)
table.cell(info_table, 0, 3, "MACD Value", text_color=color.black, bgcolor=color.new(color.gray, 70))
table.cell(info_table, 1, 3, str.tostring(ZeroLagMACD, "#.####"), text_color=color.black)
table.cell(info_table, 0, 4, "Signal Value", text_color=color.black, bgcolor=color.new(color.gray, 70))
table.cell(info_table, 1, 4, str.tostring(signal, "#.####"), text_color=color.black)
table.cell(info_table, 0, 5, "EOM Value", text_color=color.black, bgcolor=color.new(color.gray, 70))
table.cell(info_table, 1, 5, str.tostring(eom, "#.##"), text_color=eom > 0 ? color.green : color.red)
table.cell(info_table, 0, 6, "Price vs Kijun", text_color=color.black, bgcolor=color.new(color.gray, 70))
table.cell(info_table, 1, 6, close > baseLine ? "ABOVE" : "BELOW", text_color=close > baseLine ? color.green : color.red)
table.cell(info_table, 0, 7, "Last Signal", text_color=color.black, bgcolor=color.new(color.gray, 70))
table.cell(info_table, 1, 7, long_condition ? "LONG" : short_condition ? "SHORT" : "NONE",
text_color=long_condition ? color.green : short_condition ? color.red : color.gray)
// ================================================================================
// ALERTS
// ================================================================================
// Alert conditions
alertcondition(long_condition, title="Long Entry Signal",
message="ZL-MACD+KJ+EOM Strategy: Long Entry Signal Triggered\nMACD: {{plot_0}}\nSignal: {{plot_1}}\nEOM: {{plot_2}}\nPrice: {{close}}\nKijun-Sen: {{plot_3}}")
alertcondition(short_condition, title="Short Entry Signal",
message="ZL-MACD+KJ+EOM Strategy: Short Entry Signal Triggered\nMACD: {{plot_0}}\nSignal: {{plot_1}}\nEOM: {{plot_2}}\nPrice: {{close}}\nKijun-Sen: {{plot_3}}")
// Position exit alerts
alertcondition(strategy.position_size[1] != 0 and strategy.position_size == 0, title="Position Closed",
message="ZL-MACD+KJ+EOM Strategy: Position Closed")