1. reqMktData() requires you to specify a sequence number. You apparently decided to use parameter nextOrderID for this. But your code did not show whether that parameter was initialized somewhere. Which is why I asked. What number you select is not relevant (although I usually refrain from using zero as sequence number).
2. reqContractDetails() returns information in method contractDetails(). You could indeed pick up the returned contract and use that in the remainder of the code. Or simply print it to screen to verify that your contract definition was both sufficient and unique, resulting in precisely one returned contract.
3. method tickPrice() only gets updated if a price changes to what it was previously. This means that if there is no trading going on (and the best bid/ask prices don't change) you won't receive any data. If, during trading, multiple trades get executed at the same price you only receive a price update at the first trade, but not at the successive trades, because the price is not changing.
4. look for method cancelMktData(). In your case it would be cancelMktData(nextOrderID).