My bot placed its first live trade on 9 April. Since then it has logged more than 10,000 paper trade records and about 400 live ones, often with the same strategy running in both modes on the same day.
The short version: the market treated my live trades better than I expected. The biggest difference between paper and live wasn't the order book. It was the person with the dashboard open.
The strategy code doesn't change when a strategy goes live. It's the same function either way. But going live changed nearly everything around that code, including how I behave. These are the differences that mattered.
1. The fill is no longer yours to choose
In paper mode, my bot records a fill at the last traded price the moment the signal fires. That price is a fact about the past: someone traded there a moment ago. It isn't an offer to you.
A real buy order meets the lowest seller in the order book. On a Nifty option that can be a rupee or two above the last price on a calm morning, and much more when the market is moving fast, which is exactly when breakout strategies tend to fire. On a small target, that gap is a large share of the trade.
My log has a column called slippage, and I expected it to settle this. When I checked what it holds, it isn't execution slippage at all. It measures signal latency: how many index points the market moved between the moment a signal fired and the moment the order went out. It is recorded on paper trades as well as live ones, so it can't tell me what the order book cost me. It's a good example of a journal field that didn't mean what I assumed.
What the data does show is encouraging. I took the two strategies with the most live trades and compared their live trades with their paper trades on the same days:
| Live records | Live win rate | Paper win rate, same days | |
|---|---|---|---|
| Strategy A | 40 | 45.0% | 44.1% (34 records) |
| Strategy B | 180 | 68.3% | 66.9% (275 records) |
In both cases live won about as often as paper, and slightly more. The fill gap I braced for didn't show up in how often trades won. Two caveats keep this honest: a win rate says nothing about how much each trade made, which is where fills bite, and both strategies trade liquid contracts. On a thin contract or a fast market I'd expect fills to matter more. I just haven't measured that yet.
2. Orders can be refused
Paper mode never says no. Live trading says no in more ways than I expected:
- Market orders without market protection. Under the retail algo rules, market orders sent through Kite Connect must carry a protection value or they're rejected.
- Price bands. An order priced outside the exchange's allowed range for that contract is rejected.
- Margin. An order your account can't cover is rejected before it reaches the exchange.
- Freeze quantity. Orders above the exchange's maximum size per order must be split.
- IP and token. An order from an IP that isn't whitelisted, or with an expired access token, never leaves the building.
Each of these has to be handled in code: the bot needs to notice the rejection, record why, and decide what to do next. Paper mode will never show you any of it, which is why it's worth adding the same "would this be accepted?" checks to paper mode, so a paper trade that live trading would have refused gets flagged instead of counted.
3. Partial fills and orders that don't fill
A paper limit order either fills or it doesn't. A live limit order can fill 65 of 130 units (one lot of two) and then sit there while the price walks away. Now the bot holds a position of an odd size, with a stop and a target that were calculated for the full quantity.
A live stop-loss order can also trigger and not fill straight away if the price gaps through it. Paper mode assumes you got out at your stop. The market doesn't promise that.
4. The plumbing starts to matter
On paper, a missed login just means a gap in the log. Live, it means a position the bot may not be able to manage. Going live forced me to deal with things I had been putting off:
- The daily token. It expires at 6 AM, so the morning login has to work every single trading day. I covered that in the Kite Connect token guide.
- A static IP. Orders are only accepted from a whitelisted address, which in practice means a small cloud server rather than a laptop.
- A kill switch. One control that stops new entries and closes what's open. I've used it twice.
- A daily cap on live trades. Added in August, so a strategy that keeps firing can't run up a large number of live trades in one session.
If you're about to go live, placing your first order with the Kite Connect API walks through the order calls and a paper switch.
5. The biggest change was me
This is the one I didn't expect to see so clearly in the data.
| Paper | Live | |
|---|---|---|
| Trade records since April | 10,298 | 405 |
| Closed by hand from the dashboard | about 1% | about 8.6% |
| Average (mean) time in the trade | about 13 minutes | about 8 minutes |
| Median time in the trade | about 4 minutes | under 2 minutes |
With no money at stake, I almost never touched a paper trade. With money at stake, I closed about one live trade in twelve myself. In August it was worse: 16 of 63 live trade records that month ended with me pressing the button.
Were those manual exits good decisions? Some were. Most of them were in profit when I closed them. But a manual exit also means the trade no longer tests the strategy. It tests my nerves on that particular afternoon, and there's no way to backtest that.
Some of the shorter holding time comes from which strategies I allowed to go live, not only from me. But the direction is the same: real money made both me and my choices more impatient.
What helped:
- Deciding the exit before the entry. If the stop and target are in code, there's less to argue with in the moment.
- Logging every manual action. Every exit I make by hand is recorded with a timestamp, so I can look back at how those trades would have ended if I'd left them alone.
- Smaller size. The urge to intervene grows with the amount at risk.
6. Comparing paper and live fairly
It's tempting to put all paper trades next to all live trades and draw a conclusion. That comparison is biased from the start: the strategies I let go live are the ones that had already looked good on paper, so the live group is hand-picked.
The fair comparison is the same strategy, on the same day, in both modes. That's why every row in my log is marked paper or live, and why I never blend the two in one result.
What I'd tell myself in March
- Treat paper results as the best case, not the expected case.
- Make paper mode stricter: add the checks live trading would apply, and simulate fills at the other side of the book rather than the last price.
- Record the price you wanted and the price you got on every live trade, and check the field actually holds what you think. Mine didn't.
- Go live with the smallest size you can, one strategy at a time.
- Watch yourself as closely as the bot. In my data, the biggest difference between paper and live wasn't the market. It was the person with the dashboard open.
Earlier in the story: how I analyse my trading bot's trades.
This post describes my own experience building and running a trading system, for information only. It is not investment advice, and past results say nothing certain about the future. I am not registered with SEBI as an investment adviser or research analyst.