【FTX】板情報の管理方法【Python】

こんにちは。ドースー(@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ライフを~

コメントを残す