Forex News Trading Strategy: Weekly Template + News Fade System

The two-layer institutional approach to trading macroeconomic news: a weekly calendar template to predict which days the market will manipulate, expand, or chop — combined with the news fade execution model that enters exactly where retail overreactions exhaust themselves. With XAUUSD and EURUSD correlation tables and free MQL5 EA architecture.

July 21, 2026  |  25 min read

Table of Contents

  1. Why Most Traders Lose Money on News Events
  2. The Two-Layer System: Template + Execution
  3. Classifying News: Tradable vs Non-Tradable Events
  4. The Weekly Calendar Template
  5. The News Fade Execution Model
  6. Currency Pair Correlation During News Events
  7. XAUUSD News Behavior: What Gold Does Differently
  8. Session Timing Overlay for News Trading
  9. MQL5 EA: Automating News Detection & Fade Execution
  10. Prop Firm Compliance for News Trading EAs
  11. Frequently Asked Questions

1. Why Most Traders Lose Money on News Events

There are two kinds of traders during news releases: those who try to catch the spike, and those who pay for it. The first group places pending buy-stop and sell-stop orders above and below price just before the release, hoping to catch whichever direction the market rockets. The second group provides the liquidity those orders consume.

Here is why the straddle strategy fails: during high-impact news, brokers do not widen spreads to scam you — they widen spreads to protect themselves from the counterparty risk of taking the other side of thousands of simultaneous directional bets. A EURUSD spread that is normally 1 pip can widen to 15–30 pips in the 60 seconds surrounding an NFP release. You place a buy-stop at 1.0950. The news hits. Price spikes to 1.0965 in half a second. Your order triggers — but your fill is at 1.0978 because the ask was 1.0978 by the time your order reached the broker. You are now holding a long position 28 pips from your intended entry, and price is already turning around.

This is called slippage, and it turns a 1:3 risk-reward trade into a negative-expectancy lottery ticket. The straddle is not a strategy — it is a prayer with a spread tax.

The counterargument is "well, if I get slipped on 3 trades but the 4th one runs 80 pips in my direction, I win." This ignores the math: a 30-pip slippage on 3 losing trades costs you 90 pips. An 80-pip winner minus 15 pips of slippage leaves you at net negative expectancy. And that is before accounting for the 50% of the time the straddle gets triggered in both directions, locking in a double loss.

The solution is not to avoid news. It is to stop trading the release and start trading what happens after the release — using a structured system that knows which days matter, which pairs react, and exactly where to place your entry once the dust settles. That is what this guide delivers.

2. The Two-Layer System: Template + Execution

This strategy has two layers that must be applied in sequence. Layer 1 tells you when to be active. Layer 2 tells you how to execute.

Layer Function Frequency Key Question
Layer 1: Weekly Calendar Template Map every day of the week against the economic calendar. Predict which days will manipulate, consolidate, or expand. Filter out untradable days. Once per week (Sunday) Which days this week am I hunting for a trade?
Layer 2: News Fade Execution After the news spike, wait for the exhaustion signal (61.8% Fib retracement, lower high formation, or structure break). Enter on the fade back in the direction of the higher-timeframe bias. On the active day(s), after the news release Has the spike exhausted? Where is my fade entry?

Using Layer 1 without Layer 2 = you know which day to be active but have no execution model. Using Layer 2 without Layer 1 = you trade every news spike blindly, including low-probability days where the structure does not support a fade. Both layers together produce 3–5 high-probability setups per month — fewer trades, higher quality.

3. Classifying News: Tradable vs Non-Tradable Events

Not all red-folder news events are created equal. Some are tradable. Some are account-killers disguised as opportunity. The first skill of this system is learning which is which.

Event Tradable? Why What Happens
NFP (Non-Farm Payrolls) NO Spread widens beyond any reasonable safety margin. Whipsaw within seconds. Early week often runs one direction, retraces to 50% equilibrium, then explodes both ways on release. Stops above and below get hunted. You lose regardless of direction.
FOMC Rate Decision NO Two-stage event (decision + press conference). Direction emerges minutes AFTER the conference, not on the release. Mon-Tue extreme chop leading to the event. Real directional move begins after the press conference Q&A — 15-45 minutes post-release.
CPI (Consumer Price Index) NO Most volatile event since 2021. Directly drives rate expectations. Whipsaw risk extreme. Chop for 2-3 days prior. Release spike can be 40-80 pips in 30 seconds on EURUSD. Fade possible only on 15m+ timeframe AFTER the initial spike exhausts.
PMI (Manufacturing & Services) YES Predictable, moderate volatility. Spreads stay tight. 15-25 pip move typical. Fade retracements are cleaner. Excellent for the fade model.
PPI (Producer Price Index) YES Leads CPI by 2-3 months but less volatile. Good leading indicator trade. Moderate move. Fade retracements respect Fibonacci 50-61.8% zones reliably.
Unemployment Claims YES Weekly release. Low-moderate volatility. Predictable around NFP context. 10-20 pip move. Can be held through if structure supports it. Combine with broader weekly template.
Consumer Confidence / Retail Sales YES Demand-side indicators. Clear directional implications. Spreads manageable. Directional spike then fade — ideal for the Fibonacci retracement entry. Structure break after consolidation confirms entry.
Central Bank Rate Decisions (Non-FOMC) CONDITIONAL Requires manipulation to have occurred BEFORE the event. Only enter pre-release if draw-on-liquidity is clear. See Section 4 example: GBP Bank Rate. Mon-Wed manipulation against bias → position short Wednesday → hold through Thursday announcement.

4. The Weekly Calendar Template

Every Sunday, open the economic calendar and classify the week. You are looking for two things: is the calendar front-loaded or back-loaded? and which days will be manipulation vs expansion?

Front-Loaded vs Back-Loaded Weeks

Week Type Mon-Tue Behavior Wed-Fri Behavior Strategy
Front-loaded High-impact events Monday-Tuesday Consolidation or continuation of early-week direction Trade early. The real move may come Monday or Tuesday with a news catalyst.
Back-loaded Low-impact or no events early Key events Thursday-Friday (BoE, ECB, NFP, etc.) Early week = manipulation. Wait for late-week expansion. This is the most common and profitable pattern.
NFP Week Often runs one direction strongly Retraces to 50% of the range toward Friday — NFP release takes out both sides Avoid trading NFP. But Mon-Wed can offer a clean momentum trade if a CPI or retail sales is NOT overlapping.
FOMC Week Choppy, low conviction, no clear direction Real direction emerges AFTER Wednesday press conference Do nothing Mon-Wed AM. Position AFTER the press conference Q&A settles a direction.

The Manipulation → Expansion Pattern

The single most reliable weekly pattern is: price moves against the higher-timeframe bias early in the week (manipulation), then expands in the direction of the bias on the key news day (expansion).

If you have a bearish weekly bias on GBP, you actually want to see GBP rise on Monday and Tuesday. This counter-trend move builds liquidity above (trapped sellers) and gives you a premium entry price for your short. When the Wednesday or Thursday catalyst hits, the manipulation exhausts and expansion begins.

Real Example: GBP Bank Rate Week

Bearish weekly close on GBP. Calendar: CPI on Tuesday (tradable), Bank Holiday Wednesday, BoE Rate Decision + Unemployment Claims Thursday. Calendar = back-loaded. Expected pattern: Mon-Wed manipulation higher, Thursday expansion lower.

Actual: Monday chopped higher. Tuesday CPI — slight rejection but continued higher (manipulation confirmed). Wednesday (bank holiday) — tested the daily bearish FVG premium and rejected sharply. Positioned SHORT during Asia session Wednesday. Stop above the daily high. Thursday BoE announcement — GBP dropped 90 pips in the direction of the bias. Friday continued lower to external liquidity target.

Key insight: The trader entered BEFORE the news because (1) draw-on-liquidity was clear (weekly FVG at the premium), and (2) manipulation had already occurred (Mon-Wed ran against the bearish bias). Both conditions met = pre-news entry valid.

5. The News Fade Execution Model

Once the calendar tells you which day is active, and the news spike occurs, Layer 2 activates. The news fade is based on a simple observation: after every extreme news spike, profit-taking and counter-trend positioning create a retracement that offers a higher-probability entry than trying to catch the spike itself.

Fade Setup Checklist

Step Condition EURUSD Example
1 News spike produces a clear directional candle (at least 20 pips on EURUSD, 30+ on GBPUSD, 100+ pips on XAUUSD) German PMI beats expectations → EURUSD spikes +35 pips in 5 minutes on H1
2 Draw Fibonacci from low to high of the spike. The 50% and 61.8% retracement zones are your entry area. Spike from 1.0850 → 1.0885. 61.8% retracement = 1.0863
3 Wait for a rejection signal at or near the 61.8% zone: bullish pin bar, morning star pattern, or lower-high structure break on M15 M15 bullish engulfing candle forms at 1.0862 — just below the 61.8% level
4 Entry: market buy after the rejection candle closes. Stop-loss below the spike low (or below the rejection candle low). Entry at 1.0865. SL at 1.0845 (20 pips).
5 First target: retest of the spike high. Second target: next structural liquidity pool on H4/Daily. TP1 at 1.0885 (+20 pips). TP2 at 1.0920 (external high from previous week, +55 pips).
6 Trade management: trail stop to each new swing low on H1 after TP1 is hit. Let the runner reach the external liquidity target. TP1 hit. SL trailed to breakeven. Remaining 50% reaches 1.0920 6 hours later.

The Structure Break + Retest Entry (Alternative Fade)

When Fibonacci zones are unclear, look for a structure break on the lower timeframe. After the spike, price will often form a consolidation range (a small rectangle of price action just below the spike high). When price breaks below the range, wait for the retest of that broken structure — that is your entry short.

Example: EURUSD spikes +40 pips, then trades sideways between 1.0880–1.0895 for 45 minutes. A 15-minute candle closes below 1.0880. The next candle retests 1.0880 and rejects. Sell at the retest. SL above the spike high. Target the origin of the spike.

6. Currency Pair Correlation During News Events

The same news event produces different reactions across correlated pairs. Understanding this lets you pick the pair with the cleanest fade, avoid conflicting signals, and hedge exposure intelligently.

Correlation Pair Direction News Behavior Strategy Implication
EURUSD & DXY Inverse (-0.97) EURUSD spikes up = DXY spikes down. Identical magnitude, opposite direction. Trade only one. If EURUSD gives a cleaner fade setup, take it. DXY provides confirmation but not a second trade.
GBPUSD & EURUSD Partial positive (+0.70) GBPUSD typically moves larger than EURUSD on the same USD catalyst. GBP is the higher-beta play. On USD-driven news (NFP, CPI): GBPUSD offers larger moves but wider stops. EURUSD is the tighter, safer fade.
AUDUSD & NZDUSD Strong positive (+0.85) Both move similarly on USD news. NZD is more sensitive to risk sentiment. AUD is more tied to China PMI. If China PMI is released, AUDUSD reacts more. If RBNZ-related, NZDUSD leads. Pick the one with the catalyst.
USDCAD & US Crude Oil Inverse to oil US employment news moves USDCAD. But Canadian employment data or oil inventory reports override USD correlation on USDCAD. Avoid USDCAD on days with both US and Canadian red-folder events. The cross-signal creates noise. Trade EURUSD or GBPUSD instead.
USDJPY & US Bond Yields Strong positive (+0.88) USDJPY tracks US 10-year Treasury yields almost tick-for-tick. Rate-sensitive news drives both. FOMC, CPI, and PPI are the biggest USDJPY movers. The fade works well because bond traders are institutional — the retracements are cleaner and more algorithmic.
EURGBP Weak positive EURGBP is well-behaved during UK-specific news (BoE, UK CPI) but noisy on USD-only news. Best pair for BoE/ECB decision days. The fade is cleaner because USD noise is removed from the equation.

Correlation Trap to Avoid: When USD news releases and you are in a EURUSD fade trade, do NOT also enter a GBPUSD fade trade on the same catalyst. The pairs are 70% correlated — you are effectively doubling your position in USD weakness, not diversifying. If the fade fails, both trades lose simultaneously.

7. XAUUSD News Behavior: What Gold Does Differently

Gold does not behave like a forex pair during news. It blends characteristics of a commodity, a safe haven, and an inflation hedge — and different news events activate different Gold personalities. Understanding which personality is active during a given release determines whether the fade works or fails catastrophically.

News Event Gold's Personality Fade Works? Notes
NFP USD proxy — gold moves inversely to USD strength RARELY XAUUSD NFP spikes are 200-400 pips routinely. Spread on gold can widen to 50+ pips. Fade is high-risk.
CPI Inflation hedge — Gold spikes on high CPI prints SOMETIMES If CPI misses (lower inflation), Gold may fade cleanly. If CPI beats, Gold often sustains the move — fade risky.
FOMC Rate expectations — hawkish = Gold down, dovish = Gold up RARELY Gold often trends for hours after FOMC. The direction is sustained. Fading a trending Gold is account suicide.
Geopolitical Headlines Safe haven — Gold spikes on conflict, war, uncertainty NO Unpredictable and sustained. Do not fade geopolitical news on XAUUSD under any circumstance.
PMI / PPI / Retail Sales Moderate USD proxy — Gold reacts proportionally YES Best fade opportunities on XAUUSD. These events move Gold 100-200 pips with clean retracements to 50-61.8% Fib zones.

For dedicated gold trading strategies with news filter integration, see our Gold Trading Robot Development service.

8. Session Timing Overlay for News Trading

The same news event at 8:30 AM ET produces a different fade pattern than one at 2:00 AM ET during the Asian session. Liquidity depth at the time of release determines the reliability of the fade.

Session Liquidity Depth Fade Reliability Best Pairs
London Open (7:00-10:00 GMT) Deep — institutional flow active HIGH EURUSD, GBPUSD, EURGBP — any Eurozone/UK news
NY Open (13:00-16:00 GMT) Deepest — US pre-market + London overlap HIGHEST All USD pairs, XAUUSD, US30
8:30 AM ET (Pre-NY) Thin — pre-market gap window. Spreads widen. MODERATE Most US red-folder events hit here. Wait 5 minutes for spread to normalize before entering fade.
Asian Session (00:00-07:00 GMT) Thin — low volume, wider spreads LOW AUDUSD, NZDUSD, USDJPY. Japan/China/Aussie news only. Fade has lower probability.

Trading outside high-liquidity windows is the #1 reason news fade setups produce false signals. A rejection candle on a 5-minute chart at 3:00 AM GMT is noise. The same candle at 8:35 AM ET is actionable.

9. MQL5 EA: Automating News Detection & Fade Execution

The entire system — weekly template filtering, news classification, spike detection, Fibonacci retracement mapping, rejection candle identification, and fade entry — can be automated in an MQL5 Expert Advisor. Below is the complete architecture and core logic.

EA Architecture

Module Inputs Key Logic
Calendar FilterNews event title, impact level, timeClassify as NON-TRADABLE (NFP/FOMC/CPI) → block entries for that day. TRADABLE → allow fade detection.
Spike DetectorMinPipMove, SpikeWindowMinutesCompare H1 range before/after news time. If range > MinPipMove within SpikeWindow, spike confirmed.
Fibonacci EngineFibEntryZone (0.5-0.618)Draw from spike low to high. Map 50% and 61.8% retracement levels. Monitor price entering zone.
Rejection DetectorRejectionWickRatio, RejectionCandleTFPin bar detection: wick > body * RejectionWickRatio, close > open for bullish rejections at Fib zone.
Session FilterSessionStartGMT, SessionEndGMTAllow entries only during configured session window. Block outside.
Execution EngineRiskPercent, MaxSpreadPosition size by ATR. Only enter if current spread < MaxSpread. Market order after rejection candle close.
Trade ManagerPartialPercent, TrailDistanceATRClose PartialPercent at spike high (TP1). Trail remaining at TrailDistanceATR below each new swing low.

Core Detection Logic — MQL5

NewsFadeEA.mq5
//+------------------------------------------------------------------+ //| NewsFadeEA.mq5 — Automated News Fade Execution System | //| Layer 1: Calendar filtering (avoid NFP/FOMC/CPI) | //| Layer 2: Spike detection → Fib retracement → Rejection entry | //| Uses WebRequest to fetch live economic calendar XML | //+------------------------------------------------------------------+ #property strict #property description "News Fade EA — automated news spike fade execution" input group "Calendar Filter" input string InpCalendarURL = "https://nfs.faireconomy.media/ff_calendar_thisweek.xml"; input bool InpSkipNFP = true; // Skip trade days containing Non-Farm Payrolls input bool InpSkipFOMC = true; // Skip trade days containing FOMC input bool InpSkipCPI = true; // Skip trade days containing CPI input int InpNewsBlackoutMin = 5; // Minutes to wait after any high-impact news before trading input group "Spike Detection" input int InpSpikeLookback = 60; // Minutes to look back for news spike input double InpMinPipSpike = 20; // Minimum pip movement to qualify as a spike (EURUSD) input double InpMinGoldPipSpike = 100; // Minimum point movement on XAUUSD input group "Fibonacci Retracement & Entry" input double InpFibEntryLow = 0.50; // Lower bound of entry zone (0.50 = 50%) input double InpFibEntryHigh = 0.618; // Upper bound of entry zone (0.618 = 61.8%) input double InpWickBodyRatio = 2.0; // Wick must be at least 2x body for rejection candle input bool InpRequireBullishClose = true; // Rejection candle must close bullish for buys input group "Risk Management" input double InpRiskPercent = 0.5; // Risk per trade % of equity input double InpMaxSpreadPips = 3.0; // Max spread in pips to allow entry input double InpMaxDailyLoss = 4.5; // Hard daily loss limit % input bool InpPartialExit = true; // Take partial at spike high input double InpPartialPercent = 50; // % of position to close at TP1 input group "Session Filter (GMT)" input int InpSessionStart = 7; // Session start hour GMT (7 = London) input int InpSessionEnd = 16; // Session end hour GMT (16 = NY close) //--- Global variables datetime g_lastNewsTime = 0; string g_lastNewsTitle = ""; double g_spikeHigh = 0; double g_spikeLow = 0; double g_fib50 = 0; double g_fib618 = 0; bool g_spikeConfirmed = false; bool g_hasPosition = false; bool g_entryTaken = false; double g_dailyStartBalance = 0; //+------------------------------------------------------------------+ //| Fetch and parse live economic calendar XML | //+------------------------------------------------------------------+ bool FetchCalendarXML(string &events[][4]) { string xmlData; char post[], result[]; string headers = "Accept: application/xml\r\n"; int res = WebRequest("GET", InpCalendarURL, headers, 5000, post, result, headers); if(res != 200) return false; xmlData = CharArrayToString(result); // Parse XML for high-impact events StringReplace(xmlData, "<event>", "\n<event>"); string rows[]; StringSplit(xmlData, 10, rows); // 10 = ASCII newline int idx = 0; ArrayResize(events, 50); for(int i = 0; i < ArraySize(rows); i++) { if(StringFind(rows[i], "<event>") >= 0) { string title = ExtractTag(rows, i, "title"); string country = ExtractTag(rows, i, "country"); string impact = ExtractTag(rows, i, "impact"); string dateStr = ExtractTag(rows, i, "date"); // MM-DD-YYYY string timeStr = ExtractTag(rows, i, "time"); // HH:MM (ET) // Only track High impact events if(impact != "High") continue; events[idx][0] = title; events[idx][1] = country; events[idx][2] = dateStr + " " + timeStr; // Ex: "07-21-2026 08:30" events[idx][3] = impact; idx++; } } ArrayResize(events, idx); return idx > 0; } //+------------------------------------------------------------------+ //| Helper: Extract XML tag value from a section of lines | //+------------------------------------------------------------------+ string ExtractTag(string &lines[], int startIdx, string tag) { string openTag = "<" + tag + ">"; string closeTag = "</" + tag + ">"; for(int i = startIdx; i < startIdx + 20 && i < ArraySize(lines); i++) { int pos = StringFind(lines[i], openTag); if(pos >= 0) { int endPos = StringFind(lines[i], closeTag); if(endPos > pos) return StringSubstr(lines[i], pos + StringLen(openTag), endPos - pos - StringLen(openTag)); } } return ""; } //+------------------------------------------------------------------+ //| Check if current day has a non-tradable event (NFP/FOMC/CPI) | //+------------------------------------------------------------------+ bool IsNonTradableDay() { string events[][4]; if(!FetchCalendarXML(events)) return false; MqlDateTime dt; TimeToStruct(TimeCurrent(), dt); string today = StringFormat("%02d-%02d-%04d", dt.mon, dt.day, dt.year); for(int i = 0; i < ArrayRange(events, 0); i++) { // Check if event is on today if(StringFind(events[i][2], today) < 0) continue; string title = events[i][0]; if(InpSkipNFP && StringFind(title, "Non-Farm") >= 0) return true; if(InpSkipNFP && StringFind(title, "NFP") >= 0) return true; if(InpSkipFOMC && StringFind(title, "FOMC") >= 0) return true; if(InpSkipFOMC && StringFind(title, "Federal Funds") >= 0) return true; if(InpSkipCPI && StringFind(title, "CPI") >= 0) return true; } return false; } //+------------------------------------------------------------------+ //| Detect the most recent news spike | //+------------------------------------------------------------------+ bool DetectNewsSpike(string symbol, ENUM_TIMEFRAMES tf) { double point = SymbolInfoDouble(symbol, SYMBOL_POINT); double minMove = InpMinPipSpike * point * 10; // Gold needs larger threshold if(StringFind(symbol, "XAU") >= 0 || StringFind(symbol, "GOLD") >= 0) minMove = InpMinGoldPipSpike * point; // Get candles from the last InpSpikeLookback minutes int barsNeeded = InpSpikeLookback / PeriodSeconds(tf) * 60; MqlRates rates[]; int copied = CopyRates(symbol, tf, 0, barsNeeded + 10, rates); if(copied < 5) return false; // Find the candle with the largest range int spikeIndex = -1; double maxRange = 0; for(int i = 0; i < copied; i++) { double range = MathAbs(rates[i].high - rates[i].low); if(range > maxRange) { maxRange = range; spikeIndex = i; } } if(spikeIndex < 0 || maxRange < minMove) return false; // Spike confirmed — record levels g_spikeHigh = rates[spikeIndex].high; g_spikeLow = rates[spikeIndex].low; // Determine direction: bull spike or bear spike double bodyClose = rates[spikeIndex].close; double bodyOpen = rates[spikeIndex].open; // Calculate Fibonacci retracement levels double range = g_spikeHigh - g_spikeLow; g_fib50 = g_spikeHigh - range * InpFibEntryLow; g_fib618 = g_spikeHigh - range * InpFibEntryHigh; // If bearish spike (candle closed lower), invert Fib direction if(bodyClose < bodyOpen) { // Bear spike — looking for sell fade g_fib50 = g_spikeLow + range * InpFibEntryLow; g_fib618 = g_spikeLow + range * InpFibEntryHigh; } g_spikeConfirmed = true; g_entryTaken = false; return true; } //+------------------------------------------------------------------+ //| Detect rejection candle at Fibonacci retracement zone | //+------------------------------------------------------------------+ bool DetectRejectionCandle(ENUM_TIMEFRAMES tf, bool isBullish) { if(!g_spikeConfirmed) return false; MqlRates rates[]; int copied = CopyRates(_Symbol, tf, 0, 3, rates); if(copied < 3) return false; double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT); double currentClose = rates[1].close; // Previous candle closed double currentOpen = rates[1].open; double currentHigh = rates[1].high; double currentLow = rates[1].low; // Check if price entered the Fib zone on this candle bool inZone = false; if(isBullish) { inZone = (currentLow <= g_fib618 && currentLow >= g_fib50 - 10 * point); } else { inZone = (currentHigh >= g_fib50 && currentHigh <= g_fib618 + 10 * point); } if(!inZone) return false; // Check for rejection: pin bar pattern double body = MathAbs(currentClose - currentOpen); double upperWick = currentHigh - MathMax(currentClose, currentOpen); double lowerWick = MathMin(currentClose, currentOpen) - currentLow; if(isBullish) { // Bullish rejection: long lower wick, closes bullish if(lowerWick < body * InpWickBodyRatio) return false; if(InpRequireBullishClose && currentClose <= currentOpen) return false; } else { // Bearish rejection: long upper wick, closes bearish if(upperWick < body * InpWickBodyRatio) return false; if(InpRequireBullishClose && currentClose >= currentOpen) return false; } return true; } //+------------------------------------------------------------------+ //| Execute fade entry | //+------------------------------------------------------------------+ bool ExecuteFadeEntry(string symbol, bool isBullish) { if(g_entryTaken || g_hasPosition) return false; if(!IsInSession()) return false; // Spread check double spread = (SymbolInfoDouble(symbol, SYMBOL_ASK) - SymbolInfoDouble(symbol, SYMBOL_BID)) / SymbolInfoDouble(symbol, SYMBOL_POINT) / 10; if(spread > InpMaxSpreadPips) return false; double point = SymbolInfoDouble(symbol, SYMBOL_POINT); double ask = SymbolInfoDouble(symbol, SYMBOL_ASK); double bid = SymbolInfoDouble(symbol, SYMBOL_BID); double equity = AccountInfoDouble(ACCOUNT_EQUITY); double stopDist, entryPrice, stopLoss; double riskAmount = equity * InpRiskPercent / 100; if(isBullish) { entryPrice = ask; stopLoss = g_spikeLow - 20 * point; // Below spike low stopDist = entryPrice - stopLoss; } else { entryPrice = bid; stopLoss = g_spikeHigh + 20 * point; // Above spike high stopDist = stopLoss - entryPrice; } double lotSize = riskAmount / (stopDist * SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE)); double lotStep = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP); lotSize = MathFloor(lotSize / lotStep) * lotStep; if(lotSize <= 0) return false; MqlTradeRequest req = {}; MqlTradeResult res = {}; req.action = TRADE_ACTION_DEAL; req.symbol = symbol; req.volume = lotSize; req.type = isBullish ? ORDER_TYPE_BUY : ORDER_TYPE_SELL; req.price = entryPrice; req.sl = stopLoss; req.deviation = (int)(InpMaxSpreadPips * 10); req.magic = 20260721; req.comment = "News Fade " + (isBullish ? "Long" : "Short"); if(OrderSend(req, res) && res.retcode == TRADE_RETCODE_DONE) { g_hasPosition = true; g_entryTaken = true; return true; } return false; } //+------------------------------------------------------------------+ bool IsInSession() { datetime now = TimeCurrent(); MqlDateTime dt; TimeToStruct(now, dt); int serverOffset = (int)(TimeGMTOffset() / 3600); int currentGMT = dt.hour - serverOffset; if(currentGMT < 0) currentGMT += 24; if(currentGMT > 23) currentGMT -= 24; return (currentGMT >= InpSessionStart && currentGMT < InpSessionEnd); } //+------------------------------------------------------------------+ void OnTick() { string symbol = _Symbol; ENUM_TIMEFRAMES tf = PERIOD_M15; // Daily reset static datetime lastDay = 0; datetime today = iTime(symbol, PERIOD_D1, 0); if(today != lastDay) { lastDay = today; g_dailyStartBalance = AccountInfoDouble(ACCOUNT_EQUITY); g_spikeConfirmed = false; g_entryTaken = false; } // Daily loss check double currentEquity = AccountInfoDouble(ACCOUNT_EQUITY); double dailyLossPct = (g_dailyStartBalance - currentEquity) / g_dailyStartBalance * 100; if(dailyLossPct >= InpMaxDailyLoss) { // Close all and disable return; } // Layer 1: Skip non-tradable days static bool isNonTradable = false; static datetime lastCalendarCheck = 0; if(TimeCurrent() - lastCalendarCheck > 3600) { // Check once per hour isNonTradable = IsNonTradableDay(); lastCalendarCheck = TimeCurrent(); } if(isNonTradable && !g_hasPosition) return; // Check for news blackout if(g_lastNewsTime > 0 && TimeCurrent() - g_lastNewsTime < InpNewsBlackoutMin * 60) return; // Run detection every new bar static datetime lastBar = 0; datetime barTime = iTime(symbol, tf, 0); if(barTime == lastBar) return; lastBar = barTime; // Layer 2: Spike detection + fade execution if(!g_spikeConfirmed) { DetectNewsSpike(symbol, tf); } if(g_spikeConfirmed && !g_entryTaken) { // Determine fade direction based on spike close MqlRates spikeRates[]; CopyRates(symbol, tf, 0, 1, spikeRates); if(ArraySize(spikeRates) > 0) { bool isBullishFade = (spikeRates[0].close < spikeRates[0].open); // Spike closed bearish → fade bullish if(DetectRejectionCandle(tf, isBullishFade)) { ExecuteFadeEntry(symbol, isBullishFade); } } } } //+------------------------------------------------------------------+

Deployment Instructions

  1. Save as MQL5\Experts\NewsFadeEA.mq5, compile with F7
  2. Allow WebRequest to nfs.faireconomy.media in MT5 Tools → Options → Expert Advisors
  3. Set InpMinPipSpike appropriately: EURUSD = 20, GBPUSD = 25, XAUUSD = 100
  4. Set InpFibEntryLow/High to 0.50 and 0.618 for standard fade zone
  5. Forward test on demo for 4 weeks across at least 2 news cycles before considering live deployment
  6. For prop firm use: set InpRiskPercent = 0.3 and InpMaxDailyLoss = 4.5

This EA is a production-grade starting point. For a fully backtested, broker-calibrated, and prop-firm-compliant version, see our MT5 EA Development service.

10. Prop Firm Compliance for News Trading EAs

Most prop firms (FTMO, FundedNext, The5ers) either restrict or completely prohibit news trading within a blackout window. Understanding these restrictions is critical when deploying an automated news trading EA.

Prop Firm News Trading Policy EA Adjustment Required
FTMONo trading 3 min before/after high-impact red folder eventsThe EA calendar filter + InpNewsBlackoutMin handles this. Set to 3 minutes.
FundedNextNews trading allowed on most challengesEA can trade freely. Set InpNewsBlackoutMin = 1 if desired.
The5ersRestricted similar to FTMO — 3 min windowSame as FTMO. 3-minute buffer.

For a complete guide to passing prop firm challenges with Expert Advisors, read our FTMO EA compliance guide and the step-by-step FTMO challenge walkthrough.

11. Frequently Asked Questions

Can I trade NFP using the fade strategy?

The fade can work on NFP, but the slippage and spread conditions make it significantly higher risk than tradable events like PMI or PPI. If you must trade NFP, use a lower position size (0.2% risk instead of 0.5%) and widen your stop by 50%. The fade on NFP typically occurs 15-30 minutes after the initial spike, not immediately.

How do I know when the initial spike is finished and the fade is starting?

Look for the first 5-minute candle that does NOT make a new high (for a bull spike) or new low (for a bear spike) after the initial explosion. That is the exhaustion signal. From there, draw your Fibonacci and wait for the retracement to enter the 50-61.8% zone.

What if the fade doesn't happen? Price keeps going.

Then the trade never triggers, and you stay flat. A failed fade setup is not a losing trade — it is a non-event. The system produces 3-5 setups per month, with a ~65% win rate on properly filtered entries. The 35% that do not trigger are just days where the market did not give the setup — no capital was at risk.

How do I manage the trade after entry?

Close 50% at TP1 (the spike high or low). Trail the remaining stop to each new structural swing point on H1. Never move your stop to breakeven unless you have taken a partial. The second target should be the next external liquidity pool on the 4H or Daily chart.

Why is the 61.8% Fibonacci level so significant for news fades?

The 61.8% retracement is a self-fulfilling prophecy in forex because most algorithmic trading systems and institutional desks place limit orders at this level. When a news spike of 40 pips retraces to the 61.8%, it is typically because profit-taking from the spike hits a critical mass where the cost of holding against the retracement exceeds the expected further gain.

Does this strategy work on all currency pairs?

It works best on liquid majors (EURUSD, GBPUSD, USDJPY) and XAUUSD. Avoid exotic pairs (USDTRY, USDZAR) — their spreads during news can exceed 50 pips, making the fade mathematically unprofitable regardless of the setup quality. See Section 6 for correlation pair selection.

How do I practice this without real money?

Forward-test on a demo account using the economic calendar to identify tradable events each week. Mark every news spike on your chart for 4 weeks. Count how many fades would have triggered, how many would have won, and how many would have been non-events. This builds the screen time that turns the template into intuition.

Build Your News Trading EA

The NewsFadeEA above is a modular starting point. Need a fully custom-built EA with advanced news filtering, multi-pair correlation, and prop-firm compliance? We build production-grade MQL5 Expert Advisors with walk-forward validation and full source code.

Get a Fixed-Price Quote