
仮想通貨bot 勉強記録⑩
~関数でまとめる~
◆前回までのあらすじ
ローソク足が切り替わるごとに出力するプログラムを書きました。
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():
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()
#前回のデータ
last_data = k['result'][-2]
#前回の時間
last_time = datetime.fromtimestamp(last_data['open_time']).strftime('%Y/%m/%d %H:%M')
time.sleep(1)
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()
#今回のデータ
new_data = k['result'][-2]
#今回の時間
close_time = datetime.fromtimestamp(new_data['open_time']).strftime('%Y/%m/%d %H:%M')
open_price = new_data['open']
close_price = new_data['close']
if close_time != last_time:
pp( "時間:" + close_time
+ " 始値: " + str(open_price)
+ " 終値: " + str(close_price))
last_time = close_time
time.sleep(1)
get_kline()
◆今回やること
・処理を関数にまとめる
だんだん処理が増えてコードが長くなってきたので、関数でブロック分けして、コードを使いやすくしていきます。
とりあえず作ったコードを載せます。
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(min):
t = datetime.now() - timedelta(hours=1)#今から1時間前の時刻を取得
t = int(t.timestamp())#タイムスタンプ形式に変換&float型からint型に変換
k = bybit.rest.inverse.public_kline_list(
symbol = "BTCUSD",
interval=min,
from_=t).json()
data = k['result'][-2]
close_time = datetime.fromtimestamp(data['open_time']).strftime('%Y/%m/%d %H:%M')#今回の時間
open_price = data['open']
close_price = data['close']
return close_time, open_price, close_price
def print_price(close_time, open_price, close_price):
pp( "時間:" + close_time
+ " 始値: " + str(open_price)
+ " 終値: " + str(close_price))
def watch_kline():
last_time = 0
while True:
close_time, open_price, close_price = get_kline(1)
if close_time != last_time:#前回の時間と今回の時間が異なる値だった場合出力する
print_price(close_time, open_price, close_price)
last_time=close_time
time.sleep(1)
watch_kline()
◆解説
・全体
全体の概要はこんな感じ
3つの関数を組み合わせていて、それぞれの関数で異なる仕事をしてます。
・最初の関数 get_kline(min)
def get_kline(min):#minはintervalに入れる値を任意に設定できる変数
t = datetime.now() - timedelta(hours=1)#今から1時間前の時刻を取得
t = int(t.timestamp())#タイムスタンプ形式に変換&float型からint型に変換
k = bybit.rest.inverse.public_kline_list(
symbol = "BTCUSD",
interval=min,
from_=t).json()
data = k['result'][-2]
close_time = datetime.fromtimestamp(data['open_time']).strftime('%Y/%m/%d %H:%M')
open_price = data['open']
close_price = data['close']
return close_time, open_price, close_price#返り値を設定しておく
最新のローソク足データを入手し、close_time,open_price,close_priceにデータを入れておきます。関数名(get_kline(min))の(min)の部分は、intervalの値を任意に変更できるようにしています。
後からこの関数を呼び出すとき、()内に入れる数字で欲しいローソク足の長さを指定できます。
また、関数内の最後でreturnという単語が出てきます。これは”3つの値を返す”という意味で、最後の関数実行時に必要になります。
・2番目の関数 print_price(close_time, open_price, close_price)
def print_price(close_time, open_price, close_price):
pp( "時間:" + close_time
+ " 始値: " + str(open_price)
+ " 終値: " + str(close_price))
画面出力するだけ
・3番目の関数 watch_kline()
def watch_kline():
last_time = 0
while True:
close_time, open_price, close_price = get_kline(1)
#get_kline関数から引数1(1分足)で返り値を呼び出す
if close_time != last_time:
#last_timeとclose_timeが異なる値だった場合print_price関数を呼び出す
print_price(close_time, open_price, close_price)
last_time=close_time#last_timeにclose_timeを上書き
time.sleep(1)
最初にlast_timeという変数に適当な値を入れます。それにより、後に書いてあるif分で判別した際、初回にprint_price関数が呼び出されます。
2行目以降はwhile文でループさせています。
まずはget_kline(m)関数を呼び出し、close_time, open_price, close_priceの値を呼び出します。この時()の中を5にすれば5分足、60にすれば1時間足を取得できます(他もできる)。
後は書いてある通り、if文でclose_timeとlast_timeを比較し、値が異なったらprint_price(close_time, open_price, close_price)関数を呼び出して出力し、last_timeにclose_timeの値を上書きします。
今回はここまでです。
関数で処理をまとめることで、コードを見やすくすることができるようになりました!