見出し画像

仮想通貨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()

◆解説

・全体

全体の概要はこんな感じ

画像1

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の値を上書きします。

今回はここまでです。
関数で処理をまとめることで、コードを見やすくすることができるようになりました!

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