제로래그 MACD 및 클라우드 차트 이동평균 모멘텀 통합 거래 시스템

MACD EMA SMA ATR ICHIMOKU EOM RRR 动量指标 零滞后指标 均线交叉
생성 날짜: 2025-06-11 09:58:31 마지막으로 수정됨: 2025-06-11 09:58:31
복사: 3 클릭수: 383
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

제로래그 MACD 및 클라우드 차트 이동평균 모멘텀 통합 거래 시스템 제로래그 MACD 및 클라우드 차트 이동평균 모멘텀 통합 거래 시스템

개요

제로 레이그 MACD와 클라우드 그래프均线动量整合交易系统 (영어: zero lag MACD with cloud graph uniform linear dynamics integration trading system) 는 빠른 속도로 움직이는 시장 환경을 위해 고안된 양적 거래 전략으로, 세 가지의 다른 특징을 가진 기술적인 지표들을 교묘하게 통합한다: 제로 레이그 MACD ((Zero Lag MACD), 첫눈에 평형된 그래프의 기준선 ((Kijun-sen) 과 이동 편의성 지표 ((Ease of Movement, EOM)). 이 세 가지 지표들은 서로 협동하여 거래 신호를 확인할 때 다층의 검증을 제공하며, 신호의 품질과 신뢰성을 크게 향상시킨다. 이 전략은 특히 암호화폐와 같은 큰 변동의 시장에 적합하며, 낮은 시간 주기 (예: 5 분) 에서 우수한 성능을 발휘한다.

이 전략의 핵심 설계 철학은 여러 조건이 동시에 충족되면만 거래 신호를 유발하여 낮은 품질의 거래 기회를 필터링하고, 잘못된 신호를 줄이고, 동적 스톱 로즈와 고정 된 파기 손실 비율을 통해 안정적인 위험 관리를 구현합니다. 매개 변수 최적화 및 조건 필터링을 통해 이 전략은 다양한 시장 환경에 적응하여 거래자에게 높은 확률의 거래 기회를 제공합니다.

전략 원칙

제로 지연 MACD와 클라우드 그래프 평선 동력을 통합하는 거래 시스템의 운영은 세 가지 핵심 지표의 상호 작용에 기반합니다.

  1. 제로 지연 MACD (Enhanced Edition 1.2): 전통적인 MACD에 비해, 제로 지연 MACD는 특수한 계산 방법을 통해 신호 지연을 줄이고, 트렌드 전환점에 대한 민감도를 높인다. 이 지표는 전략에서 정확한 동력의 변화를 포착하는 데 사용됩니다.

    • 빠른 선과 느린 선의 제로 지연 계산:zerolagEMA = (2 * ma1) - ma2그리고zerolagslowMA = (2 * mas1) - mas2
    • MACD 선: 빠른 선과 느린 선의 차치
    • 신호선: MACD의 평평한 이동 평균
    • 기둥형 도표: MACD 선과 신호 선의 차이
  2. 초평형 도표 기준선 ((Kijun-sen): 동적 지원/저항 및 트렌드 필터로서, 키준-센 선은 시장의 지배적인 방향을 확인하는 데 사용됩니다. 이는 둥치안 통로 원칙에 따라 계산되며, 특정 기간 동안의 최고 가격과 최저 가격의 평균값을 따릅니다.

    • baseLine = math.avg(ta.lowest(basePeriods), ta.highest(basePeriods))
  3. 모바일 편의성 지표 (EOM): 이것은 거래량에 기반한 진동기이며, 가격변동의 난이도를 측정하여 가격의 움직임을 확인한다. EOM은 다음과 같은 공식으로 계산된다:

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

이 전략의 입시 조건은 다음과 같은 세 가지 지표의 신호를 조합합니다.

복수 입학 조건

  • MACD 선에 신호선을 뚫고ta.crossover(ZeroLagMACD, signal)
  • MACD 라인은 기둥 모양의 그래프 아래로 뻗어 있다.ZeroLagMACD < hist
  • 키센보다 비싸다.close > baseLine
  • EOM는 0보다 크다.eom > 0

공허 입학 조건

  • MACD는 아래선으로 신호선을 통과합니다.ta.crossunder(ZeroLagMACD, signal)
  • MACD 선은 기둥 모양의 그래프보다 높습니다.ZeroLagMACD > hist
  • 키센보다 저렴하다.close < baseLine
  • EOM은 0보다 작습니다.eom < 0

위험 관리 측면에서, 전략은 ATR 기반의 동적 스톱로스를 채택하고, 현재 ATR의 2.5배의 스톱로스 거리, 그리고 고정된 위험-수익 비율을 1:1.2로 설정하여, 각 거래에 대한 합리적인 수익 목표가 보장된다.

전략적 이점

  1. 다중 인증 시스템트렌드, 동력, 거래량) 을 통합함으로써, 전략은 가짜 신호를 효과적으로 필터링하고, 높은 확률의 거래 기회가 발생할 때만 입문하여 거래 성공률을 크게 증가시킵니다.

  2. 뒤처짐을 줄여라제로 지연 MACD를 전통적인 MACD보다 사용하는 것은 시장의 전환점을 더 일찍 잡을 수 있으며, 전통적인 지표에서 흔히 발생하는 지연 문제를 줄여서 거래자가 이상적인 입시 지점에 더 가까이 다가갈 수 있습니다.

  3. 매우 적응력이 좋다전략의 모든 매개 변수는 다른 시장 환경, 거래 종류 및 시간 주기에 따라 사용자 정의 할 수 있습니다. MACD 주기 매개 변수, 키준-센 주기, EOM 길이 등과 같은 핵심 지표는 타겟으로 최적화 할 수 있습니다.

  4. 좋은 위험 관리 시스템

    • 동적 스톱 디자인 (ATR 기반의 변동률 자율 적응) 스톱 포지션은 시장의 변동성에 따라 자동으로 조정되도록 보장합니다.
    • 고정 리스크 수익률 (RRR): 1:1.2) 이윤 기대치를 일관되게 제공합니다.
    • 전략은 여러 조건이 동시에 충족될 때만 포지션을 열고, 잘못된 신호의 위험을 크게 낮춘다.
  5. 전체 시장 분석전략은 가격동력 (MACD), 가격구조 (Kijun-sen) 및 거래량확인 (EOM) 을 동시에 고려하고, 여러 차원의 시장 분석을 통해 더 포괄적인 거래결정 시스템을 형성한다.

  6. 시각화 기능전략: 전략은 신호 표기, 지표선 표시 및 정보 패널을 포함한 풍부한 시각적 옵션을 제공하여 거래자가 거래 신호와 현재 시장 상태를 직관적으로 이해하고 모니터링 할 수 있도록 도와줍니다.

전략적 위험

  1. 잘못된 신호의 위험: 전략이 다중 지표 확인을 사용함에도 불구하고, 높은 변동성 또는 평형 시장에서 가짜 신호가 발생할 수 있습니다. 특히 시장이 짧은 시간에 자주 방향을 변경할 때, 다중 지표 확인은 거래 신호가 너무 적어지고 거래 기회의 일부를 놓칠 수 있습니다.

    • 해결 방법: 시장 상태에 따라 지표 매개 변수를 조정할 수 있습니다. 높은 변동 기간 동안 특정 조건을 완화하거나 MACD와 EOM의 민감도를 조정할 필요가있을 수 있습니다.
  2. 매개 변수 최적화 도전전략에는 여러 가지 변수가 조정되어야 합니다 (MACD 변수, 키센 주기, EOM 길이는 등), 부적절한 변수 설정은 역사 데이터에 과도하게 적합하게 작용하여 미래 시장 환경에서 좋지 않은 성능을 발휘 할 수 있습니다.

    • 해결 방법: 전향 테스트와 안정성 테스트를 사용하여 다양한 시장 환경에서 변수가 유효하게 유지될 수 있도록합니다. 과잉 최적화를 피하고 여러 시장 조건에서 안정적인 성능을 나타내는 변수 조합을 찾습니다.
  3. 슬라이드 포인트와 유동성 위험낮은 시간 주기의 거래에서, 특히 암호화폐와 같은 변동성이 높은 시장에서, 실제 실행 가격과 전략 계산 가격의 차이로 인해 슬라이드 및 유동성 문제가 발생할 수 있습니다.

    • 해결 방법: 회전 측정에 슬라이드 시뮬레이션을 포함; 전략에 유동성 필터링 조건을 추가 고려; 더 유동성이있는 시장을 우선적으로 선택하여 거래하십시오.
  4. 스톱더는 위험합니다.급변하는 시장에서, ATR 기반의 정지는 극단적인 가격 변동에 대처할 수 없으며, 예상보다 실제 손실이 발생할 수 있습니다.

    • 해결 방법: 극단적인 변동 조건에서 ATR 배수를 자동으로 조정하거나 절대 최대 손실 제한을 설정하는 것과 같은 추가적인 스톱 로즈 보호 장치를 추가하는 것을 고려하십시오.
  5. 기술 의존성이 전략은 기술적인 지표에 매우 의존하고 있으며, 근본적인 변화로 인한 시장의 급격한 변동으로 인해 좋지 않은 성과를 낼 수 있습니다.

    • 해결 방법중요한 경제 자료나 사건이 발표되기 전에 거래 규모를 줄이거나 거래를 중단하십시오. 기본 필터를 통합하는 것을 고려하십시오.

전략 최적화 방향

  1. 지표 변수는 스스로 적응: 현재 전략은 고정된 지표 파라미터를 사용하며, 파라미터의 자기 적응 조정 메커니즘을 구현하는 것을 고려할 수 있으며, 시장의 변동성이나 거래 주기에 따라 MACD, Kijun-sen 및 EOM의 파라미터를 자동으로 최적화 할 수 있습니다. 이것은 전략이 다른 시장 단계에 더 잘 적응하여 전반적인 안정성을 향상시킬 수 있습니다.

    • 최근 N주기의 변동률이나 트렌드 강도를 기반으로 동적으로 조정할 수 있는 파라미터
    • 다른 시장 상태 (트렌드, 변동) 에 따라 최적의 파라미터 조합을 연구하고 스위치 메커니즘을 구축합니다.
  2. 시장 상태 분류를 추가: 시장 상태 인식 모듈을 추가함으로써, 전략은 거래 조건과 위험 관리 매개 변수를 현재 시장이 트렌드 상태인지 아니면 흔들림 상태에 있는지에 따라 조정할 수 있습니다. 예를 들어:

    • 불투명한 시장에서 필터링 조건을 늘리거나 거래 빈도를 낮추는 것
    • 명확한 트렌드에서 일부 입시 조건이 완화될 수 있으며, 지분 기간이 연장될 수 있습니다.
    • 시장 상태를 식별하는 데 도움이되는 ADX와 같은 트렌드 강도 지표를 추가하는 것을 고려하십시오.
  3. 정지방지 전략을 최적화: 현재 전략은 고정된 리스크 수익률을 사용한다. 1: 1.2) 스톱을 설정하고, 보다 유연한 스톱 메커니즘을 구현하는 것을 고려할 수 있다.

    • 부분 중단 전략: 특정 수익을 달성한 후 손실을 비용으로 이동하여 수익의 일부를 계속 실행하십시오.
    • 기술 수준에 기반한 동적 정지 (예: 지지/저항 지점, 피보나치 수준)
    • ATR의 변동률을 사용하여 동적으로 중지 목표를 설정하여 다른 변동 환경에서 수익 목표를 자동으로 조정합니다.
  4. 기계학습 모델을 통합합니다.“기계 학습 기술을 사용하여 전략의 예측 능력을 강화하는 것을 고려하십시오”.

    • 기계 학습 알고리즘을 사용하여 역사 패턴을 분석하여 신호의 성공 가능성을 예측합니다.
    • 거래 신호를 구축하는 질적 분류 체계의 역사적인 성과
    • 더 복잡한 시장 패턴을 식별하기 위해 딥러닝 모델을 사용합니다.
  5. 시간 필터 추가: 시장의 행동 특성은 다른 시간대에 따라 다를 수 있으며, 시간 필터를 추가하면 거래가 효율적이지 않은 거래 시간에 거래되는 것을 피할 수 있습니다:

    • 역사적인 데이터 분석에 따라 다른 기간 동안 거래 성공률
    • 너무 낮은 변동성이나 너무 높은 변동성으로 거래를 중지하십시오.
    • 암호화폐 시장의 24시간 거래 특성에 대한 최적화와 같은 다른 시장의 거래 시간 특성을 고려하는 것

요약하다

제로래그 MACD와 클라우드 그래프 평행 선동 통합 거래 시스템은 세 가지 기술 지표를 통합하여 다차원 거래 신호 확인 시스템을 형성하는 정교하게 설계된 양적 거래 전략입니다. 이 전략은 입시 지점에서 엄격한 여러 확인 메커니즘을 사용하고, 위험 관리에서 동적 스톱 손실과 고정 위험 수익 비율을 결합하여 거래 프로세스의 전방위적인 통제를 구현합니다.

이 전략의 핵심 장점은 뒤처진 디자인의 개념과 다중 지표의 협동 작업 메커니즘을 줄이는 데 있습니다. 이것은 빠르게 변화하는 시장에서 높은 확률의 거래 기회를 잡을 수 있습니다. 동시에 완전히 사용자 정의 가능한 매개 변수 설정은 거래자가 다른 시장 환경과 개인 위험 선호도에 따라 유연하게 조정할 수 있습니다.

이 전략에는 변수 최적화 도전과 잘못된 신호 위험과 같은 잠재적인 위험이 있지만, 지표 변수 자조, 시장 상태 분류 및 기계 학습 통합과 같은 제안된 최적화 방향에 의해 전략의 안정성과 적응성을 더욱 향상시킬 수 있습니다.

전체적으로, 이것은 개념적으로 진보된, 구조적으로 완전한 수량 거래 시스템이며, 기술적 분석 기반을 가진 거래자가 사용하는 것이 적합합니다. 특히 고품질의 거래 신호를 추구하는 투자자가 고주파 거래가 아니라. 합리적인 매개 변수 조정과 지속적인 최적화를 통해, 이 전략은 다양한 시장 환경에서 안정적인 거래 성능을 제공하는 잠재력을 가지고 있습니다.

전략 소스 코드
/*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")