FIX protocol used for transactional messages (placing orders, modifying orders, cancelling orders, account queries, etc) but not for actually streaming live price data since the FIX message format is very verbose (i.e. there are a lot of required fields in each message that are not really relevant to market data).
A trade report binary message looks like:
trade ID – 4 bytes
price – 4 bytes
volume – 4 bytes
timestamp – 8 bytes
trade flags – 4 bytes
Total message size 24 bytes.
Imagine if you had to wrap each market data message in a FIX message you would need to include SenderCompID, TargetCompID, MsgType, BodyLength, Checksum, SequenceNum, BeginString, …
This would mean you would be sending a lot of “wrapper” information around each piece of relevant market data (probably much more wrapper information than actual data information).
If you are tracking thousands of stocks in real time then the network overhead of all of that wrapper information as well as the CPU cost of decoding those FIX messages would most likely cause you problems.
For that reason, real-time market data is usually sent on a separate TCP/UDP connection to your transactional FIX messages and usually in a bit-efficient binary format.