30分で作るBitfinexオープンポジション可視化システム① - とりあえずデータをとってくる

こんばんは。でめきん(@demekinnomimi)です。黒ラベル見てたら気分が悪くなってきたので、ロジックがオープンなBitfinexオープンポジション可視化システムを作っていこうと思います。眠いです。

インスパイア元を書こうとしたのですが、怒られそうなので、今回はやめておきます。

今回のシステムを作るにあたって考慮すること一覧

① 以下のAPIを用いて時間とサイド(Long or Short)とポジション数をInflux DB保存するpythonスクリプトを作るhttps://docs.bitfinex.com/v2/reference#rest-public-stats

② InfluxDBへ以下の情報を保存すること
'time' = 時間、'field' = ポジション数、高値、安値、'tag' = サイド

③ ①を cron で1分感覚で呼び出すこと

④ Web公開どうしよう

以上4点。

とりあえず有り合わせで作ったpython script

import json
import requests

from influxdb import InfluxDBClient

class influxDB():
    def __init__(self, user, password, db_name="bitfinex"):
        self.user = user
        self.password = password
        self.dbname = db_name
        self.client = InfluxDBClient("localhost", "8086", self.user, self.password, self.dbname)

    def insert_db(self, json_body):
        dbs = self.client.get_list_database()
        sample_db = {'name' : self.dbname}
        if sample_db not in dbs:
            self.client.create_database(self.dbname)
            rp_query = 'CREATE RETENTION POLICY ' + '"rp_365day" ON "' +  self.dbname+ '" DURATION 365d REPLICATION 1'
            self.client.query(rp_query)

        self.client.write_points(json_body)

if __name__ == '__main__':
    influx = influxDB('DBユーザーネーム', 'DBパスワード')

    timeout = 20
    headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36 "}
    with requests.get('https://api.bitfinex.com/v2/stats1/pos.size:1m:tBTCUSD:long/last', timeout = timeout, headers = headers) as response:
        html = json.loads(response.text)
        time = html[0]
        long_pos = html[1]
        tags_data = {"side":"Long"}
        fields_data = {"long_pos":str(long_pos)}
        insert_data = [{'measurement': "bitfinex_positions_1m", 'tags': tags_data,'time' : time, 'fields':fields_data}]
        influx.insert_db(insert_data)

    with requests.get('https://api.bitfinex.com/v2/stats1/pos.size:1m:tBTCUSD:short/last', timeout = timeout, headers = headers) as response:
        html = json.loads(response.text)
        time = html[0]
        short_pos = html[1]
        tags_data = {"side":"Short"}
        fields_data = {"long_pos":str(long_pos)}
        insert_data = [{'measurement': "bitfinex_positions_1m", 'tags': tags_data,'time' : time, 'fields':fields_data}]
        influx.insert_db(insert_data)

    #  [ MTS, OPEN, CLOSE, HIGH, LOW, VOLUME ]
    with requests.get('https://api.bitfinex.com/v2/candles/trade:1m:tBTCUSD/last', timeout = timeout, headers = headers) as response:
        html = json.loads(response.text)
        time = html[0]
        open = html[1]
        close = html[2]
        high = html[3]
        low = html[4]
        volume = html[5]
        fields_data = {"open":float(open), "close":float(close), "high":float(high), "low":float(low), "volume":float(volume)}
        insert_data = [{'measurement': "bitfinex_candles_1m", 'time' : time, 'fields':fields_data}]
        influx.insert_db(insert_data)

とりあえず格納したデータ

> select * from bitfinex_positions_1m
name: bitfinex_positions_1m
time          long_pos       side
----          --------       ----
1547397600000 31622.21617862 Long
1547397600000 31622.21617862 Short
1547397660000 31624.03561884 Long
1547397660000 31624.03561884 Short
1547397720000 31624.51364203 Long
1547397720000 31624.51364203 Short
1547397780000 31625.09460558 Long
1547397780000 31625.09460558 Short
> select * from bitfinex_candles_1m
name: bitfinex_candles_1m
time          close  high          low    open   volume
----          -----  ----          ---    ----   ------
1547397600000 3592.5 3592.5        3592.5 3592.5 0.144
1547397660000 3592.9 3594.55198694 3592.2 3593.5 2.46482735
1547397720000 3595.2 3595.7        3593.2 3593.2 5.26866054

cron優秀です。でも読み方クーロン派閥が強くてつらいです。眠いので続きは明日やります。おやすみなさい。

この記事が気に入ったらサポートをしてみませんか?