自動売買BOTなどでBTCFXの価格を取得する場合、基本的にはCryptowatchを使うのがベストな案だと思います。Cryptowatchの価格はBitfyer管理画面のチャートに表示されている価格に最も近いからです。
しかし最近はCryptowatchのサーバーが不安定になることも増えてきました。そこで第2の選択肢として、CryptoCompareからBTCFXの価格データを取得する方法を紹介します。
基本的な仕様
普段Cryptowatchを使っている方は、以下の仕様を把握しておきましょう!
(1)取得できるのは、1分足/1時間足/日足の3つだけ
(2)取得可能な最大件数は2000件まで
デフォルトは1分足1440件/1時間足168件
(3)データの並びは時系列の古い順
(4)BitflyerFXのチャート画面の価格(終値)とは完全に一致しない
Pythonコード
まずは最初にpythonコードを見ておきましょう。
以下のpythonコードを使えば、当サイトで紹介しているほとんどのコードとそのまま互換性があります。
import requests from datetime import datetime # CryptoCompareの価格データを取得する関数 def get_price(min): price = [] params = {"fsym":"BTC","tsym":"JPY","e":"bitflyerfx","limit":2000 } response = requests.get("https://min-api.cryptocompare.com/data/histohour",params, timeout = 10) data = response.json() if data["Response"] == "Success": for i in data["Data"]: price.append({ "close_time" : i["time"], "close_time_dt" : datetime.fromtimestamp(i["time"]).strftime('%Y/%m/%d %H:%M'), "open_price" : i["open"], "high_price" : i["high"], "low_price" : i["low"], "close_price": i["close"] }) return price else: print("データが存在しません") return None
データの時系列は古い順なので、例えば、上記の関数の返り値から以下のようにアクセスすれば、直近の価格データを取得できます。
price[-1][“high_price”] … 現在の足の高値
price[-2][“close_price”] … 前回の足の終値
APIの形式
CryptoCompareのAPIのURL形式は、以下のようになっています。
https://min-api.cryptocompare.com/data/histo時間軸?fsym=通貨名&tsym=通貨名&e=取引所名&limit=取得件数
他の時間軸のローソク足を取得したい場合は、URLを以下のように変更します。
・/data/histominute … 1分足
・/data/histohour … 1時間足
・/data/histoday … 日足
例えば、以下のURLはそのままアクセスできます。
確認してみてください。
https://min-api.cryptocompare.com/data/histohour?fsym=BTC&tsym=JPY&e=bitflyerfx
期間の指定
期間の指定は、末尾の日時のみ「?toTS=XXXXXX(UNIXタイムスタンプ)」の形式で指定できます。
ただしどのような指定方法を使っても、直近の2000件以上を遡って取得することはできないようです。また「&limit=2000」と併用した場合は期間指定は無視されて合計2000件の取得となります。
1時間足の注意点
直近の足へのリアルタイム価格の反映は10分に1回しか行われていないようです。これはCryptowatchのAPIとの大きな違いです。
▽ 直近の足だけを20秒に1回取得してみた結果
そのため、リアルタイム価格を使って損切り等の何らかの判定をおこないたい場合は、同時にCryptoCompareの1分足のデータを取得するか、BitflyerのパブリックAPIを利用してリアルタイム価格を取得する必要があります。
API使用回数の制限
昔はなかったのですが、現在はCryptocompareのAPIの無料版には使用回数の制限があるみたいです。
BOTユーザー様に提供しただいたAPIのログ情報によると、2021年3月時点では、以下のようになっているようです。
(cryptocompareの使用制限)
1カ月あたり 5万回まで
1日当たり7500回まで
1時間あたり3000回まで
1分あたり300回まで
1秒あたり 20回まで
1分間に1回使用する程度なら、月間46300回なのでおそらく問題ありません。30秒に1回だと月間86400回で、おそらくオーバーします。いずれも1日あたりの使用回数には問題ありません。
APIリミットのエラー
上記コードの data を print() してみるとわかりますが、APIの使用制限にかかっている場合、Cryptocompareからは以下のような返り値があります。
RateLimitに注目してください。
calls_made が、あなたが直近でAPIを使用した回数。
max_calls が、許容される最大の使用回数です。
{'Data': {}, 'HasWarning': False, 'Message': 'You are over your rate limit please upgrade your account!', 'RateLimit': {'calls_made': {'day': ***, 'hour': ***, 'minute': ***, 'month': ***, 'second': ***, 'total_calls': ***}, 'max_calls': {'day': 7500, 'hour': 3000, 'minute': 300, 'month': 50000, 'second': 20}},
APIの使用制限にかかっていない場合、RateLimit の戻り値は空データなので、あと何回までAPIが使用できるかはわかりません。
公式ページの説明によると、もし無料アカウントを開設すると、以下のようにダッシュボード形式でAPIの使用回数や残りの回数が見れるようになるようです。
▽ Cryptocompareアカウントの管理画面
(参考)
・Cryptocompare公式 「APIのRateLimitとは何ですか?」
・Cryptocompare公式「自身のAPIリミットをどうやって確認できますか?」
・Cryptocompare公式ガイド「CryptocompareAPIの使い方」
API経由で残りの使用回数を確認する
以下のAPIを確認することで、残りのAPIの使用回数(APIリミット)を確認できるみたいです。
こちらのAPIを使って使用頻度を調整するようにBOTを作成してもいいかもしれません。残りの使用可能な回数(calls_left)を取得できるので使いやすそうです。
いつも大変勉強にさせていただいています。
よろしければmatplotlib.financeとcryptowatchのAPIを利用したロウソク足の描画についての記事も見てみたいです。
コメントありがとうございます!^^
リクエストありがとうございます、検討しますね!