EUR/USD Day Trading (EMA + ATR, Session Filter) — Strategy by joelf288
By version
Performance Metrics
- Author: version
- Symbol: FOREXCOM:EURUSD
- Timeframe: 15 minutes
- Net P&L: −0.003 USD (0.00%)
- Win Rate: 36.2%
- Profit Factor: 0.894
- Max Drawdown: 0.01 USD (0.00%)
- Total Trades: 58
Description
//version=5strategy("NY Golden Zone Auto Signals (Fib 61.8–65)", overlay=true, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.0, calc_on_every_tick=true, pyramiding=0)// =====================// Inputs// =====================sessionNY = input.session("0800-1130", "NY Session (New York time)")useSessionOnly = input.bool(true, "Trade NY Session Only")pivotLen = input.int(5, "Pivot Length (swing detection)", minval=2, maxval=20)emaFastLen = input.int(9, "EMA Fast", minval=2, maxval=200)emaMidLen = input.int(50, "EMA Mid", minval=2, maxval=300)emaTrendLen= input.int(200, "EMA Trend", minval=2, maxval=500)goldLow = input.float(0.618, "Golden Zone Low", step=0.001)goldHigh = input.float(0.650, "Golden Zone High", step=0.001)atrLen = input.int(14, "ATR Length", minval=2, maxval=100)slATR = input.float(1.2, "Stop Loss (ATR Mult)", step=0.1)tpRR = input.float(3.0, "Take Profit RR (e.g., 3 = 1:3)", step=0.25)ema50MaxDistATR = input.float(0.25, "EMA50 Proximity (ATR fraction)", step=0.05)useWickReject = input.bool(true, "Require Wick Rejection in Zone")wickMinFracATR = input.float(0.10, "Min Rejection Wick (ATR fraction)", step=0.01)// =====================// Session filter (NY time)// =====================inSession = not na(time(timeframe.period, sessionNY, "America/New_York"))allowTrade = useSessionOnly ? inSession : true// =====================// Indicators// =====================emaFast = ta.ema(close, emaFastLen)emaMid = ta.ema(close, emaMidLen)emaTrend = ta.ema(close, emaTrendLen)atr = ta.atr(atrLen)// Trend directiontrendUp = close > emaTrendtrendDown = close bullish impulse low->high// If the last confirmed swing is a LOW after a HIGH => bearish impulse high->lowbullImpulse = (not na(lastHighBar) and not na(lastLowBar)) and (lastHighBar > lastLowBar)bearImpulse = (not na(lastHighBar) and not na(lastLowBar)) and (lastLowBar > lastHighBar)// Build fib levels from the impulse legvar float fibA = navar float fibB = naif bullImpulse fibA := lastSwingLow fibB := lastSwingHighif bearImpulse fibA := lastSwingHigh fibB := lastSwingLowrange = math.abs(fibB - fibA)// Golden zone bounds (price levels)goldZoneTop = nagoldZoneBot = naif bullImpulse and range > 0 // Retracement down from high goldZoneTop := fibB - range * goldLow goldZoneBot := fibB - range * goldHighif bearImpulse and range > 0 // Retracement up from low (because fibA is high, fibB is low) goldZoneTop := fibB + range * goldHigh goldZoneBot := fibB + range * goldLow// Ensure correct ordering for plotting/logicgzHigh = math.max(goldZoneTop, goldZoneBot)gzLow = math.min(goldZoneTop, goldZoneBot)// =====================// Wick rejection (optional)// For longs: lower wick should be meaningful while in zone// For shorts: upper wick should be meaningful while in zone// =====================lowerWick = (math.min(open, close) - low)upperWick = (high - math.max(open, close))wickRejectLong = lowerWick >= atr * wickMinFracATRwickRejectShort = upperWick >= atr * wickMinFracATR// =====================// Entry conditions// =====================inGoldenZone = (not na(gzLow) and not na(gzHigh)) and (low = gzLow)// Aggressive trigger: touch zone + trend filter + ema50 near (+ optional wick reject)// LonglongCond = allowTrade and bullImpulse and trendUp and ema50Near and inGoldenZone and (not useWickReject or wickRejectLong)// ShortshortCond = allowTrade and bearImpulse and trendDown and ema50Near and inGoldenZone and (not useWickReject or wickRejectShort)// =====================// Orders + Risk management (ATR SL, RR TP)// =====================longSL = close - atr * slATRlongTP = close + (close - longSL) * tpRRshortSL = close + atr * slATRshortTP = close - (shortSL - close) * tpRR// Avoid re-entry same bar & avoid flipping instantlycanEnterLong = longCond and strategy.position_size = 0if canEnterLong strategy.entry("LONG", strategy.long) strategy.exit("L-EXIT", "LONG", stop=longSL, limit=longTP)if canEnterShort strategy.entry("SHORT", strategy.short) strategy.exit("S-EXIT", "SHORT", stop=shortSL, limit=shortTP)// =====================// Plots// =====================plot(emaTrend, "EMA 200", linewidth=2)plot(emaMid, "EMA 50", linewidth=2)plot(emaFast, "EMA 9", linewidth=1)p1 = plot(gzHigh, "Golden Zone High", style=plot.style_line, linewidth=1)p2 = plot(gzLow, "Golden Zone Low", style=plot.style_line, linewidth=1)fill(p1, p2, title="Golden Zone Fill", transp=85)// Signal markersplotshape(canEnterLong, title="Long Signal", style=shape.triangleup, location=location.belowbar, size=size.tiny, text="L")plotshape(canEnterShort, title="Short Signal", style=shape.triangledown, location=location.abovebar, size=size.tiny, text="S")// =====================// Alerts// =====================alertcondition(canEnterLong, title="NY Golden Zone LONG", message="NY Golden Zone LONG signal on {{ticker}} {{interval}}")alertcondition(canEnterShort, title="NY Golden Zone SHORT", message="NY Golden Zone SHORT signal on {{ticker}} {{interval}}")