歴程4:bitBuyerの汎用性向上への挑戦1(SS初公開!)

接続先編集画面とは?

Hey there! 一日ぶりです😉!
歴程3でお話した通り、今回からは「接続先編集」画面を中心としたお話になります。

「接続先編集」画面。つまり取引所の情報=接続先の情報を編集する画面ということですが、これだけだと「入力フォームでしょう? 簡単そうでは?」と思われるかもしれません。でも、そうは問屋が卸さないのです。

取引所ごとに異なるAPIの仕様

歴程3でも触れましたが、厄介なことに、API(アプリケーションプログラミングインターフェース)の仕様は取引所毎に異なります。一番厄介なのは、送受信するデータの形式や構造が取引所毎に異なるというところです。例えば、私が使用することにした取引所「bitFlyer」のTicker(ティッカー)のAPIから送られてくるJSON形式のデータ構造は、APIドキュメントによると以下のようなものになっています。

{
  "product_code": "BTC_JPY",
  "state": "RUNNING",
  "timestamp": "2015-07-08T02:50:59.97",
  "tick_id": 3579,
  "best_bid": 30000,
  "best_ask": 36640,
  "best_bid_size": 0.1,
  "best_ask_size": 5,
  "total_bid_depth": 15.13,
  "total_ask_depth": 20,
  "market_bid_size": 0,
  "market_ask_size": 0,
  "ltp": 31690,
  "volume": 16819.26,
  "volume_by_product": 6819.26
}

JSONデータ構造の違いと汎用性の確保

比較するために、bitBuyer 0.8.1.aの汎用性確保のために参考として参照している他の取引所、例えば「GMOコイン」のAPIドキュメントに記載のTickerのデータ構造も見てみましょう。

{
  "status": 0,
  "data": [
    {
      "ask": "750760",
      "bid": "750600",
      "high": "762302",
      "last": "756662",
      "low": "704874",
      "symbol": "BTC",
      "timestamp": "2018-03-30T12:34:56.789Z",
      "volume": "194785.8484"
    }
  ],
  "responsetime": "2019-03-19T02:15:06.014Z"
}

取引所APIのデータ構造を考察する

注目していただきたいのは、”{}” や “[]” といった括弧の配置です。いまはまだ、これらの括弧の意味を理解する必要はありません。ですが簡単に説明すると、これらの括弧は、データ構造を表しています。
どうでしょうか? 見比べてみると、括弧の配置箇所の違いや、GMOコインの方は入れ子構造になっている、といった違いがありますね😔。汎用性を確保しようとすると、このようなデータ構造の違いに、bitBuyer 0.8.1.aは個別に対応しなければなりません。

bitBuyer 0.8.1.aの汎用性を実現するための設計

「個別に対応」と言っても、そのアプローチにはいくつかの方法が考えられます。私が思いつくところだと、まずは「各取引所毎に専用の関数を作り、送受信するデータの処理を行う」ということが考えられます。しかし、このアプローチは歴程3で言及した「ユーザーが任意の取引所を後天的に追加できるようにする」という高い汎用性の追求には向いていません。なぜなら、この方法は「プログラム内で “先天的” にアプリケーションが対応可能な取引所を用意する」というものだからです。「ユーザーが任意の取引所を後天的に追加できるようにする」ためには、別のアプローチが必要です。

ユーザーが後天的に追加できる仕組み

そこで私が考えたのは、ユーザーに少々プログラミング紛いの操作をお願いする、というものです。以下のスクリーンショットをご覧ください。

bitBuyer 0.8.1.aのデータアクセス設定

見ていただきたいのは、「同データパス:」としている入力欄です。ここで、ユーザーに「プリセットに存在しない」、後天的に追加する「利用したい取引所」のAPIが返す、データのデータ構造を反映したパス(bitBuyer 0.8.1.aが目的のデータへアクセスするためのパス)を入力してもらいます。スクリーンショットの右側を見ていただければお分かりの通り、入力のための手順もドキュメントとして提供しています。

ユーザーエクスペリエンスと解決策

このようにすることで、bitBuyer 0.8.1.aはどのようなデータ構造にも対応することができるようになります。もちろん、ユーザーにプログラミング紛いの操作をお願いすることは、必ずしもユーザーエクスペリエンス(ユーザー体験)におけるベストプラクティスとは言えないかもしれません。しかし、この問題についてChatGPTと解決策を模索した結果がこれなのです。いまの私には、これ以上の良い解決策を見つけることは困難です😔。

ExtractAndFormatData関数の役割

とはいえ、これさえ設定していただければ、あとはbitBuyer 0.8.1.aが全力で処理します😉。
そう、1,400行超の大規模関数 “ExtractAndFormatData” の出番です😆。

接続先編集の意図と今後の展望

今日は、bitBuyer 0.8.1.aがどのようにして異なるデータ構造に対応するようになったかをご紹介しました。「対応するようになった」は語弊がありますね。「接続先編集」画面を作り始めた当初から、「ユーザーが任意の取引所を後天的に追加できるようにする」という構想はありました。なので、「どのようにして実現したか」が適切ですね。

次回予告:システムログの重要性

次回は、スクリーンショットに映り込んでいる「システムログ」のお話をします。Cheers!

このブログを購読(RSS)
1st Project Anniversary 🎉
Shōhei KIMURA|Facebook
Yōhaku KIMURA|𝕏
コーヒーブレイクを提供してくださいますか?

【開発に興味のある方】
bitBuyerコミュニティ規約
LINEオープンチャット
Dicordサポートラウンジ

bitBuyer Projectをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む