Поддержание постоянной глубины рынка с помощью Mt.Gox API

Я пытаюсь написать программу, использующую Mt.Gox API, чтобы поддерживать постоянное актуальное представление о глубине их рынка. Мой текущий подход заключается в следующем:

  • Подключите WebSocket и подпишитесь на обновления глубины
  • Подождите 1 минуту, собирая обновления
  • Запросите полные данные о глубине рынка через http://data.mtgox.com/api/1/BTCUSD/depth/full.
  • Слияние собранных обновлений с рыночными данными по отметке времени (более поздние победы).
  • Продолжайте объединять все будущие обновления с данными

Поиграв с этим некоторое время, я заметил, что полная загрузка данных глубины не всегда соответствует данным, сгенерированным из обновлений. Вот почему я добавил 1-минутную задержку, думая, что, возможно, сервер Mt.Gox только периодически обновляет полные данные глубины, а не генерирует их на лету.

Но даже с этим протоколом, если я запущу программу дважды параллельно, в итоге я увижу разные данные в обоих случаях.

Любая идея, что я могу делать неправильно?

Ответы (1)

По моему опыту, запрос полной глубины рынка у MtGox часто приводит к совершенно неверной информации. Чтобы справиться с этим, я прибегнул к созданию собственного, аналогично тому, как вы описали выше.

Что я делаю, так это, используя websocket api , я просматриваю все входящие depthсобытия. Затем я сохраняю два упорядоченных массива бидов и асков. В событиях глубины, если объем положительный, я добавляю порядок в соответствующий массив на основе type_strсвойства. Если объем отрицательный, я удаляю объект из массива.

Обязательно комбинируйте объекты одинаковой цены, но разного объема. Аналогично при удалении объектов, если отрицательный объем меньше объема того же ценового объекта, то только вычитается из объема, а не удаляется. Вот как это делается на сервере MtGox, и это приведет к ошибкам, если сделать по-другому.

После того, как это поработает некоторое время, хотя и не глубоко, книга заказов будет довольно точной и репрезентативной для того, какой должна быть книга заказов MtGox.

Привет! Я также пытался управлять своей собственной книгой ордеров и заметил, что после того, как она поработала какое-то время, в ней накапливаются записи, которые уже давно должны были быть удалены. Но до сих пор я использовал только поле «общий объем» событий «глубина». Информация, включенная в «торговые» события, на самом деле не отображается как «глубинные» события? Кроме того, считаете ли вы, что информация об увеличении объема (положительная или отрицательная) является более точной, чем использование поля «общий объем»? Спасибо!
поэтому я изменил размер, чтобы все торговые события имели соответствующее событие глубины с отрицательным объемом. Таким образом, просто используя события глубины, вы можете построить книгу заказов, добавляя все объекты глубины с положительным объемом и удаляя объекты с отрицательным объемом. Чтобы убедиться, что они одинаковы, я сопоставляю поля price_intи amount_intперед удалением объекта. Я total volumeвообще не использую, и обнаружил, что это работает довольно хорошо.
Хммм... Я также использовал price_int, чтобы сопоставить записи... позвольте мне попробовать использовать amount_int вместо общего объема, чтобы убедиться, что это более надежно... Вы когда-нибудь замечали какие-либо события глубины, поступающие "не по порядку", то есть вы получаете событие с отметкой времени «сейчас», которая раньше, чем отметка времени ранее полученного события?
Нет, но я буду следить за этим в будущем. Также убедитесь, что вы берете абсолютное значение отрицательных объемов, прежде чем сравнивать их с существующими заказами.