接続先編集画面とは?
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!


