Hệ thống giao dịch tích hợp động lượng trung bình động MACD và biểu đồ đám mây không có độ trễ

MACD EMA SMA ATR ICHIMOKU EOM RRR 动量指标 零滞后指标 均线交叉
Ngày tạo: 2025-06-11 09:58:31 sửa đổi lần cuối: 2025-06-11 09:58:31
sao chép: 3 Số nhấp chuột: 383
2
tập trung vào
319
Người theo dõi

Hệ thống giao dịch tích hợp động lượng trung bình động MACD và biểu đồ đám mây không có độ trễ Hệ thống giao dịch tích hợp động lượng trung bình động MACD và biểu đồ đám mây không có độ trễ

Tổng quan

Hệ thống giao dịch tích hợp động lượng dòng đồng nhất MACD với biểu đồ đám mây là một chiến lược giao dịch định lượng được thiết kế đặc biệt cho môi trường thị trường nhịp độ nhanh, chiến lược này kết hợp một cách khéo léo ba chỉ số kỹ thuật có các đặc điểm khác nhau: MACD không chậm trễ ((Zero Lag MACD), đường chuẩn cân bằng đồ thị ((Kijun-sen) và chỉ số thuận tiện di động ((Ease of Movement, EOM)). Ba chỉ số này làm việc với nhau, cung cấp nhiều cấp độ chứng minh khi xác nhận tín hiệu giao dịch, cải thiện đáng kể chất lượng và độ tin cậy của tín hiệu. Chiến lược này đặc biệt phù hợp cho các thị trường biến động lớn như tiền điện tử và hoạt động tốt trong chu kỳ thời gian thấp (ví dụ 5 phút).

Ý tưởng thiết kế cốt lõi của chiến lược này là kích hoạt tín hiệu giao dịch chỉ khi nhiều điều kiện được đáp ứng cùng một lúc, do đó lọc các cơ hội giao dịch chất lượng thấp, giảm tín hiệu sai và quản lý rủi ro vững chắc thông qua dừng động và tỷ lệ lỗ hổng cố định. Bằng cách tối ưu hóa tham số và lọc điều kiện, chiến lược này có thể thích ứng với các môi trường thị trường khác nhau, cung cấp cho các nhà giao dịch cơ hội giao dịch có tỷ lệ xác suất cao.

Nguyên tắc chiến lược

Hệ thống giao dịch tích hợp động lực tuyến tính của MACD không tụt hậu và đồ thị đám mây hoạt động dựa trên sự phối hợp của ba chỉ số cốt lõi:

  1. MACD ((cải tiến phiên bản 1.2): So với MACD truyền thống, MACD trễ không làm giảm độ trễ tín hiệu thông qua các phương pháp tính toán đặc biệt, tăng độ nhạy đối với các điểm chuyển hướng. Chỉ số này được sử dụng trong chiến lược để nắm bắt sự thay đổi động lực chính xác, quá trình tính toán bao gồm:

    • Tính toán độ trễ không của đường nhanh và đường chậm:zerolagEMA = (2 * ma1) - ma2zerolagslowMA = (2 * mas1) - mas2
    • Đường MACD: Sự khác biệt giữa đường nhanh và đường chậm
    • Đường tín hiệu: Đường trung bình di chuyển mịn của MACD
    • Biểu đồ cột: Sự khác biệt giữa đường MACD và đường tín hiệu
  2. Đường chuẩn cân bằng đồ thị (Kijun-sen)Là một bộ lọc hỗ trợ / kháng cự động và xu hướng, đường Kijun-sen được sử dụng để xác định hướng thống trị của thị trường. Nó được tính toán dựa trên nguyên tắc kênh Dongxian, lấy trung bình giá cao nhất và giá thấp nhất trong một chu kỳ nhất định:

    • baseLine = math.avg(ta.lowest(basePeriods), ta.highest(basePeriods))
  3. Chỉ số tiện lợi di động (EOM): Đây là một dao động dựa trên khối lượng giao dịch, xác định xu hướng giá bằng cách đo độ khó của biến động giá. EOM được tính bằng công thức sau:

    • eom = ta.sma(div * ta.change(hl2) * (high - low) / volume, eom_length)

Điều kiện nhập cảnh của chiến lược này kết hợp các tín hiệu của ba chỉ số:

Điều kiện nhập học đa đầu

  • Đường MACD đi qua đường tín hiệuta.crossover(ZeroLagMACD, signal)
  • Đường MACD dưới biểu đồ cộtZeroLagMACD < hist
  • Giá cao hơn Kijun-senclose > baseLine
  • EOM lớn hơn 0eom > 0

Điều kiện nhập cảnh không đầu

  • MACD dưới đường đi qua đường tín hiệuta.crossunder(ZeroLagMACD, signal)
  • Đường MACD cao hơn so với biểu đồ cộtZeroLagMACD > hist
  • Giá thấp hơn Kijun-senclose < baseLine
  • EOM nhỏ hơn 0eom < 0

Trong quản lý rủi ro, chiến lược sử dụng dừng động dựa trên ATR, với khoảng cách dừng gấp 2,5 lần ATR hiện tại, và thiết lập tỷ lệ rủi ro / lợi nhuận cố định là 1: 1.2, đảm bảo mỗi giao dịch có mục tiêu lợi nhuận hợp lý.

Lợi thế chiến lược

  1. Hệ thống xác nhận đa dạngBằng cách kết hợp ba chỉ số có các đặc điểm khác nhau (xu hướng, động lực và khối lượng giao dịch), chiến lược có thể lọc hiệu quả các tín hiệu giả, chỉ tham gia khi có cơ hội giao dịch có xác suất cao, tăng đáng kể tỷ lệ thành công của giao dịch.

  2. Giảm thiểu sự chậm trễSử dụng MACD không bị tụt hậu thay vì MACD truyền thống, có thể bắt được các điểm biến đổi thị trường sớm hơn, giảm các vấn đề về sự tụt hậu thường gặp trong các chỉ số truyền thống và cho phép các nhà giao dịch tiến gần hơn đến điểm nhập cảnh lý tưởng.

  3. Khả năng thích nghi caoTất cả các tham số trong chiến lược có thể được điều chỉnh tùy chỉnh cho các môi trường thị trường khác nhau, các loại giao dịch và chu kỳ thời gian, làm cho nó có khả năng thích ứng mạnh mẽ. Các chỉ số cốt lõi bao gồm tham số chu kỳ MACD, chu kỳ Kijun-sen, chiều dài EOM, v.v. có thể được tối ưu hóa theo mục tiêu.

  4. Cơ chế quản lý rủi ro

    • Thiết kế dừng động (tự điều chỉnh biến động dựa trên ATR) đảm bảo vị trí dừng có thể tự động điều chỉnh theo biến động của thị trường
    • Tỷ lệ lợi nhuận / rủi ro cố định (RRR): 1: 1.2) cung cấp kỳ vọng lợi nhuận nhất quán
    • Chiến lược chỉ mở lệnh khi nhiều điều kiện được đáp ứng cùng một lúc, giảm đáng kể nguy cơ tín hiệu sai
  5. Phân tích thị trường toàn diệnChiến lược xem xét động lực giá (MACD), cấu trúc giá (Kijun-sen) và xác nhận khối lượng giao dịch (EOM), phân tích thị trường từ nhiều chiều, tạo thành một hệ thống quyết định giao dịch toàn diện hơn.

  6. Chức năng hiển thịChiến lược cung cấp nhiều tùy chọn trực quan, bao gồm dấu hiệu tín hiệu, hiển thị đường chỉ số và bảng thông tin, giúp thương nhân trực quan hiểu và giám sát tín hiệu giao dịch và tình trạng thị trường hiện tại.

Rủi ro chiến lược

  1. Rủi ro của tín hiệu saiMặc dù chiến lược sử dụng nhiều tín hiệu xác nhận, tín hiệu giả vẫn có thể xuất hiện trong thị trường biến động cao hoặc cân bằng. Đặc biệt là khi thị trường thay đổi hướng thường xuyên trong một thời gian ngắn, xác nhận nhiều tín hiệu có thể dẫn đến tín hiệu giao dịch quá ít và bỏ lỡ một số cơ hội giao dịch.

    • Giải phápCác tham số chỉ số có thể được điều chỉnh theo tình trạng thị trường, có thể cần phải nới lỏng một số điều kiện hoặc điều chỉnh độ nhạy cảm của MACD và EOM trong thời gian biến động cao.
  2. Thách thức tối ưu hóa tham sốChiến lược có nhiều tham số cần điều chỉnh (tham số MACD, chu kỳ Kijun-sen, chiều dài EOM, v.v.) và thiết lập tham số không đúng có thể dẫn đến quá phù hợp với dữ liệu lịch sử và không hoạt động tốt trong môi trường thị trường tương lai.

    • Giải pháp: Sử dụng thử nghiệm hướng tới và thử nghiệm ổn định để đảm bảo các tham số có thể duy trì hiệu quả trong các môi trường thị trường khác nhau; tránh tối ưu hóa quá mức, tìm kiếm các tham số có thể hoạt động ổn định trong nhiều điều kiện thị trường.
  3. Điểm trượt và rủi ro tính thanh khoảnTrong giao dịch theo chu kỳ thời gian thấp, đặc biệt đối với các thị trường biến động như tiền điện tử, có thể gặp phải các vấn đề trượt và thanh khoản, dẫn đến sự khác biệt giữa giá thực hiện thực tế và giá tính toán chiến lược.

    • Giải phápLập các mô phỏng điểm trượt trong phản hồi; xem xét thêm các điều kiện lọc thanh khoản trong chiến lược; ưu tiên giao dịch trên thị trường có tính thanh khoản cao hơn.
  4. Stop loss bị phá vỡ bởi rủi roTrong một thị trường biến động nhanh chóng, các lệnh dừng dựa trên ATR có thể không thể đối phó với biến động giá cực đoan, dẫn đến tổn thất thực tế cao hơn dự kiến.

    • Giải phápXem xét thêm các cơ chế bảo vệ dừng lỗ bổ sung, chẳng hạn như điều chỉnh ATR tự động trong điều kiện biến động cực đoan hoặc đặt giới hạn tổn thất tối đa tuyệt đối.
  5. Sự phụ thuộc vào công nghệChiến lược này phụ thuộc rất nhiều vào các chỉ số kỹ thuật và có thể không hoạt động tốt trong trường hợp thị trường biến động mạnh do sự thay đổi cơ bản.

    • Giải pháp: Giảm quy mô giao dịch hoặc tạm dừng giao dịch trước khi dữ liệu hoặc sự kiện kinh tế quan trọng được công bố; xem xét tích hợp bộ lọc cơ bản.

Hướng tối ưu hóa chiến lược

  1. Các tham số chỉ số tự điều chỉnh: Chiến lược hiện tại sử dụng các tham số chỉ số cố định, có thể xem xét thực hiện cơ chế điều chỉnh tự động cho các tham số, tự động tối ưu hóa các tham số MACD, Kijun-sen và EOM theo biến động thị trường hoặc chu kỳ giao dịch. Điều này sẽ cho phép chiến lược thích ứng tốt hơn với các giai đoạn thị trường khác nhau, tăng sự ổn định tổng thể.

    • Các tham số có thể được điều chỉnh động dựa trên biến động hoặc cường độ xu hướng trong N chu kỳ gần đây nhất
    • Nghiên cứu sự kết hợp các tham số tối ưu trong các tình trạng thị trường khác nhau (trend, biến động) và xây dựng cơ chế chuyển đổi
  2. Thêm phân loại tình trạng thị trườngBằng cách thêm mô-đun nhận dạng trạng thái thị trường, chiến lược có thể điều chỉnh điều kiện giao dịch và các tham số quản lý rủi ro tùy thuộc vào thị trường hiện tại đang có xu hướng hay biến động. Ví dụ:

    • Tăng điều kiện lọc hoặc giảm tần suất giao dịch trong thị trường biến động
    • Một số điều kiện nhập cảnh có thể được nới lỏng trong xu hướng rõ ràng, đồng thời kéo dài thời gian giữ vị trí
    • Xem xét thêm các chỉ số cường độ xu hướng như ADX để giúp xác định tình trạng thị trường
  3. Tối ưu hóa chiến lược chống ngứa: Chiến lược hiện tại sử dụng tỷ lệ rủi ro / lợi nhuận cố định ((1:1.2) thiết lập chặn, có thể xem xét thực hiện các cơ chế chặn linh hoạt hơn, chẳng hạn như:

    • Chiến lược dừng lại một phần: di chuyển dừng lại đến giá chi phí sau khi đạt được một số lợi nhuận, để một phần lợi nhuận tiếp tục hoạt động
    • Động lực dừng dựa trên mức độ kỹ thuật (ví dụ như mức hỗ trợ / kháng cự, mức Fibonacci)
    • Sử dụng ATR để đặt mục tiêu dừng động, tự động điều chỉnh mục tiêu lợi nhuận trong môi trường biến động khác nhau
  4. Tích hợp mô hình học máyCác nhà nghiên cứu cho biết: “Chúng ta có thể sử dụng công nghệ học máy để tăng cường khả năng dự đoán của chiến lược”.

    • Sử dụng thuật toán học máy để phân tích mô hình lịch sử và dự đoán xác suất thành công của tín hiệu
    • Hệ thống phân loại chất lượng xây dựng tín hiệu giao dịch dựa trên hiệu suất lịch sử
    • Sử dụng mô hình học tập sâu để xác định các mô hình thị trường phức tạp hơn
  5. Thêm bộ lọc thời gianThị trường có thể có các đặc điểm hành vi khác nhau trong các khoảng thời gian khác nhau, và việc thêm bộ lọc thời gian có thể giúp tránh giao dịch trong thời gian giao dịch kém hiệu quả:

    • Tỷ lệ thành công của giao dịch dựa trên phân tích dữ liệu lịch sử trong các khoảng thời gian khác nhau
    • Ngừng giao dịch khi biến động quá thấp hoặc quá cao
    • Xem xét tính năng giao dịch của các thị trường khác nhau, ví dụ như tối ưu hóa tính năng giao dịch 24 giờ của thị trường tiền điện tử

Tóm tắt

Hệ thống giao dịch tích hợp động lực tuyến tính của MACD không chậm trễ với Cloud Chart là một chiến lược giao dịch định lượng được thiết kế tốt, tạo thành một hệ thống xác nhận tín hiệu giao dịch đa chiều bằng cách tích hợp ba chỉ số kỹ thuật của MACD không chậm trễ, Kijun-sen và EOM. Chiến lược này sử dụng cơ chế xác nhận nhiều lần nghiêm ngặt trong nhận diện điểm vào, kết hợp tỷ lệ stop loss động và lợi nhuận rủi ro cố định trong quản lý rủi ro, để kiểm soát toàn diện quá trình giao dịch.

Ưu điểm cốt lõi của chiến lược là lý thuyết thiết kế giảm sự chậm trễ và cơ chế làm việc đồng bộ của nhiều chỉ số, cho phép nó nắm bắt các cơ hội giao dịch có tỷ lệ cao trong thị trường thay đổi nhanh. Đồng thời, các thiết lập tham số hoàn toàn có thể tùy chỉnh cho phép các nhà giao dịch điều chỉnh linh hoạt theo môi trường thị trường khác nhau và sở thích rủi ro cá nhân.

Mặc dù có một số rủi ro tiềm ẩn trong chiến lược này, chẳng hạn như thách thức tối ưu hóa tham số và rủi ro tín hiệu sai, nhưng sự ổn định và thích ứng của chiến lược có thể được nâng cao hơn nữa thông qua các hướng tối ưu hóa được đề xuất như tự điều chỉnh tham số chỉ số, phân loại trạng thái thị trường và tích hợp học tập máy.

Nhìn chung, đây là một hệ thống giao dịch định lượng có cấu trúc tiên tiến về mặt lý thuyết, phù hợp cho các nhà giao dịch có nền tảng phân tích kỹ thuật, đặc biệt là các nhà đầu tư tìm kiếm tín hiệu giao dịch chất lượng cao hơn là giao dịch tần số cao. Với sự điều chỉnh tham số hợp lý và tối ưu hóa liên tục, chiến lược này có tiềm năng cung cấp hiệu suất giao dịch ổn định trong nhiều môi trường thị trường.

Mã nguồn chiến lược
/*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")