【python】lolipopでバッチを定期実行する【cron】

IT技術系

「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の知識が無くても大丈夫です。