Page 1 of 2
How news weeks change my broker cost rankings
Posted: Mon Sep 14, 2026 7:16 pm
by LondonScalper
Broker cost rankings are not static -- news weeks scramble them.
In quiet mid-week London, one venue can look cheapest on my majors. In a CPI or NFP week, the ranking that matters is
fill quality under stress, not the marketing spread screenshot from Tuesday.
What I re-rank on event weeks
- Rejects in the +/-5 minutes around tier-1 prints
- Slippage distribution (not just the average)
- Whether I could flatten on the phone/app if the desktop platform hiccupped
- Symbol behaviour on XAU vs EUR -- they do not always degrade together
I keep a separate tab: "stress week" vs "normal week." Mixing them made me defend a broker that was fine for grind sessions and expensive when it mattered.
I am not hunting perfection. I am deciding whether my usual ticket type (market vs limit) and size still make sense when the calendar is red.
How do you adjust cost comparisons when the week is packed with data -- different size, different venue, or simply fewer trades?
Re: How news weeks change my broker cost rankings
Posted: Sun Sep 20, 2026 12:32 am
by PropScalpDesk
News weeks reorder broker rankings
Quiet weeks hide sins. CPI and FOMC weeks expose them: slippage tails, rejects, widened spreads exactly when you wanted precision — or exactly when you should have been flat.
I keep two ranking lenses on purpose:
- Baseline costs in normal European mornings.
- Event-week costs at the blackout borders and in the first minutes after a release if you trade them at all — I usually do not.
A broker that looks cheap on a quiet Tuesday can be expensive on a red-folder Wednesday. My scorecard weights event tails even if I am flat through the print, because pending-order behaviour and reopen quality still matter when the desk comes back. Rankings without a news-week column are incomplete for scalpers.
I also freeze broker changes during heavy event weeks unless there is an outage. Switching books into CPI or FOMC adds a second experiment on top of the calendar. One variable at a time is enough for a full-time desk.
Do you ban trading the release entirely, or trade the edges with a separate, harsher cost filter written before the week starts?
Re: How news weeks change my broker cost rankings
Posted: Fri Sep 25, 2026 9:02 am
by FTtrader
LondonScalper wrote: Mon Sep 14, 2026 7:16 pm
Broker cost rankings are not static -- news weeks scramble them.
In quiet mid-week London, one venue can look cheapest on my majors. In a CPI or NFP week, the ranking that matters is
fill quality under stress, not the marketing spread screenshot from Tuesday.
What I re-rank on event weeks
- Rejects in the +/-5 minutes around tier-1 prints
- Slippage distribution (not just the average)
- Whether I could flatten on the phone/app if the desktop platform hiccupped
- Symbol behaviour on XAU vs EUR -- they do not always degrade together
I keep a separate tab: "stress week" vs "normal week." Mixing them made me defend a broker that was fine for grind sessions and expensive when it mattered.
I am not hunting perfection. I am deciding whether my usual ticket type (market vs limit) and size still make sense when the calendar is red.
How do you adjust cost comparisons when the week is packed with data -- different size, different venue, or simply fewer trades?
Hi LondonScalper,
When the economic calendar is packed with Tier-1 data, baseline cost metrics like average spread and standard commissions become irrelevant. The true cost of trading shifts entirely to execution quality, liquidity depth, and platform stability.
Here is how you adjust cost comparisons and execution tactics when moving from a "normal week" to a "stress week" regime.
1. Volatility-Adjusted Sizing (Halve Size, Double Stop)
During major prints like CPI or NFP, liquidity pools thin out milliseconds before the release. This causes spreads to widen dramatically and price to jump gaps rather than tick sequentially. To survive this, cut your position size by 50% and double the width of your stop loss. Your absolute dollar risk remains identical, but you gain the breathing room necessary to absorb the inevitable spread widening and algorithmic wicks without being prematurely stopped out.
2. Venue Segmentation (ECN vs. Market Maker)
The broker offering "zero commissions and tight spreads" on a quiet Tuesday is almost certainly internalizing orders. During a Friday NFP drop, they will protect themselves by widening spreads to 10+ pips or outright rejecting market orders.
Stress Weeks: Route orders through a true ECN (Electronic Communication Network) or DMA (Direct Market Access) broker. Paying a $3 to $5 per lot commission is mathematically cheaper than absorbing 6 pips of slippage on a "commission-free" market maker platform.
Normal Weeks: The zero-commission market maker is perfectly fine for grinding out smaller moves in thick, quiet liquidity.
Re: How news weeks change my broker cost rankings
Posted: Fri Sep 25, 2026 9:03 am
by FTtrader
3. Hard Order-Type Filters
A market order during a Tier-1 print is essentially a blank check written to your broker's liquidity providers.
Transition entirely to Limit Orders or Stop-Limit Orders during stress weeks.
If you must enter momentum, use marketable limit orders (limit orders priced a few pips beyond the current market). If liquidity evaporates and the price gaps 20 pips, your order is safely rejected or held rather than filled at a catastrophic price.
4. Time-Based Liquidity Blackouts
The easiest way to minimize execution costs during event weeks is to refuse to pay them. Implement a strict blackout window—typically 5 minutes before the print until 10 to 15 minutes after. This allows the high-frequency algorithms to process the liquidity vacuum, the spread to normalize, and the true directional trend to establish itself before you pay the spread.
Re: How news weeks change my broker cost rankings
Posted: Fri Sep 25, 2026 9:03 am
by FTtrader
Pine Script: Tier-1 Event Stress & Slippage Proxy
TradingView does not natively track historical broker spreads, but we can build a proxy for execution stress. This Pine Script v5 indicator highlights your defined Tier-1 data windows (e.g., 08:25 to 08:45 AM New York time) and flags moments where the immediate price range severely outpaces normal volatility—a primary indicator that liquidity has thinned and slippage risk is critical.
Code: Select all
//@version=5
indicator("Tier-1 Event Stress & Slippage Proxy", overlay=true)
// =========================================================================
// INPUTS
// =========================================================================
eventTime = input.session("08:25-08:45", title="Tier-1 Event Window")
tz = input.string("America/New_York", title="Exchange/Event Timezone")
stressMult = input.float(2.5, title="Stress Multiplier (Current Range vs ATR)", step=0.1)
atrLength = input.int(14, title="ATR Length for Baseline Volatility")
// =========================================================================
// LOGIC: EVENT WINDOW & STRESS DETECTION
// =========================================================================
// Check if current bar falls within the user-defined news window
inEventWindow = time(timeframe.period, eventTime, tz)
// Proxy for spread/slippage risk: Current bar range vs Baseline ATR
// When the immediate high-low range explodes relative to the recent average,
// the order book is thin. Market orders here equal maximum slippage.
barRange = high - low
normalAtr = ta.atr(atrLength)
// Identify if the current bar represents an abnormal liquidity vacuum
isStressSpike = barRange > (normalAtr * stressMult)
// =========================================================================
// VISUALIZATION
// =========================================================================
// 1. Paint the background during the event window (Visualizing the "Stress Week" zone)
bgcolor(inEventWindow ? color.new(color.maroon, 85) : na, title="Event Window Background")
// 2. Flag extreme stress/slippage risk bars inside the window
plotshape(isStressSpike and inEventWindow,
style=shape.xcross,
location=location.abovebar,
color=color.red,
size=size.small,
title="Extreme Slippage Danger")
// 3. Optional: Alert condition for algorithmic triggers
alertcondition(isStressSpike and inEventWindow, title="Slippage Danger Alert", message="High volatility in event window. Adjust size and avoid market orders.")
Re: How news weeks change my broker cost rankings
Posted: Fri Sep 25, 2026 9:03 am
by FTtrader
How to use this script:
1.) Apply it to a low timeframe chart (1m or 5m) on your primary pairs (XAUUSD, EURUSD).
2.) Adjust the Tier-1 Event Window to match the calendar (e.g., 08:30 CPI drops).
3.) The script paints the chart background during the event window, visually separating "stress" conditions from "normal" conditions.
4.) When a red cross appears above the bar, the script is detecting a volatility spike that typically correlates with a cleared-out order book. This is your visual cue that market execution costs will heavily penalize you.
Re: How news weeks change my broker cost rankings
Posted: Fri Sep 25, 2026 9:04 am
by FTtrader
Unlike TradingView (which converts timezones automatically via IANA strings), MetaTrader 4 and MetaTrader 5 calculate all intraday bar times according to your broker's server time (typically UTC+2 or UTC+3). When setting the event window in the scripts below, input the hour and minute corresponding to your broker’s server clock.
MQL5 Implementation (EventStressProxy.mq5)
Save this file in your terminal's MQL5/Indicators/ directory and compile it via MetaEditor.
Code: Select all
//+------------------------------------------------------------------+
//| EventStressProxy.mq5 |
//| Liquidity Vacuum & Execution Proxy |
//+------------------------------------------------------------------+
#property copyright "Trading Risk & Liquidity Proxy"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
#property indicator_label1 "Slippage Danger"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrRed
#property indicator_width1 2
//--- Inputs
input group "=== Event Window (Broker Server Time) ==="
input int InpStartHour = 15; // Window Start Hour (e.g. 15 for 15:25)
input int InpStartMinute = 25; // Window Start Minute
input int InpEndHour = 15; // Window End Hour (e.g. 15 for 15:45)
input int InpEndMinute = 45; // Window End Minute
input group "=== Volatility Stress Parameters ==="
input int InpAtrPeriod = 14; // Baseline ATR Period
input double InpStressMult = 2.5; // Stress Multiplier (Bar Range vs ATR)
input bool InpDrawZones = true; // Draw Event Background Zones
input color InpZoneColor = clrMistyRose; // Zone Shading Color
input bool InpSendAlerts = true; // Enable Terminal Alerts
//--- Buffers & Handles
double StressBuffer[];
int atrHandle;
datetime lastAlertTime = 0;
const string PREFIX = "EventStress_";
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
SetIndexBuffer(0, StressBuffer, INDICATOR_DATA);
PlotIndexSetInteger(0, PLOT_ARROW, 251); // Wingdings cross / X mark
PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);
atrHandle = iATR(_Symbol, _Period, InpAtrPeriod);
if(atrHandle == INVALID_HANDLE)
{
Print("Failed to create ATR handle.");
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ObjectsDeleteAll(0, PREFIX);
ChartRedraw(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
if(rates_total < InpAtrPeriod + 1) return(0);
int limit = prev_calculated > 0 ? prev_calculated - 1 : InpAtrPeriod;
double atrValues[];
ArraySetAsSeries(atrValues, false);
if(CopyBuffer(atrHandle, 0, 0, rates_total, atrValues) <= 0) return(0);
MqlDateTime dt;
for(int i = limit; i < rates_total; i++)
{
StressBuffer[i] = 0.0;
TimeToStruct(time[i], dt);
int currentMins = dt.hour * 60 + dt.min;
int startMins = InpStartHour * 60 + InpStartMinute;
int endMins = InpEndHour * 60 + InpEndMinute;
bool inEventWindow = (currentMins >= startMins && currentMins <= endMins);
// Draw background shading zone per day during event window
if(InpDrawZones && inEventWindow)
{
string objName = PREFIX + TimeToString(time[i], TIME_DATE) + "_" + IntegerToString(startMins);
if(ObjectFind(0, objName) < 0)
{
datetime zoneStart = time[i];
datetime zoneEnd = zoneStart + ((endMins - startMins) * 60);
ObjectCreate(0, objName, OBJ_RECTANGLE, 0, zoneStart, 0, zoneEnd, 0);
ObjectSetInteger(0, objName, OBJPROP_COLOR, InpZoneColor);
ObjectSetInteger(0, objName, OBJPROP_FILL, true);
ObjectSetInteger(0, objName, OBJPROP_BACK, true);
ObjectSetDouble(0, objName, OBJPROP_PRICE, 0, 0);
ObjectSetDouble(0, objName, OBJPROP_PRICE, 1, 200000);
}
}
// Check volatility stress ratio
double barRange = high[i] - low[i];
double baselineAtr = atrValues[i];
if(inEventWindow && (barRange > (baselineAtr * InpStressMult)))
{
StressBuffer[i] = high[i] + (baselineAtr * 0.5);
// Terminal Alert for the live forming bar
if(InpSendAlerts && i == rates_total - 1 && time[i] != lastAlertTime)
{
Alert(StringFormat("[%s] Slippage Danger: High volatility detected inside Tier-1 Event window!", _Symbol));
lastAlertTime = time[i];
}
}
}
return(rates_total);
}
Re: How news weeks change my broker cost rankings
Posted: Fri Sep 25, 2026 9:04 am
by FTtrader
MQL4 Implementation (EventStressProxy.mq4)
Save this file in your terminal's MQL4/Indicators/ directory and compile it via MetaEditor.
Code: Select all
//+------------------------------------------------------------------+
//| EventStressProxy.mq4 |
//| Liquidity Vacuum & Execution Proxy |
//+------------------------------------------------------------------+
#property copyright "Trading Risk & Liquidity Proxy"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 clrRed
#property indicator_width1 2
//--- Inputs
extern string EventSettings = "=== Event Window (Broker Server Time) ===";
extern int InpStartHour = 15; // Window Start Hour (e.g. 15 for 15:25)
extern int InpStartMinute = 25; // Window Start Minute
extern int InpEndHour = 15; // Window End Hour (e.g. 15 for 15:45)
extern int InpEndMinute = 45; // Window End Minute
extern string StressSettings = "=== Volatility Stress Parameters ===";
extern int InpAtrPeriod = 14; // Baseline ATR Period
extern double InpStressMult = 2.5; // Stress Multiplier (Bar Range vs ATR)
extern bool InpDrawZones = true; // Draw Event Background Zones
extern color InpZoneColor = clrMistyRose; // Zone Shading Color
extern bool InpSendAlerts = true; // Enable Terminal Alerts
//--- Buffers
double StressBuffer[];
datetime lastAlertTime = 0;
const string PREFIX = "EventStress_";
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
SetIndexBuffer(0, StressBuffer);
SetIndexStyle(0, DRAW_ARROW, EMPTY, 2, clrRed);
SetIndexArrow(0, 251); // Wingdings cross / X mark
SetIndexEmptyValue(0, 0.0);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ObjectsDeleteAll(0, PREFIX);
ChartRedraw();
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
if(rates_total < InpAtrPeriod + 1) return(0);
int limit = rates_total - prev_calculated;
if(prev_calculated > 0) limit++;
MqlDateTime dt;
for(int i = limit; i >= 0; i--)
{
StressBuffer[i] = 0.0;
TimeToStruct(Time[i], dt);
int currentMins = dt.hour * 60 + dt.min;
int startMins = InpStartHour * 60 + InpStartMinute;
int endMins = InpEndHour * 60 + InpEndMinute;
bool inEventWindow = (currentMins >= startMins && currentMins <= endMins);
// Draw background shading zone per day during event window
if(InpDrawZones && inEventWindow)
{
string objName = PREFIX + TimeToStr(Time[i], TIME_DATE) + "_" + IntegerToString(startMins);
if(ObjectFind(0, objName) < 0)
{
datetime zoneStart = Time[i];
datetime zoneEnd = zoneStart + ((endMins - startMins) * 60);
ObjectCreate(0, objName, OBJ_RECTANGLE, 0, zoneStart, 0, zoneEnd, 0);
ObjectSetInteger(0, objName, OBJPROP_COLOR, InpZoneColor);
ObjectSetInteger(0, objName, OBJPROP_BACK, true);
ObjectSetDouble(0, objName, OBJPROP_PRICE1, 0.0);
ObjectSetDouble(0, objName, OBJPROP_PRICE2, 200000.0);
}
}
// Check volatility stress ratio
double barRange = High[i] - Low[i];
double baselineAtr = iATR(NULL, 0, InpAtrPeriod, i);
if(inEventWindow && (barRange > (baselineAtr * InpStressMult)))
{
StressBuffer[i] = High[i] + (baselineAtr * 0.5);
// Terminal Alert for the live forming bar
if(InpSendAlerts && i == 0 && Time[0] != lastAlertTime)
{
Alert(StringFormat("[%s] Slippage Danger: High volatility detected inside Tier-1 Event window!", Symbol()));
lastAlertTime = Time[0];
}
}
}
return(rates_total);
}
Re: How news weeks change my broker cost rankings
Posted: Fri Sep 25, 2026 9:05 am
by FTtrader
MetaTrader Execution Settings for Event Weeks
When migrating from normal to stress market regimes inside MT4/MT5, configure your order routing parameters:
Max Deviation Control (Slippage Cap):
By default, a standard Market Execution order in MT4/MT5 accepts fills at any available price.
If using market tickets or automated scripts, enforce a strict deviation parameter in OrderSend() (MT4) or trade.SetDeviationInPoints(points) (MT5 CTrade). If the book gaps past this threshold, the terminal rejects the order rather than filling 15 pips offside.
Order Type Transitions:
Replace ORDER_TYPE_BUY and ORDER_TYPE_SELL with ORDER_TYPE_BUY_LIMIT and ORDER_TYPE_SELL_LIMIT.
In MT5, limit orders execute as Fill or Kill (FOK) or Immediate or Cancel (IOC) depending on the venue policy, eliminating unmonitored pending exposure if the book flash-moves through your level.
Re: How news weeks change my broker cost rankings
Posted: Mon Sep 28, 2026 6:43 pm
by LondonScalper
Halving size and doubling the stop keeps the cash risk the same, but it doesn't keep the trade the same. A stop twice as far away needs a target twice as far away to hold the R, and on a scalp that's often a target the event morning won't deliver before the next print. I'd rather skip the ticket than stretch it.
On venues I agree with the direction but would test the claim rather than assume it from the label. In my own logs the difference in stress weeks showed up in the reject count and the fill delay, not in the headline spread. One broker I rated well on quiet Tuesdays was fine on rejects and poor on the gap between click and fill during CPI. That only appeared once I split the samples by event days.
The blackout I run is similar but lopsided: two minutes before, fifteen after for US data, longer for anything with a press conference.