「5分置きにcryptpiaから、bitflyerの仮想通貨情報を取得したい」という依頼が来ました。
私は最初に、jupyterNotebookやAWSのサーバーを使って、pythonプログラムを無限ループで回すことを考えました。しかし、jupyterNotebookは常時稼働しているPCが要りますし、AWSは負荷が掛かりすぎると費用が発生してしまいます。
さて、どうしたものかと考えていたところ、依頼者はlolipopでwebsiteを開設していました。lolipopにはcronの機能がありますので、そちらを使うのが簡単・楽ちんと判断して、無事に開発・納品できました。
躓いた点を中心に説明していきます。
はじめに
まずは、ロリポップのSSHで、Pythonのバージョンが3.4以上になっていることを確認してください。
そして、Pythonモジュール(bitflyerのapi)をインストールしましょう。
python --version
python -m pip install pybitflyer --user
プログラムの説明
下記に全体のソースを纏めました。
中身のロジックを簡単に説明していきます。
・ファイルの初めに必ず記述して、エンコードはutf-8で保存しましょう。
# coding:utf-8
・bitflyerのapiから、注文数の最大値1000件を取得します。
#秒間の取引結果をgetする。
data = api.executions(product_code=name, count=1000)
・取得した最新日時から、10秒前の日時を取ります。
#10秒前日時の取得
time = datetime.strptime(data[0]['exec_date'][:19], '%Y-%m-%dT%H:%M:%S')
data_bef_10min = time + timedelta(seconds = store_time_sec)
・注文数分loopを回し、buyとsellで分けて数量を加算していきます。
for i in range(len(data)):
data_time = datetime.strptime(data[i]['exec_date'][:19], '%Y-%m-%dT%H:%M:%S')
#10秒間の取引量をget
if data_bef_10min < data_time:
if data[i]['side'] == "BUY":
ask_qty = ask_qty + float(data[i]['size'])
if data[i]['side'] == "SELL":
bid_qty = bid_qty + float(data[i]['size'])
・bitflyerのapiから、現在の価格を取得します。
#現在価格
prices = api.ticker(product_code=name)
ask = prices['best_ask']
bid = prices['best_bid']
・ログファイルに書き込みます。
f = open('/home/xxxx/x/xxxxxx-xxxxxxxxx/web/python/log_batch.txt', 'a')
# 引数の文字列をファイルに書き込む
f.write(str+"\n")
f.close()
cronの設定
・パーミッションの設定をします。
.pyファイルのパーミッションを700にしましょう。
・パスの設定をします。
Web以下のパスを記述します。
/home/xxxx/x/xxxxxxx-xxxxxxxxx/web/python/xxxxxxx.py
今回はpythonディレクトリの中に作成しましたので、下記のようになります。
python/xxxxxxx.py
まとめ
コピペして、ロジックを書き換えて頂ければ、簡単・楽ちんにバッチプログラムが組めて便利ですよ。
ロリポップのcronは、画面で設定できるのでcrontabの知識が無くても大丈夫です。