From my point of view its ic markets, as you can see as ad as well.
I have used them for more than 6 years and im satisfied
Low spreads, very fast execution. Allmost no slippage.
Spot on. You are looking at the exact right metrics, but the rabbit hole goes even deeper. The advertised spread is just a marketing wrapper—what truly dictates the survivability of a scalping strategy are the underlying market mechanics.LondonScalper wrote: Sun Sep 06, 2026 8:53 am For scalping I care less about “lowest advertised spread” and more about **spread at my hours + slippage on exits**.
What I measure once a week (same pair, same session):
- Open vs midday EURUSD / GBPUSD average spread
- Slippage on 5–10 market exits (demo isn’t enough — small live size)
- Whether commission + spread beats “raw” after rebate math
A 0.0 pip banner with 0.4 reality in the first hour is worse than an honest 0.2 all day.
Anyone logging spreads in a sheet, or just gut feel?
Which pair/session combo is your real cost benchmark — not the marketing screenshot?
That’s the triad that actually matters. Advertised 0.0 is theatre if fills arrive late, depth is thin, or rejects spike when the tape runs.PTScalper wrote:The advertised spread is just a marketing wrapper... Execution Speed... Bid/Ask Liquidity (Order Book Depth)
Hi LondonScalper,LondonScalper wrote: Thu Sep 10, 2026 7:19 pmThat’s the triad that actually matters. Advertised 0.0 is theatre if fills arrive late, depth is thin, or rejects spike when the tape runs.PTScalper wrote:The advertised spread is just a marketing wrapper... Execution Speed... Bid/Ask Liquidity (Order Book Depth)
What I measure before trusting size on a venue:I won’t name-drop an IB link here — different desks, different routes. Log your own fills for a few weeks and demote anything whose p95 costs eat the setup. Marketing PDFs don’t pay slippage.
- All-in cost: spread paid + commission + adverse slippage (by session)
- Reject / requote rate on market and on SL modify
- Behaviour in the first minutes of London and into US data
- Depth / freeze-level behaviour on the pairs you actually scalp
Correct — 0.0 without depth and without commission in the all-in number is a brochure, not a cost model.PTScalper wrote:0.0 pip spread can be true, because it can be on ECN and for 0 spread there is like 1-5 lots liquidity available depends on currency pair + you have to add commisions
This is the triad I care about too: spread in my window, execution speed, and depth when the tape runs. Advertised 0.0 is theatre if rejects spike at London open or exits slip while entries looked fine.PTScalper wrote:For scalping I care less about lowest advertised spread and more about spread at my hours + slippage on exits.
Code: Select all
//@version=5
indicator("Broker Real Cost Calculator", overlay=true)
// --- Inputs ---
tradeQty = input.float(100, title="Trade Quantity (Shares/Contracts/Lots)")
commPerUnit = input.float(0.005, title="Commission per Unit (Round Trip)")
fixedTicketFee = input.float(0.0, title="Fixed Ticket Fee (Round Trip)")
avgSpreadTicks = input.float(1.0, title="Average Spread (in Ticks)")
estSlippageTicks = input.float(1.0, title="Estimated Slippage (in Ticks)")
// --- Calculations ---
// Calculate the value of a single tick in the account currency
tickVal = syminfo.mintick * syminfo.pointvalue
// 1. Commission Cost
totalComm = (commPerUnit * tradeQty) + fixedTicketFee
// 2. Spread Cost (Crossing the spread to enter and exit)
// Paying the spread once represents a full round trip (buy at ask, sell at bid)
spreadCost = avgSpreadTicks * tickVal * tradeQty
// 3. Slippage Cost (Round trip slippage)
slippageCost = estSlippageTicks * tickVal * tradeQty
// Total Real Cost
totalCost = totalComm + spreadCost + slippageCost
// --- Display Table ---
var table costTable = table.new(position.bottom_right, 2, 5, border_width = 1, border_color = color.new(color.black, 50))
currencyStr = " " + syminfo.currency
if barstate.islast
// Headers
table.cell(costTable, 0, 0, "Cost Component", text_color=color.white, bgcolor=color.gray, text_halign=text.align_left)
table.cell(costTable, 1, 0, "Amount", text_color=color.white, bgcolor=color.gray, text_halign=text.align_right)
// Commission
table.cell(costTable, 0, 1, "Commission & Fees", text_color=color.white, bgcolor=color.navy, text_halign=text.align_left)
table.cell(costTable, 1, 1, str.tostring(totalComm, "#.##") + currencyStr, text_color=color.white, bgcolor=color.navy, text_halign=text.align_right)
// Spread
table.cell(costTable, 0, 2, "Spread Cost", text_color=color.white, bgcolor=color.maroon, text_halign=text.align_left)
table.cell(costTable, 1, 2, str.tostring(spreadCost, "#.##") + currencyStr, text_color=color.white, bgcolor=color.maroon, text_halign=text.align_right)
// Slippage
table.cell(costTable, 0, 3, "Estimated Slippage", text_color=color.white, bgcolor=color.olive, text_halign=text.align_left)
table.cell(costTable, 1, 3, str.tostring(slippageCost, "#.##") + currencyStr, text_color=color.white, bgcolor=color.olive, text_halign=text.align_right)
// Total
table.cell(costTable, 0, 4, "Total Real Cost (Round Trip)", text_color=color.white, bgcolor=color.teal, text_halign=text.align_left)
table.cell(costTable, 1, 4, str.tostring(totalCost, "#.##") + currencyStr, text_color=color.white, bgcolor=color.teal, text_halign=text.align_right)Code: Select all
//@version=5
indicator("Pro Trade Execution Cost & Breakeven", overlay=true)
// =========================================================================
// INPUT GROUPS & SETTINGS
// =========================================================================
grp_trade = "1. Trade Parameters"
qty = input.float(100, title="Position Size (Qty)", group=grp_trade, tooltip="Total shares, contracts, or coins.")
grp_fees = "2. Fee Structure"
feeType = input.string("Per Unit", title="Commission Type", options=["Per Unit", "Percentage (%)"], group=grp_fees)
feeVal = input.float(0.005, title="Fee Rate (Round Trip)", group=grp_fees, tooltip="If 'Per Unit', enter $ amount per contract/share. If 'Percentage', enter % (e.g., 0.1 for 0.1%).")
fixedFee = input.float(0.0, title="Fixed Ticket Fee", group=grp_fees, tooltip="Flat fee charged per order regardless of size.")
grp_mkt = "3. Market Impact"
spread = input.float(1.0, title="Average Spread (Ticks)", group=grp_mkt, step=0.5, tooltip="The distance between Bid and Ask in ticks/pips.")
slippage = input.float(1.0, title="Est. Slippage Per Side (Ticks)", group=grp_mkt, step=0.5, tooltip="Expected slippage on entry AND exit. Will be multiplied by 2 for round-trip.")
grp_ui = "4. UI Settings"
showTable = input.bool(true, title="Show Cost Table", group=grp_ui)
tablePos = input.string("Bottom Right", title="Table Position", options=["Top Right", "Bottom Right", "Bottom Left", "Top Left"], group=grp_ui)
// =========================================================================
// CORE CALCULATIONS
// =========================================================================
// Safety check for exotic tickers where pointvalue might be missing
pointVal = syminfo.pointvalue > 0 ? syminfo.pointvalue : 1
tickVal = syminfo.mintick * pointVal
posValue = close * pointVal * qty
// 1. Commission Calculation (Round Trip)
commCost = feeType == "Per Unit" ? (feeVal * qty) + fixedFee : (posValue * (feeVal / 100)) + fixedFee
// 2. Spread Cost
// Crossing the spread once accounts for a full round trip (e.g., buy at Ask, sell at Bid)
spreadCost = spread * tickVal * qty
// 3. Slippage Cost
// Multiplied by 2 to account for slippage on both entry and exit
slipCost = (slippage * 2) * tickVal * qty
// Total Dollar Cost
totalCost = commCost + spreadCost + slipCost
// 4. Breakeven Analysis
// How many ticks the market must move in your favor just to pay for the trade
ticksToBE = totalCost / (tickVal * qty)
priceToBE = ticksToBE * syminfo.mintick
// =========================================================================
// PROFESSIONAL UI TABLE RENDERING
// =========================================================================
get_position(pos) =>
pos == "Top Right" ? position.top_right :
pos == "Bottom Right" ? position.bottom_right :
pos == "Bottom Left" ? position.bottom_left : position.top_left
var table costTable = table.new(get_position(tablePos), 2, 7, border_width = 1, border_color = color.rgb(40, 40, 40))
currencyStr = " " + syminfo.currency
// Styling variables
bg_header = color.rgb(20, 20, 20)
bg_row = color.rgb(35, 35, 35)
bg_total = color.rgb(41, 98, 255) // Institutional Blue
bg_warn = color.rgb(255, 152, 0, 20) // Subtle orange for breakeven
txt_color = color.white
if barstate.islast and showTable
// Headers
table.cell(costTable, 0, 0, "Trade Cost Analysis", text_color=txt_color, bgcolor=bg_header, text_halign=text.align_left, text_weight="bold")
table.cell(costTable, 1, 0, syminfo.ticker, text_color=txt_color, bgcolor=bg_header, text_halign=text.align_right, text_weight="bold")
// Position Value
table.cell(costTable, 0, 1, "Notional Value", text_color=color.gray, bgcolor=bg_row, text_halign=text.align_left, text_size=size.small)
table.cell(costTable, 1, 1, str.tostring(posValue, "#,###.##") + currencyStr, text_color=color.gray, bgcolor=bg_row, text_halign=text.align_right, text_size=size.small)
// Commission
table.cell(costTable, 0, 2, "Commission & Fees", text_color=txt_color, bgcolor=bg_row, text_halign=text.align_left)
table.cell(costTable, 1, 2, str.tostring(commCost, "#.##") + currencyStr, text_color=color.red, bgcolor=bg_row, text_halign=text.align_right)
// Spread
table.cell(costTable, 0, 3, "Spread Cost", text_color=txt_color, bgcolor=bg_row, text_halign=text.align_left)
table.cell(costTable, 1, 3, str.tostring(spreadCost, "#.##") + currencyStr, text_color=color.red, bgcolor=bg_row, text_halign=text.align_right)
// Slippage
table.cell(costTable, 0, 4, "Slippage (Entry + Exit)", text_color=txt_color, bgcolor=bg_row, text_halign=text.align_left)
table.cell(costTable, 1, 4, str.tostring(slipCost, "#.##") + currencyStr, text_color=color.red, bgcolor=bg_row, text_halign=text.align_right)
// Total Cost
table.cell(costTable, 0, 5, "Total Overhead Cost", text_color=txt_color, bgcolor=bg_total, text_halign=text.align_left, text_weight="bold")
table.cell(costTable, 1, 5, str.tostring(totalCost, "#.##") + currencyStr, text_color=txt_color, bgcolor=bg_total, text_halign=text.align_right, text_weight="bold")
// Breakeven Analysis (The "Pro" Feature)
table.cell(costTable, 0, 6, "Ticks to Breakeven", text_color=color.orange, bgcolor=bg_warn, text_halign=text.align_left, text_weight="bold")
table.cell(costTable, 1, 6, str.tostring(ticksToBE, "#.##") + " Ticks", text_color=color.orange, bgcolor=bg_warn, text_halign=text.align_right, text_weight="bold")