チェンライ二日連続晴天。
ビットコイン、どっかーーっと景気良く価格急上昇で年金確保!と行きたいところですが、、 あと10倍ぐらいに、早いことたのんませう。
ビットコインの価格を所得して、Grafanaでグラフ化します。
さて、日々トレードなどをしているわけではないので、 とりあえず上記のような裏で流れを確認するくらいの感覚のものを、と考えてます。
価格の推移とか、他の為替との関連性など、をチラッと見れればよいなと、、
まぁ、改めて見ると、値動きがすごいですねぇ。。
事前準備
まずはinfluxDBにて、新しいデーターベスfinance
を作ります。(お好きな名前に変更してください)
pi@tacos:~ $ influx
Connected to http://localhost:8086 version 1.7.7
InfluxDB shell version: 1.7.7
> create database finance
> show databases
name: databases
name
----
_internal
telegraf
finance
> exit
外部との接触のないサーバーですので、セキュリティーは考慮してません。 ザルですので、外部に開いている環境の方はくれぐれも対策を施してください。
API
ビットコインの取引価格の所得をします。 取引所各所からAPIが提供されているようですが、面倒もなく有名どころのBitflyerさんを利用させていただきます。 パイソンのライブラリーも提供されています。
インストールは、pipで一発、
pi@raspberry:~ $ pip install pybitflyer
-bash: pip: command not found
と、色々入れているからすでに入ってるだろうと思いまいしたが、 インストールされていなくて嫌われる。
でも、gemみたいで、あんまり好きでないんですよね。。 さて、パイソンのバージョンを確かめたところ、
pi@raspberry:~ $ python --version
Python 2.7.16
pi@raspberry:~ $ python3 --version
Python 3.7.3
いつの間にか2つのバージョンがインストールされている。
3.5より上のバージョンでは、python3-pip
というパッケージがあるようなので、
新しい方をインストールする。
pi@raspberry:~ $ sudo apt install python3-pip
pi@raspberry:~ $ pip3 install pybitflyer
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting pybitflyer
Downloading https://www.piwheels.org/simple/pybitflyer/pybitflyer-0.1.9-py3-none-any.whl
Requirement already satisfied: requests in /usr/lib/python3/dist-packages (from pybitflyer) (2.21.0)
Installing collected packages: pybitflyer
Successfully installed pybitflyer-0.1.9
pi@raspberry:~ $
これにて、事前の準備完了。次はデーターの取り込み等を行います。
データの取込・登録
pythonでデーターを落とし、そのままinfluxDBへ登録も一発で出来ます。
(influxDB用のパイソン・モジュールがあります。)
でもなぜか、以前書いたスクリプトが、
JASON -- jq --> sh
でinfluxDBへ登録という形を取っていたので、
そのまま踏襲しました。(なんでこうやった??自問。でも不問。)
適当なシェル・スクリプトですので参考まで、、
まず、JSON形式のデータをbashで扱うためにjq
というライブラリーが必要ですので、
インストールします。
pi@raspberry:~ $ sudo apt install jq
値の所得は、パイソン・スクリプトでJSON形式で落とします。
get_btc_jpy.py
を作り編集し、実行権を与えておきます。
pi@raspberry:~ $ sudo vi /usr/local/bin/get_btc_jpy.py
import pybitflyer
import json
api = pybitflyer.API()
print(json.dumps(api.ticker(product_code = "BTC_JPY"),sort_keys=True, indent=4))
pi@raspberry:~ $ sudo chmod +x /usr/local/bin/get_btc_jpy.py
単なる書き出しスクリプトなのでファイルbtc_jpy.json
に落とすには、以下のようにして保管します。
python3 /usr/local/bin/get_btc_jpy.py > /<<書き出し先>>/btc_jpy.json
次にそのファイルをシェルで整形してデーターベースへ登録します。
update_btc_jpy.sh
というファイルを作ります
ltpは最終取引価格(Last Time Price)。お好みのようにご変更のほど、
InfluxDBへの登録はcurl
を使って放り込みます。
curl -XPOST "http://$INFLUXDB_HOST:$INFLUXDB_PORT/write?db=$INFLUXDB_DATABASE" -d "currency,code=BTC_JPY exchage_rate=$ltp,ask=$best_ask,bid=$best_bid,volume=$volume $timestamp"
最初の部分は登録するデーターベース設定、後半は登録する内容になります。
ちょっと分解して、前半は以下のようにホスト・ポート・データーベース名。
http://$INFLUXDB_HOST:$INFLUXDB_PORT/write?db=$INFLUXDB_DATABASE
で後半部
"currency,code=BTC_JPY price=$ltp,ask=$best_ask,bid=$best_bid,volume=$volume $timestamp"
を少し細かく見ると、
- currency:テーブルのヘッダーの様な感じ
- code=BTC_JPY:タグ
- price=$ltp:残り部分は数値(小数点の位置などは後々変更可能)
- $timestamp:最後に時間(ちょっとフォーマットが独特)
になります。
データーベースに関しての理解はあまりないのですが、
finance(DB) > currency (他:銀行口座 [savings]など) > code: BTC_JP (例:JPY_USD、貯金額など)
という感じでよいのかな。。と思ってます。。
減っていくばかりの銀行口座の残高もトラッキングしようかなと思ってます。(地獄の可視化)
#!/bin/bash
#
# update_btc_jpy.sh
#
# OUTPUT
# {
# "best_ask": 583895.0,
# "best_ask_size": 0.50000013,
# "best_bid": 582811.0,
# "best_bid_size": 0.385,
# "ltp": 583651.0,
# "product_code": "BTC_JPY",
# "tick_id": 21304010,
# "timestamp": "2019-04-08T00:44:56.163",
# "total_ask_depth": 1247.87214404,
# "total_bid_depth": 1694.48375804,
# "volume": 690365.02082555,
# "volume_by_product": 5587.33741726
# }
#
python3 /usr/local/bin/get_btc_jpy.py > /home/pi/.finance/btc_jpy.json
INFLUXDB_HOST=127.0.0.1
INFLUXDB_PORT=8086
INFLUXDB_DATABASE=finace
JSON=`cat /home/pi/.finance/btc_jpy.json`
# parse json
timestamp=$(date +%s%N)
product_code=$(echo ${JSON} | jq ".product_code")
ltp=$(echo ${JSON} | jq ".ltp")
best_ask=$(echo ${JSON} | jq ".best_ask")
best_bid=$(echo ${JSON} | jq ".best_bid")
volume=$(echo ${JSON} | jq ".volume_by_product")
## Write to InfluxDB
curl -XPOST "http://$INFLUXDB_HOST:$INFLUXDB_PORT/write?db=$INFLUXDB_DATABASE" -d "currency,code=BTC_JPY price=$ltp,ask=$best_ask,bid=$best_bid,volume=$volume $timestamp"
そして、このスクリプトをバックグラウンドで自動的に走らせます。毎分更新での設定になってます。
pi@raspberry:~ $ crontab -e
# Edit this file to introduce tasks to be run by cron.
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
* * * * * /home/pi/scripts/update_btc_jpy.sh
5分おきに更新したいのでであれば、
*/5 * * * * /home/pi/scripts/update_btc_jpy.sh
私は売り買いが激しい人でないので、15分おきにしました。 (値動きが激しいので、少しこまめにチェック。)
*/15 * * * * /home/pi/scripts/update_btc_jpy.sh
これで、取り込みと、データーベースへの登録が完了。
Grafana
取り込んだデーターをGrafanaを使って表示します。 データーソースの登録とグラフの作成が必要になります。 sqlの知識のある人は複雑なグラフを作り出すことも可能です。 (あたしゃにはちょっと、、ぼらりてぃーとかも必要ないし、、)
さて、
データーソースの登録
デーダーベースを登録します。 パスワードの設定などもしていないので、基本デフォルトの設定で問題ないです。 割とすっきりアクセスできます。
まずは、左の歯車のアイコンより、データーソースへ、
ちょっと、既に幾つかありますが、右上部の追加を押します。そして、influxdbを選択します。
登録名、接続ポート(デフォルト)を設定、データーベース名を記入して、
保存・確認ボタンを押し、エラーがなければ接続完了です。
グラフの作成。
色々できます。ヒゲのついた奴とかも出来るんか?はちょっと分かりませんが、、 とりあえず簡単な状況情報、折れ線グラフの2種類を作成します。
状況情報:シングル・スタッツ
まずは、所有額の表示。どかっと、保持コインの総額を表示します。(とりあえず、パイ・サーバーちゅうことで、3.141592653589793
で計算します。)
一喜一憂しないようにしてくださいね。目標額との差額表など、お好みのように変更してください。
グラフアイコンのパネルアイコンをクリックします。ビジュアルを最初に選択します。
シングルスタットをえらびます。
表示するデーターを設定していきます。
クエリーの欄では、先ほど設定したデーターソースを選択。
表示データーは、データーソースのcurrency: code:BTC_JPY
になります。
そして、総額表示のため、価格の後に計算を追加します。この場合、3.1415..をかけてます。
総額が表示されます。グラフの設定は左の大きなグラフのアイコンで行います。 単位を円通貨にします。円マーク付きで総額表示されます。微妙。。
パネルのタイトルは左の大きめのアイコンの一番下より変更します。
グラフ
パネル追加より、Add Query
でグラフ表示になります。
グラフを選択してスタートすることもできます。
表示するデーターの設定を行います。基本上記のシングル・スタッツと同じです。
データーソースの内のcurrency
とcode:BTC_JPY
、select: price
を選びます。
更新タイミングと、グラフのインターバルの設定があっていないと、 ドット表示になってしまうことがあります。
5分更新であればインターバルを5分に設定します。 クリックして任意の間隔に設定することもできます。
タイトルを設定します。
簡単に流れを書きましたが、 色々とできるので自分の環境に合わせて追加変更してください。
GrafanaとInfluxDBのインストールは以下、ご参考のほど、
と、現在は外国為替情報も追加したりしてます。 表示方法は基本この作業と同じ感じ流れになると思います。 各所戻ってくるデーターの扱いが異なったりしてちょっと厄介。。、 そちらも後々ポストします。
おまけ
簡単なシステムです。現在パイ・3A+で運用してますが、 パイ・ゼロでも、一つ二つだけのアプリケーションならば、スムーズに動きます(ゼロ:パイホールとグラファナで実証済み)ので、 専属サーバーとして動かしても面白いかも。