To elaborate on cancellation fee: As far as I could tell in IB paper trading, you will pay the order fee minimum ($1) but no additional fee will be added for cancelling it or updating it.
In general, QC data is fine for trading highly liquid assets, e.g. SPY. In that case, you can be sure that:
- A) Last price is very close to bid/ask.
- B) Bid/ask spread and thus slippage is fairly predictable.
On the other hand, if you try trading a thinly traded asset, e.g. low volume ETF, it's very easy to accidentally write bad algorithms. Beware of ImmediateFillModel in particular, some issues for thinly traded assets:
- A trade triggered by the last trade's price (but not necessarily immediately on that trade) will be filled at last trade's price, which is an issue if the last trade was a long time ago since the bid/ask spread might have moved since then! Effectively, your algo might be picking great value trades in hindsight in this manner...
- Fill price is calculated as e.g. for buy: fill.FillPrice = Math.Min(prices.High, order.LimitPrice); This fails to model a situation which will often happen where a limit order gets filled at a bad time as price moves through it, resulting in immediate slippage. On a new trade much later after the previous one, we get a new bar with new high/low in a thinly traded asset, meaning limit order gets much better prices than in reality with this fill model.
- Volume is unaccounted for. A quick to implement compromise for small orders is to ignore trades below some threshold, but requiring trades to be of same size as a large order is too draconian.
I've probably wasted more time due to my own buggy fill/slippage models than anything else when trying to create intraday algos. Even algos that trade once a day are in severe danger of being optimistic for assets that aren't the most liquid.
TL;DR: The only way you can reliably tell if a frequently trading algo is actually going to work is to run it on broker paper account ASAP.