Fairman is right that costs change the win rate, not only the average. When I recompute my main EURUSD scalp on net fills, win rate drops about 4 points and average win shrinks, so the pretty +1.2 pip gross expectancy collapses to roughly +0.3 after spread and commission.
I measure on rolling blocks of 200 trades rather than a lifetime dump. That keeps a regime change visible instead of burying a bad quarter inside an old edge.

- img_13688_r1.png (51.1 KiB) Viewed 6 times
The illustration shows gross versus net expectancy on the same 200 trade block, with the cost line marked. Once costs sit near the gross edge, the strategy is basically a coin flip with fees.
Sample size still bites. With a per trade standard deviation around 8 pips, a few hundred trades leave a wide band around that +0.3, so I treat it as a go or no go filter rather than a precise forecast.
Do you publish expectancy to yourself in R or in pips? I switched to R last year so different pairs stay comparable after the pip value changes.