Advertisement IC Markets

How news weeks change my broker cost rankings

Discuss 1-minute to 15-minute price action setups, fading intraday momentum, key support/resistance zones, and proven short-term trading methodologies.
Post Reply
LondonScalper
Posts: 770
Joined: Sat Sep 05, 2026 7:54 am

How news weeks change my broker cost rankings

Post 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?
Recommended broker for automated trading & scalping IC Markets
PropScalpDesk
Posts: 364
Joined: Sat Sep 19, 2026 7:50 pm

Re: How news weeks change my broker cost rankings

Post 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?
FTtrader
Posts: 954
Joined: Mon Aug 03, 2026 2:43 pm

Re: How news weeks change my broker cost rankings

Post 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.
FTtrader
Posts: 954
Joined: Mon Aug 03, 2026 2:43 pm

Re: How news weeks change my broker cost rankings

Post 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.
FTtrader
Posts: 954
Joined: Mon Aug 03, 2026 2:43 pm

Re: How news weeks change my broker cost rankings

Post 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.")
FTtrader
Posts: 954
Joined: Mon Aug 03, 2026 2:43 pm

Re: How news weeks change my broker cost rankings

Post 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.
FTtrader
Posts: 954
Joined: Mon Aug 03, 2026 2:43 pm

Re: How news weeks change my broker cost rankings

Post 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);
}
FTtrader
Posts: 954
Joined: Mon Aug 03, 2026 2:43 pm

Re: How news weeks change my broker cost rankings

Post 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);
}
FTtrader
Posts: 954
Joined: Mon Aug 03, 2026 2:43 pm

Re: How news weeks change my broker cost rankings

Post 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.
LondonScalper
Posts: 770
Joined: Sat Sep 05, 2026 7:54 am

Re: How news weeks change my broker cost rankings

Post 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.
Post Reply