
仮想通貨bot 勉強記録⑧
~ローソク足を取得する~
前回までのあらすじ
PyBybitを使って、注文を出したり、キャンセルしたりできるようになりました。
教科書だと今回(第4回:1)はbotアルゴリズムを考えるパートですが、先にローソク足の取得をやっていきます。
bitflyerの公式APIはローソク足の情報(始値、高値、安値、終値)が取得できないらしいですが、Bybitは公式APIで取得できます。
実は勉強記録⑤で取得しています。
Open:始値
High :高値
Low :安値
Close:終値
頭文字をとって、ローソク足の価格のことをOHLCと呼ぶらしいです。
やり方は分かっているので、サクッとコードを書いて1分足のローソク足を取得します。
コードを書く
書いたコードはこちら
def get_kline():
t = datetime.now() - timedelta(hours=1)#今から1時間前の時刻を取得
t = int(t.timestamp())#タイムスタンプ形式に変換&float型からint型に変換
k = bybit.rest.inverse.public_kline_list(
symbol = "BTCUSD",
interval="1",
from_=t).json()
k = k['result'][-2]
#datetime.fromtimestamp(k['open_time']).strftime('%Y/%m/%d %H:%M')でタイムスタンプを変換
close_time = datetime.fromtimestamp(k['open_time']).strftime('%Y/%m/%d %H:%M')
open_price = k['open']
close_price = k['close']
print( "時間:" + close_time
+ " 始値: " + str(open_price)
+ " 終値: " + str(close_price))
get_kline()
サクッと書くとか言ってたのに、タイムスタンプの変換を忘れていたり、BybitのAPIとPyBybitのAPIの微妙な違いでエラーが起こり、解決するのにほぼ1日かかってしまいました、、、
解説
関数の中身を解説する前に、BybitのAPI仕様書を確認しましょう。
Bybitのローソク足取得リクエストは、”from=で指定したタイムスタンプ以降”のローソク足を取得します。また、取得できるローソク足の本数は最大200本です。
つまり、最新の1分足のローソク足情報が欲しかったら、”今”より1分~199分前のタイムスタンプを取得する必要があります。
t = datetime.now() - timedelta(hours=1)#今から1時間前の時刻を取得
t = int(t.timestamp())#タイムスタンプ形式に変換&float型からint型に変換
k = bybit.rest.inverse.public_kline_list(
symbol = "BTCUSD",
interval="1",
from_=t).json()
k = k['result'][-2]
1行目:現在時刻から1時間(60分)前の日時datetimeを取得しています。
2行目:取得した日時datetimeをタイムスタンプに変換しています。更にタイムスタンプはデフォルトがfloat型です。BybitのAPI仕様書では、fromに入れるタイムスタンプはint型の指定があるので、int()でint型に変換しています。変数はt。
3行目:ローソク足取得リクエストです。
1分足の情報が欲しいので、interval="1"
タイムスタンプは先ほど取得した、from=t を入力します。
ここで気を付けることがあります
from=tと入力すると、SyntaxError(構文エラー)が出ます。
PyBybitの仕様書を確認すると分かりますが、PyBybitにおいては、fromではなく、from_を指定する必要があります。
僕はエラー原因が分からな過ぎて3時間くらい彷徨いました。。。
後半はprintする変数の指定だけです。
#datetime.fromtimestamp(k['open_time']).strftime('%Y/%m/%d %H:%M')でタイムスタンプを変換
close_time = datetime.fromtimestamp(k['open_time']).strftime('%Y/%m/%d %H:%M')
open_price = k['open']
close_price = k['close']
print( "時間:" + close_time
+ " 始値: " + str(open_price)
+ " 終値: " + str(close_price))
close_timeは、datetime.fromtimestampでk['open_time']をタイムスタンプから日時datetimeに変換し、更に.strftimeで年月日時分秒に変換してます。
実行するとこんな感じです。
実行した時刻は2021/03/18 00:28なので、正しく取得できてます。
10秒おきにローソク足を取得する
import pybybit
from datetime import datetime,timedelta
from rich import print as pp
import time
# API情報を入力
apis = [
'プライベートキー',
'シークレットキー'
]
bybit = pybybit.API(*apis, testnet=True)
def get_kline():
while True:
t = datetime.now() - timedelta(hours=1)#今から1時間前の時刻を取得
t = int(t.timestamp())#タイムスタンプ形式に変換&float型からint型に変換
k = bybit.rest.inverse.public_kline_list(
symbol = "BTCUSD",
interval="1",
from_=t).json()
k = k['result'][-2]
#datetime.fromtimestamp(k['open_time']).strftime('%Y/%m/%d %H:%M')でタイムスタンプを変換
close_time = datetime.fromtimestamp(k['open_time']).strftime('%Y/%m/%d %H:%M')
open_price = k['open']
high_price = k['high']
low_price = k['low']
close_price = k['close']
pp( "時間:" + close_time
+ " 始値: " + str(open_price)
+ " 終値: " + str(close_price))
time.sleep(10)
get_kline()
さっきのコードにwhile文を追加しました。変化点は以下の3点です。
timeモジュールをインポート
get_kline関数内にwhile true:を記入
関数の最後にtime.sleep(10)の記入
while文については、以下の記事を参考にしています。
実行すると、10秒おきにデータ取得・print出力を繰り返します。
プログラムを止めたいときは、Anacondaの画面でCtrl+Cを押せば止まります。
今回はここまで