こんにちは!暗号資産の開発をしていて、最近ずっと気になっていたことがあるんです。
「オーダーブックのスナップショットって、本当にどれくらいのペースで更新されるの?」
最初、普通に API からスナップショットを取得してみたら、数秒に 1 回しか更新されなくて…「これじゃあ、相場の動きに全然ついていけない!」と焦りました(笑)
オーダーブックスナップショットって何?
簡単に言うと、**「ある瞬間の売買注文の全体像」** のことです。どの価格にどれだけの注文が入っているかが、一目でわかるデータなんですね。
でも、実は API って、毎回この全体像を送ってくれるわけじゃないんです。主流なのは「スナップショット+増分更新」という方式。
- スナップショット:1 回だけ全体のデータを取りに行く
- 増分更新(diff):その後の注文の変化だけを、小さいデータでどんどん送ってくれる
チャットで例えると、スナップショットが「最初の画面スクショ」で、増分更新が「次々来る新着メッセージ」みたいな感じです。
REST と WebSocket、どっちが速いの?
API には大きく 2 種類あって、更新スピードが全然違うんです。
REST インターフェース
- 更新:数秒~数十秒に 1 回
- 向いてる用途:過去のデータをまとめて取る、統計を取るとき
- 向いてない:リアルタイムでの監視や取引(遅すぎて間に合わない!)
WebSocket インターフェース
- 更新:ミリ秒~数百ミリ秒レベル
- 向いてる用途:リアルタイム監視、自動取引、戦略の実行
- 特徴:相場の変動が目に見えるレベルで追える
私、最初 REST でやってて「全然ダメだ…」となったので、WebSocket に切り替えたら世界が変わりました。
なぜ「固定 1 秒更新」にしてくれないの?
「リアルタイムって書いてあるのに、どうして 1 秒ごとに固定してくれないの?」って思ったことありませんか?理由はこの 3 つです。
- 人気の通貨は注文の変化が激しいので、毎回全体送るとサーバーが大変
- あまり取引されてない通貨は、注文がほとんど変わらないので頻繁に更新する必要がない
- 業界では「スナップ+増分」が常識で、これが一番効率がいい
つまり、「リアルタイム」=「固定間隔」じゃなくて、相場の状況に合わせて動的に変わるんです。
実践!正しいリアルタイム取得方法
安定してリアルタイムなオーダーブックを作るには、この手順が一番です。
- REST で 1 回だけ全体のスナップショットを取る
- WebSocket で接続して、増分更新を受け取り続ける
- 受け取った増分データで、ローカルのオーダーブックをどんどん更新する
実際、私はAllTick APIを使ってこの方式を実装しています。Python のコード例を載せておくので、よかったら参考にしてくださいね。
```python
import websocket
import json
def on_message(ws, message):
data = json.loads(message)
# 増分データを使ってローカルのオーダーブックを更新
process_orderbook_update(data)
if __name__ == "__main__":
ws = websocket.WebSocketApp(
"wss://apis.alltick.co/ws/stock",
on_message=on_message
)
ws.run_forever()
```
こうすることで、REST のような「更新待ち」のラグなしで、ほぼミリ秒単位で最新の状態を保てるようになります。
まとめ
オーダーブックの更新頻度って、数字だけを見ても意味がないんだな… と実感しました。
大切なのは「スナップ+増分」の仕組みを理解して、WebSocket を使うこと。そして、自分のローカルデータを正しく更新し続けることです。
同じように「API のリアルタイムってどうなの?」と悩んでいる方の参考になれば嬉しいです✨