I have a few suggestions:
(1) have you specified nextOrderID?
(2) you could run reqContractDetails() before reqMktData() to ensure that your contract is sufficiently specified.
(3) After submitting reqMktData() you wait for only 1 second and then disconnect from IB. The disconnect could occur before you receive any market data, depending on how actively this stock ticker is being traded.
(4) before calling eDisconnect() you need to cancel your market data subscriptions. Otherwise you might have issues if you try to run the same program once more immediately afterwards.