見出し画像

仮想通貨bot 勉強記録⑧

~ローソク足を取得する~

前回までのあらすじ

PyBybitを使って、注文を出したり、キャンセルしたりできるようになりました。

教科書だと今回(第4回:1)はbotアルゴリズムを考えるパートですが、先にローソク足の取得をやっていきます。

bitflyerの公式APIはローソク足の情報(始値、高値、安値、終値)が取得できないらしいですが、Bybitは公式APIで取得できます

実は勉強記録⑤で取得しています。

画像2

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仕様書を確認しましょう。

画像2

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(構文エラー)が出ます。

画像3

PyBybitの仕様書を確認すると分かりますが、PyBybitにおいては、fromではなく、from_を指定する必要があります。

画像4

僕はエラー原因が分からな過ぎて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で年月日時分秒に変換してます。

実行するとこんな感じです。

画像5

実行した時刻は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出力を繰り返します。

画像6

プログラムを止めたいときは、Anacondaの画面でCtrl+Cを押せば止まります。

今回はここまで

この記事が気に入ったらサポートをしてみませんか?