I spent the last few months trying to build an arbitrage bot and ran into exactly the same issues. If there's a big price differences there's always a reason, either deposits or withdrawals are temporarily offline, or the fee for transferring or depositing is too high, or for some very small coins it can takes ages to transfer (one transfer took 6 hours, another took a whole week!). Otherwise the volume is so low that you basically lose any edge crossing the spread and trying to find enough volume to close out the transaction. I had a small number of trades that made a few pennies, but also a lot more that just sat there and didn't execute at the expected price (based on the bid and ask when my bot found the trade) forcing me to sell for a less optimal price and end up with a loss. I am still sure there's money to be made with this but it takes a lot of work and you would have to search across a lot of coins and a lot of exchanges to find a viable option. Most people, including some very smart people I've talked to, just assume it's pretty easy to do this but if it was everyone would be doing it. Maybe it was 3-4 years ago when crypto was much smaller and less well known, but nowadays most opportunities are exploited as soon as they exist, I suspect a lot of time by the exchanges themselves.
At least one exchange that I know of was front-running me.
I'm not saying which exchange it was as I don't want to get trouble for outing them - but it was definitely going on.
I tested this by putting in orders at times of low activity (i.e. nothing for minutes, then I'd place an order, and the best offers would be taken up by a "bid" that came in ahead of me. This could happen in theory but when it's happening as the order is received there's no realistic chance of it being anything else).
> for some very small coins it can takes ages to transfer
Why do you need to transfer between exchange?
Writing an arbitraging bot is in my bucket list of projects I'll one day work on, and to avoid trasfer times, which are ridiculous with some cryptocurrencies, the plan is to keep a balance of both sides on both exchanges.
Example: if you're arbitraging ETH/USD between exchanges A and B, you have an ETH balance on A, and a USD balance on B, and you concurrently buy/sell on both.
Then you have the problem of managing dozens of balances across as many exchanges, which is left as an exercise for the reader :)
That's the point, you can't have so many balances in so many exchanges, because, in that case, each return is going to be very small. Just to take profit on an ETH USD arbitrage, you have to have 25% of your capital in ETH and 25% USD in exchange A, and 25% ETH and 25% USD in exchange B. So, when you take advantage of the opportunity to buy ETH at low price on exchange A and to sell on exchange B, you are only earning an arbitrage profit on a 25% of your capital.
And that profit become less and less if you divide your capital into more coins and more exchanges.