Scalping Trading Strategy: Fast In-and-Out Trades in Forex, Stocks and Crypto
Scalping is not a chart style — it is a microstructure and latency game. At holding periods of seconds to minutes, your PnL is dominated by the bid-ask spread you capture or pay, the adverse selection on your fills, exchange fees, and queue position. Signal alpha is a rounding error next to execution quality. The honest framing for a professional audience: discretionary retail scalping is structurally a negative-expectancy activity, and the version with edge is a low-latency market-making operation that requires infrastructure most participants do not have.
This guide treats scalping as what it actually is: a bet about market microstructure — spread capture versus adverse selection — settled on a breakeven equation that is brutally unforgiving.
The breakeven equation is the strategy
Everything reduces to one inequality. Per-trade expectancy in cost units:
E = p * G - (1 - p) * L - c
where p is win rate, G and L are average gross win/loss, and c is round-trip cost (spread crossed + fees + slippage). When your target and stop are both a handful of ticks, c is the same order of magnitude as G. That makes the required win rate hypersensitive to costs:
def breakeven_winrate(gross_win, gross_loss, cost):
"""Win rate needed for zero expectancy given symmetric-ish scalp payoffs."""
return (gross_loss + cost) / (gross_win + gross_loss)
# 4-tick target, 3-tick stop, 2-tick round-trip cost
print(breakeven_winrate(4, 3, 2)) # -> 0.714 (need 71.4% just to break even)
A 4-pip target against a 2-pip cost needs >71% wins before slippage. This is why a marginal improvement in execution — half a tick of spread, a maker rebate instead of a taker fee — is worth more than any signal you can add. The scalper's edge is on the cost side of the equation, not the p side.
Spread capture vs. adverse selection
The only durable scalping edge is earning the spread by posting passive limit orders (providing liquidity), the same economics as market making. But passive fills are not free money — they are subject to adverse selection: your resting bid gets filled precisely when an informed seller knows price is about to drop, so you are systematically filled on the wrong side. Net edge is:
edge_per_fill = half_spread + maker_rebate - adverse_selection - inventory_cost
When adverseselection > halfspread + rebate, posting liquidity loses money. This is the central tension of market making: you are paid the spread to warehouse risk and to be the counterparty to informed flow. Estimating adverse selection requires measuring the markout — where mid-price is 1s, 5s, 30s after your fill:
import pandas as pd
def markout_pnl(fills, mid, horizons=(1, 5, 30)):
"""fills: DataFrame[time, side(+1 buy/-1 sell), price]; mid: time-indexed mid.
Positive markout = your fills are well-selected; negative = adverse selection."""
out = {}
for h in horizons:
future_mid = mid.reindex(fills["time"] + pd.Timedelta(seconds=h),
method="ffill").values
# signed PnL relative to fill price, in price units
out[f"markout_{h}s"] = (fills["side"].values *
(future_mid - fills["price"].values)).mean()
return pd.Series(out)
If your markouts are negative at every horizon, you are the liquidity being picked off and no stop-loss discipline will fix it — the problem is fill quality, not risk management. Order-flow signals like order-flow imbalance are the only features with predictive power at this horizon, and even they decay in milliseconds and are arbitraged by faster participants.
Why it's infeasible without infrastructure
Crossing the spread (taker) at scalping frequency is mathematically doomed for the reasons above, so you must post. But posting profitably requires:
| Requirement | Why it's needed | Retail reality |
|---|---|---|
| Low latency to matching engine | queue priority on cancels/replaces | 10–100ms+ via retail API |
| Maker rebates / raw-spread access | flip fees to credits | most retail pays taker |
| Real-time book + tick feed | model queue and adverse selection | delayed/aggregated data |
| Co-location or near-exchange host | avoid being last in queue | home connection |
| Inventory hedging | neutralize accumulated delta | manual, slow |
Without these, you are competing for the spread against participants who see the book sooner, cancel faster, and pay negative fees. This is the domain of high-frequency trading, and the structural conclusion is that manual scalping is a tax retail pays to firms with better plumbing. That is not a motivational warning — it is the microstructure arithmetic.
Forex, stocks, crypto: same equation, different costs
- Forex majors (EUR/USD) have the tightest spreads, but the
London–NY overlap window is where depth is real; outside it, effective spread widens and the breakeven win rate climbs out of reach. ECN/raw-spread accounts are non-negotiable.
- US equities carry the PDT $25k constraint and a fragmented order book where
payment-for-order-flow routing means your "free" retail fill embeds a cost. VWAP-reversion and opening-range scalps are short-horizon mean reversion and breakout bets respectively — opposite regimes, so mixing them without a regime rule is incoherent.
- Crypto perps charge 0.02–0.1% taker per side. On a 0.05% gross target, a
taker round trip can be a 30%+ haircut before slippage; maker (post-only) orders flip fees to rebates on many venues and are the only way the math closes. The cost is fill uncertainty — a limit that never fills earns nothing — plus 8-hour funding on anything held.
def crypto_scalp_net(notional, gross_bps, taker_bps=5, maker_bps=-1, maker_fill=0.6):
"""Expected net edge per trade mixing maker (rebate) and taker fills, in $."""
gross = notional * gross_bps / 1e4
cost_taker = 2 * notional * taker_bps / 1e4
cost_maker = 2 * notional * maker_bps / 1e4 # negative = rebate
blended_cost = maker_fill * cost_maker + (1 - maker_fill) * cost_taker
return gross - blended_cost
# $10k notional, 5bps gross target, 60% of fills as maker
print(crypto_scalp_net(10_000, 5)) # sensitive to maker_fill assumption
What breaks live
Backtests of scalping lie more than any other strategy because the things that matter — queue position, partial fills, latency, and the live spread — are exactly what daily-bar or even minute-bar data omit. To be credible you need historical bid/ask (not last trade), a queue model, conservative partial-fill and latency assumptions, and markout-based adverse-selection estimates. A useful falsification test: if your backtest assumes a 0.5-pip spread and your broker routinely gives you 1.5, the backtest is fiction. Model it with proper transaction cost analysis and the microstructure-aware tooling discussed in building a trading bot and live trading deployment.
Risk rules that actually bind
Because the edge (if any) only emerges over thousands of repetitions, survival and consistency dominate:
- Hard daily loss limit. Tilt degrades reaction time, which degrades fills,
which inverts the breakeven math — a measurable feedback loop, not a platitude.
- Size for the cost-adjusted distribution, not the gross target. See
position sizing and risk of ruin — high trade counts compress the time to ruin if expectancy is even slightly negative.
- Never scalp illiquid books. If the spread alone exceeds your target, there
is no game to play.
Conclusion
Scalping is a microstructure and latency contest, not a setup library. The breakeven win rate is set by costs, the only durable edge is earning spread under adverse selection, and capturing that edge requires infrastructure — low latency, maker rebates, real book data — that defines high-frequency and market-making shops rather than manual traders. If you cannot measure your markouts and post passively with queue priority, the honest expectation is negative after costs. For most participants, slower horizons with forgiving cost structures — trend following or mean reversion — are where retrievable edge actually lives.
