こんにちは。ドースー(@dosu0217)です。
FTXのWebSocketから配信されてくる板情報を自動売買Botでどう管理するかを記載したいと思います。
なお、このソースコードは現時点で僕も利用しているBotにも組み込んでいる書き方となります。
FTXで自動売買Botを構築したい!という方はぜひ下記noteも参考にしていただければ幸いです。PythonでFTXのAPI・WebSocketへ繋ぐラッパーです。
記載しているソースコードは下記noteのリアルタイムデータの受信する部分に追記することで動作します。
FTXから配信されてくる板情報の仕組み
どんな形で配信されてくるのか、まずはFTXのAPIドキュメントを見てみましょう。
https://docs.ftx.com/#orderbooks
どうやらsnapshot(板情報配信)とupdate(差分)を配信してくるようです。
よってsnapshot取得後、配信されてくるupdateで文字通り上書きしていく必要があります。
仕様
このプログラムでは配信されてくるsnapshot、updateを辞書として管理し、sizeが0となった板については削除するようにしています。
イメージ
{‘bids’: {10000: 100, 9999: 80, 9997: 50 ….}, ‘asks’: {10010: 100, 10011: 70, 10015: 60 ….}}
ソースコード
以下ソースコードです。
# 変数(板情報)
board_temp = []
board = {'asks': {}, 'bids': {}}
# リアルタイムデータの受信
async def realtime(self, response):
# 板情報
if response['channel'] == 'orderbook':
data = response['data']
if data['action'] == 'partial':
self.board_temp = data
self.board = self.reformat_board(data)
elif data['action'] == 'update':
if len(self.board) > 0:
self.board = self.update_board(data, self.board)
print(self.board)
# ---------------------------------------- #
# データ整形関数
# ---------------------------------------- #
# ストリーミングデータを板情報更新用の辞書データへ整形
def reformat_board(self, data):
board = {'asks': {}, 'bids': {}}
for key in data.keys():
if key == 'bids':
board[key] = {float(quote[0]): float(quote[1]) for quote in data[key]}
elif key == 'asks':
board[key] = {float(quote[0]): float(quote[1]) for quote in data[key]}
return board
# 板情報を更新
def update_board(self, data, board):
for key in data.keys():
if key in ['bids', 'asks']:
for quote in data[key]:
price = float(quote[0])
size = float(quote[1])
if price in board[key]:
if size == 0.0:
# delete
del board[key][price]
else:
# update
board[key][price] = size
else:
if size > 0.0:
# insert
board[key].update({price: size})
# sort
if key == 'asks':
board[key] = {key: value for key, value in sorted(board[key].items())}
elif key == 'bids':
board[key] = {key: value for key, value in sorted(board[key].items(), key=lambda x: -x[0])}
return board
実行して以下のように表示されたらOKです。
以上となります。
時間があればまたいろいろとソースなど書ければなと思います。
ではよきBotterライフを~