Bot

仮想通貨botの開発を本格的に始めてみる#11(2023/9/10)

2023年9月10日

前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。

前回までで、ローソク足の価格情報を取得できるようになりました。

そこで今回は、こちらの記事を参考にして「何度も使う処理を関数にまとめる」をテーマに学習を進めていきます。

関数とは

関数とは、コードをひとまとめにしたパーツのことです。

つまり、「こういう処理をしてね」というまとまりのようなものですね。

これまでのように長いコードを書いていると、どこに何が書いてあったのかが分かりにくくなることがあります。

その結果、それぞれの関連性が分かりづらくなり、コードを書き換えたい時や見直しをしたい時に困ります。

しかし、関数にまとめておけば、これらの問題を解決しやすくなります。

関数には「Pythonに標準で用意されている関数」と「独自に作った関数」の2種類が存在します。

まずは「Pythonに標準で用意されている関数」を見ていきましょう。

この関数を呼び出すときは「関数()」というコードを書きます。

例えば、以下のように書きます。

~~ = imput(~~)

この場合、imput()の部分が関数です。

もうひとつは「独自に作った関数」です。

これは、以下のように書きます。

def 関数名(引数名1, 引数名2, 引数名3,~~)
処理1
処理2
^^^^
※処理を入力する際には、行の先頭にスペース4文字分のインデントが必要です。

引数」とは、「入力」「処理」「出力」のうち「入力」に相当する値のことです。

もっと簡単に言うと、「引数」とは「関数に入れる値」のことです。

その関数から出てくる値(≒関数で計算して返ってくる結果)のことを「戻り値返り値」と言います。

戻り値はreturn文で記述します。

def 関数名(引数名1, 引数名2, 引数名3,~~)
処理1
処理2
return

【参考】関数の定義引数

この本も参考にしました。

自作の関数を使って書き換える

早速コードを見ていきましょう。

import requests
from datetime import datetime
import time

def get_price(min):
    
    response = requests.get("https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc",params = { "periods" : min })
    response = response.json()
    data = response["result"][str(min)][-2]
	
    close_time = data[0]
    open_price = data[1]
    close_price = data[4]
    
    return close_time, open_price, close_price

def print_price( close_time, open_price, close_price ):
    print( "時間: " + datetime.fromtimestamp(close_time).strftime('%Y/%m/%d %H:%M')
		+ " 始値: " + str(open_price)
		+ " 終値: " + str(close_price) )
    
last_time = 0
while True:
    close_time , open_price , close_price = get_price(300)
    
    if close_time !=last_time:
        last_time = close_time        
        print_price( close_time, open_price, close_price )
    
    time.sleep(10)

ローソク足のデータを取得する

ひとつ目の関数がこちらです。

この関数では、ローソク足のデータを取得しています。

def get_price(min):

response = requests.get("https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc",params = { "periods" : min })
response = response.json()
data = response["result"][str(min)][-2]

close_time = data[0]
open_price = data[1]
close_price = data[4]

return close_time, open_price, close_price

get_price(min):と書くことで「get_price(min)という関数を使うよ」ということを決めています。

この場合は、minが引数です。

(min)と書いてある理由は、この関数を「何分足に変わっても応用できる」ようにするためです。

この点は、メインの処理となる最後のコードとも関わってきます。

このように書いておくことで、後半に出てくるメイン処理のwhile文↓

While True:
close_time , open_price , close_price = get_price(60)

赤字の部分を書き換えることで、get_price()関数の内部データにも反映させることができます。

また、この関数は返り値が3つ(時間のclose_time , 始値のopen_price , 終値のclose_price)あるため、return文の後ろに書きこんでそれらを指定する必要があります。

また、ここで設定した返り値はメインの処理に反映させないとエラーが出ます。

出力の形式を定義する

2つ目の関数は以下の通り。

この関数では、出力の形式を定義しています。

def print_price( close_time, open_price, close_price ):
    print( "時間: " + datetime.fromtimestamp(close_time).strftime('%Y/%m/%d %H:%M')
     + " 始値: " + str(open_price)
     + " 終値: " + str(close_price) )

赤字の部分が自作の関数です。:以降が関数で定義する内容です。

この関数には、返り値はないのでreturnの指定は必要ありません。

最後の部分がメインの処理です。

last_time = 0
while True:
    close_time , open_price , close_price = get_price(60)
    if close_time !=last_time:
      last_time = close_time
      print_price( close_time, open_price, close_price )
    time.sleep(10)

last_time = 0としている理由は、調べてみましたがよく分かりませんでした。

おそらく、適当な数を入れておくことで前回実行時刻を初期化するためだと思われます。(参考記事)

get_price(60)の数字を書き換えるだけで、コード全体に変化を反映させることができます。

コードを実行すると以下のようにデータを取得することができました。

また、get_price(300)と書き換えことで、5分足のデータを取得することもできました。

例えば、1時間足の価格を取得したい場合は、get_price(3600)となります。

まとめ

今回は、特に調べることが多くて苦労しました。

関数については、Python1年生という本も読みながら勉強を進めました。

以前買っておいた本が役だったのは嬉しいですね。

図解付きで分かりやすかったので、今後もお世話になりそうです。

設定した関数を呼び出す時に、返り値を先に書かなければいけないようですね。

メインの処理でget_price() = close_price , ~~と書いたら、コードを実行できませんでした。

こういうこともひとつひとつ解決していきたいです。

次回は、赤三兵の買いシグナルを定義して実行していきます。

-Bot