Automation Gotchas

When Fees Eat Your Signals: A Daily Cap Formula

2026-09-15·6 min read

You run the backtest on your signal and it's a green wall — 60% annualized, 48% win rate, 1.4 average R/R. You wire it up to a webhook (the pipe that ships TradingView alerts to your own execution server), flip on auto-trading, and after one week of real money the account sits at -3%. You open the statement and see a long list of tiny debits that add up to more than any single winning trade — your fees just outran your strategy.

Nobody warns you up front: a manual trader takes 3–5 setups a day; a bot can take 50. Same strategy, 10× the frequency, 10× the fees — and your backtest almost never accounts for it.

Bottom line up front
Your fee rate isn't a constant — it's a threshold. If your strategy's average per-trade PnL (losing trades included) isn't comfortably above one round-trip in fees, firing more signals just deepens the hole. This piece drops fees, average edge, and frequency into a single formula.

Manual Traders Avoid This Trap; Bots Walk Right Into It

A busy manual daytrader does 3–5 setups a day. At a 0.1% spot taker rate, that's under 2% a week going to fees — still inside most retail traders' pain threshold.

Bots are a different animal. One TradingView alert fires one webhook, and 30–50 alerts a day is normal. At the same 0.1% taker, that's 21%–35% a week bleeding straight to fees. That isn't "a bit of extra cost" — it flattens the entire equity curve.

3–5 / day
Typical manual daytrader frequency
30–50 / day
Typical bot frequency with no cooldown
×10
The fee gap the same strategy pays

The Fee You Pay Isn't One Number — It Has at Least Three Layers

Confirm which layer you're looking at first. Mixing numbers from different layers gives you the wrong answer — this is the most common calculation mistake.

SpotPerpetual
Typical base rate (VIP 0)taker ~0.08–0.10%taker ~0.04–0.06%
Maker discountusually less than halfusually less than half, occasionally negative
Funding rate?NoEvery 1–8 hours, depending on the contract
VIP tier basis30-day volume30-day volume

The actual numbers in every one of those layers should come from your exchange's current fee page — for a per-exchange breakdown, see the deep crypto exchange comparison. Perpetuals add one more layer — funding — which strategies that scalp in and out over minutes usually never pay, so we're parking it here for the piece on longer holds.

A snapshot, not a permanent guarantee
The ranges above are what I saw checking each exchange's public fee page in early August 2026. VIP tiers, listing promos and fee campaigns will move the real number you pay. Check yours again before you go live — not every exchange puts every rate on the same page.

One Formula That Answers "How Many Signals a Day"

Pin down the notation first. Let e be your strategy's average per-trade PnL (losers included, expressed as a percentage of position size), and let f be the one-way fee rate you actually pay. Each trade opens once and closes once, so you pay the fee twice:

text
per-trade net PnL = e - 2f
        daily net PnL     = N × (e - 2f)     ← N is the number of signals per day

This formula has two consequences. First: if e ≤ 2f, no value of N helps. Your strategy's average PnL already can't clear the round-trip fee, so firing more just loses more.

Second: if e is only marginally above 2f, slippage will eat the remainder. Backtests fill at the close; real taker fills tend to come in a spread worse — that's an invisible fee, and like f you pay it on every trade.

e > 2f
Minimum bar for having an edge at all
e > 2f + spread
The real bar once slippage is in
e ≈ 4f
A reasonable starting point that leaves half a margin

Two Worked Examples

The e in the table below is treated as an input you got from your own backtest. Nothing here endorses any specific strategy — this is just showing how to plug the formula in.

Strategy backtest numbere (per trade)f (one-way fee)2f thresholdVerdict
EMA cross, 45% win rate, 1.4 R/R0.18%0.05% perp taker0.10%Net e = 0.08%, marginal edge
Same strategy, moved to 0.10% spot taker0.18%0.10% spot taker0.20%Net e = -0.02%, don't run it
RSI mean-reversion, 55% win rate, 0.9 R/R0.08%0.05% perp taker0.10%Net e = -0.02%, don't run it
Same strategy, switched to maker orders0.08%0.02% perp maker0.04%Net e = 0.04%, only works if you actually fill

Worked examples. e comes from your own backtest; f is a rough 2026 August fee range for illustration.

Rows one and two are the same strategy — just moved from perp to spot. Doubling the fee turns edge into loss. That's the point: fee rate isn't a knob you tune after the fact; it decides whether the strategy is deployable at all. Rows three and four make a different point about maker orders — whether you can actually get filled is a separate question.

Backtest numbers need a period tag
The e values above are illustrative. If you're using yours to decide, publish the backtest period, symbol, parameters and slippage assumptions alongside — that's the discipline this site holds itself to on performance numbers. See the "backtest number disclaimer" note in how to size your position.

Three Ways to Cut Frequency

If your e ends up too close to 2f, you have three directions. They're ordered here from easiest to hardest to implement.

  • Add a signal-strength filter. Only fire when the indicator meets conditions A, B and C at the same time. This tends to cut more than half your signals, and the remaining ones usually have 1–2× the average edge — because you filtered out the weak ones.
  • Add a cooldown. Block re-entry in the same direction for X minutes after a close. This kills the "open-close-open-close on the same bar or two" behavior that just feeds fees. Trivial to implement, and the effect is direct.
  • Switch to maker orders. Replace market orders with limit orders parked outside the spread, so you only fill at the maker rate. The downside: unfilled means no trade at all, and gap moves may leave you flat when you wanted in — the strategy logic has to be able to absorb that.

An Honest Note: What This Formula Doesn't Cover

This formula only accounts for the explicit fee. A few invisible costs aren't in it. Before you commit real money, know that you pay these on every trade too.

Slippage: the fill price of a market order isn't the price you saw when you clicked, especially on thinly-traded alts. That gap acts like a fee and you pay it every time.

Funding rate: perpetuals mostly settle every 8 hours (some exchanges have moved to 1 or 4 hours, contract-dependent). Short round-trips never touch it, but if your strategy holds through a funding stamp, that cost is real. See the perpetual funding-rate arbitrage guide.

API throttling and latency: the API (the interface exchanges expose for programmatic calls) rate-limits how many orders you can send per unit of time. Signals fired too densely can be rejected, or delayed into the next bar — at which point you not only miss the expected edge, you may be adversely filled. This one is strategy-design territory; the deeper discussion is in automated-strategy failover design.

This is my derivation, not something the exchanges wrote
The formula and the two conclusions above are derived from a single fact — one trade pays the fee twice — not lifted verbatim from any exchange or TradingView document. It's a tool, not a guarantee: your strategy, symbol and session may have variables it doesn't model.

FAQ

I trade with a rebate — does this formula still apply?
Yes. Substitute the net fee you actually pay for f. A rebate — where some fills return a portion of the fee — usually has campaign conditions that expire or fall short of the tier, so leave a margin on top of breakeven.
Do backtest tools include fees in the annualized return?
Not necessarily. TradingView's strategy tester lets you set Commission and Slippage in the Properties panel, but the default is zero — a green backtest is not a green live account.
Would switching to a lower-fee exchange fix it?
Formally yes, in practice not always. Lower-fee venues often have thinner books, and slippage takes back some of the discount. Before migrating, run small live sizes for a few weeks and compare fill price vs. backtest price.
How do I estimate e for maker orders?
Backtests assume every order fills at the close, which isn't what a maker order gets live. In practice, run two backtests: one all-taker, and one where the maker orders only fill 60–70% of the time — the strategy has to be profitable in both.

Get started

Ready to ship what you just learned?

TVSBot ships your Pine Script signals through to the exchange — with your own API keys (the read/write credentials exchanges require you to issue first) and risk controls you configure yourself.

Start free