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