Я уже предлагал разным биржам предоставлять эту информацию, но по каким то непонятным для меня причинам, разработчики/владельцы биржи даже не думаю об этом, наверное трафик защиты ддос стоит недостаточно дорого.
Например лог сырых данных (это все события - размещение ордеров, отмена ордера, модификация объема ордера, факты пересечения ордеров) может иметь следующий формат (простая таблица с полями):
* идентификатор события - для событий типа order/cancel - это идентификатор отложенный сделки, для trade - просто идентификатор, я рекомендую здесь использовать единый сиквенс
* время - пожалуйста, не экономьте на точности, выдавайте microtime(true) хотя бы с 3 знаками после запятой (а в protobuf используйте float или даже int64 но в микросекундах)
* валютная пара - ltc_usd/btc_usd/... правильнее идентфикатор и выдавать информацию по ним отдельным запросом
* тип события - trade/order/cancel, order - клиент разместил ордер, cancel - отменил ордер, trade - факт пересечения одной сделки пользователя с другой, т.е. если клиент разместил ордер по рынку, в лог попадут как минимум две записи, одна order, и одна или несколько trade. Есть еще желательное действие move, но о его вводе я уже не мечтаю.
* тип ордера - bid/ask, это направление сделки относительно ее иннициатора, конечно можно так же завести значение в справочнике или boolean
* идентификатор ордера - для событий trade, это идентификатор сделки, с которой произошло пересечение (сейчас у вас это order_id), для событий типа order это значение пусто или равно идентификатору события если ордер создается, а для событий отмены ордера - идентификатор отменяемого ордера
* объем события - для order это объем всей сделки, для cancel - объем остатка сделки, для trade - объем пересечения (собственно объем самой операции)
* цена сделки
Полный лог этих данных полностью самодостаточен и позволит восстановить состояние биржевого стакана и историю торгов на любой момент. Для оптимизации этого процесса можно выдавать периодические дампы (например раз в сутки) того же стакана.
Если вы не готовы выдавать его по websocket (но это надо, обязательно), сохраняйте в статических файлах, разбивая по интервалам времени (часы к примеру, а позже и на минуты), в этом случае трейдеры будут периодически загружать только маленький текущий файл. Нагрузка на статику, в отличии от динамически генерируемых данных, отлично горизонтально масштабируется, на их отдачу можно выделить несколько серверов, даже разнесенных географически, и только один файл должен отдаваться самой торговой платформой - текущий.
Если вы опасаетесь, что трейдеры получат излишнюю информацию об идентификаторах, то замените их на новые - привязанные к ордер+цена, соответственно объедините ордера с одной ценой (cancel записи позволяют указать отмену части ордера).
Цены и объемы в виде целых чисел с фиксированной точностью, точность описывается так же в отдельном запросе к бирже (сделать один файл на бирже, описывающий список валютных пар, точности, значения идентификаторов и т.п.)
Про protobuf, люди, мы в каком веке? хватит уже роботам общаться в human readable форматах, кои на порядок более жрущие по ресурсам чем их бинарные аналоги, google protobuf есть чуть ли не под все популярные платформы и не только высокоффективный но и идеологически верный, неизменная логика, описывающая структуру данных, просто компилируется в виде классов на выбранном вами языке программирования.
p.s. я нечего не изобретаю, похожие логи выдают некоторые (или может даже все) мебанковские валютные биржи, только не всем клиентам, слишком этот поток тяжелый (я не согласен кстати, какие то гигабайты в месяц - ничто)