前回の記事に引き続き「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]
となっているため、赤字の部分を指定するコードを書きます。
その後、その中から最も低い値を取り出すようにすれば良いはずです。
まずは、日付を指定するタイムスタンプを取得するために
にアクセスして、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回目にしてようやくここまで辿り着きました。
焦らずに一つずつ進めていきます。