Bot

仮想通貨botの開発を本格的に始めてみる#4(2023/9/3)

前回の記事に引き続き「APIの使用」についてまとめていきます。

今回は少し難しい練習問題に取り組んでみました。

練習問題に取り組む

以下のAPIを元にして、過去のビットコイン価格のデータを取得するAPIを利用して、2018年1月16日の終値と最安値を取得してみます。

https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc?periods=86400&after=1514764800

まずは、CryptWathcのAPIの仕様書を確認。

すると

[
CloseTime,
OpenPrice,
HighPrice,
LowPrice,
ClosePrice,
Volume,
QuoteVolume
]

と解説しているため、4番目(最安値)と5番目(終値)の値を指定すれば良いことが分かります。

そして、取り出したAPIのいちばん上の行を見ると

86400': [[1516060800, 1685970, 1720310, 1666740, 1670940, 244.36139, 414404030]

となっているため、赤字の部分を指定するコードを書きます。

その後、その中から最も低い値を取り出すようにすれば良いはずです。

まずは、日付を指定するタイムスタンプを取得するために

UNIXタイムスタンプ変換ツール

にアクセスして、APIの最後尾を書き換えるための文字列を獲得→書き換え。

このとき、2018年1月16日の1日分のデータを取得するためには、タイムスタンプの日付指定は1月17日の9時に指定します。

これはCryptWatchの価格データが毎日午前9時で区切って日足データをまとめているためです。(これは知らなかった)

タイムスタンプを書き換えたものは以下の通り。

https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc?periods=86400&after=1516147200

これを打ち込むと

{"result":{"86400":[[1516147200,1676464,1676464,1049900,1315244,658.39777,980698500],[....],[....]

という文字列が表示されます。

取り出したいのは太字の部分です。

しかし、このままでは指定のデータを取り出すことはできません。

データを取り出すためには、条件付けが必要です。

for構文とif構文とWhile構文

こちらの記事を参考に、条件付けを勉強していきます。

まず、for構文複数のデータを指定して、それら全てに同じ処理を行いたい時に使います。

コードを書くと

for 要素 in 配列など
 要素に対して実行したい処理

という形になります。

今回のコードを例に挙げると、以下の太字の部分のことです。

import requests
response = requests.get("https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc?periods=86400&after=1516147200")
data = response.json()

for item in data["result"]["86400"]:
if item[0] == 1516147200:
print(item[5])

itemという要素にdata["result"]["86400"]という配列を指定します。

最後にitemに対してprintという処理を実行しています。

また、ここでは同時にif構文も使っています。

if構文は、「条件分岐」をしたい時に使います。

具体的には「〇〇のときは〜〜したい、××の時は〜〜したい、それ以外の時は〜したい」という時ですね。

使う文字はif,eles,elifの3つです。

基本的派な形は

if 〇〇の時:
実行したい処理

条件設定をしたいときは、elseを使います。

if 〇〇の時:
実行したい処理
else:
それ以外で実行したい処理

もっと複雑な条件分岐をしたい時は、elifを挟みます。

if 〇〇の時:
実行したい処理
elif 〇〇の時:
実行したい処理
elif 〇〇の時:
実行したい処理
elif 〇〇の時:
実行したい処理
else:
それ以外で実行したい処理

これらの仕組みと構造を理解したところで、ようやく本格的に注文を出すBotを組んでいくことができます。

これを踏まえて、もう一度今回のコードを見てみましょう。

import requests
response = requests.get("https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc?periods=86400&after=1516147200")
data = response.json()

for item in data["result"]["86400"]:
if item[0] == 1516147200:
print(item[5])

if構文を使ってitem[0]に該当する条件(2018年1月16日時点の終値)を設定しています。

このコードを実行すると、無事に求める結果(最安値)が得られました。

ちなみにprint(item[4])にすると終値を取得することができます。

なお、こちらの記事では指示をループさせるWhile構文も解説されていたので、あわせてまとめておきます。

具体的には「ある条件のもとで、指示したことをやり続けなさい」という命令を設定する時に使います。

基本的な形は

While 条件:
ループしたい処理

となります。

これは自動売買botを作るときに必須の文ですね。

実際に組む時には、これらfor,if,Whileの3つを組み合わせていくことになりそうです。

補足とまとめ

次回はいよいよプライベートAPIを使って、実際に取引注文を出してみます。

4回目にしてようやくここまで辿り着きました。

焦らずに一つずつ進めていきます。

-Bot