見出し画像

仮想通貨bot 勉強記録⑨

~ローソク足の更新を検知する~

前回までのあらすじ

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文とif文を使う

コードを書く前に、どうすればローソク足の更新を検知できるか考えます。

1分足において、20:00のローソク足と20:01のローソク足の違いは”開始時刻”(もしくは終了時刻)ですよね。つまり、1秒や10秒ごとにローソク足を取得して、ローソク足の開始時刻の情報が切り替わったタイミングを検知すればいいです。

今回作るコードでは、”10秒ごとに情報を取得し続ける部分”にwhile文、”ローソク足の開始時刻の切り替わりを検知する部分”にif分を使います。

作ったコードはこちら

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()

回を重ねるごとにコードが長くなっていく、、、

解説

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) 

ここから違います。
まず、last_dataという変数に最新のローソク足データを入れておきます。
同様に、last_timeという変数にlast_dataの時刻データを入れておきます。

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']
       

次に、while文の中で同じように時刻とローソク足を取得し、new_data、close_timeという変数にデータを入れます。

       if close_time != last_time:
             pp( "時間:" + close_time 
                + " 始値: " + str(open_price)
                + " 終値: " + str(close_price))
                
             last_time = close_time

       time.sleep(1)

最後にif分の部分です。

close_timeとlast_timeの値が異なった場合(!=)、始値と終値をプリントして、last_timeにclose_timeの値を入力します。

異ならなかった場合、1秒待ってまたwhile内の最初の行に戻ります。

画像2

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

画像2

Anacondaも喜んでます。

今回はここまで!次回はコードを関数ごとにまとめて見やすくしていきます

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