Hero img
ビットコインチャート作成[Influx-db]

influxdbにBTCのデータを保存しチャートを表示させる

時系列DBのInfluxDBにビットコインのデータを入れて表示させマス。


目次

  • 環境
  • BTCのデータをInfluxDBに保存する。
  • influxdb
  • api token
  • binance websocket
  • websocket接続
  • メッセージを受信する
  • InfluxDBに保存する
  • influxdbに接続するために
  • javascript code
  • 書き込み
  • まとめ

環境

  • Almalinux9
  • influxDV 2.7.1
  • node 20

BTCのデータをInfluxDBに保存する。

一番取引量が多い取引所のBinanceのデータをinfluxdbに保存させます。pyhonのサンプルは多いですが、いつもnodeなのでnode.jsで実装しました。
ここではnode.jsでbinanceにwebsocket接続をし、1m,5m,30分単位のデータを保存させます。

influxdb

まず、InfluxDBでBTC用のbucketを作成します。

crypto-influx-bucket-create crypto-influx-bucket-create2

このようにBTCが追加されました。

crypto-influx-bucket-btc

api token

node.jsでアクセスするためにapi tokenを作成します。
既にあれば不要です。

無い場合は新しく作成してください。

crypto-influx-api-generate

binance websocket

binanceAPIを参照し、データを取得します。簡単なのはhttp requestですが、リアルタイム性 速度が重要なため、websocketでデータを受信します。 公式

websocket接続

binanceにweboskcetで接続するためには、単純にwss://addressで接続が可能です。 アドレスにシンボル(銘柄),種類(データ種類),インターバルを加えます。


//ビットコイン
//通貨USDT
//1mローソク足
let symbol = "btcusdt"
let interval = "1m"

let socket = new WebSocket(`wss://stream.binance.com:9443/ws/${symbol}@kline_${interval}`);

メッセージを受信する

wesocketのメッセージ内容は、更新があった際データを受信します。そのため、1分の間に複数回受信されます。

socket.onmessage = (data)=>{
    let msgdata = JSON.parse(data.data);
    //ここ

}

それで、1分間のチャートが確定されたという情報は次の部分で判断できます。

socket.onmessage = (data)=>{
    let msgdata = JSON.parse(data.data);
    if(msgdata.k.x){
        //1m更新情報確定
    }

}


このdataは1mローソク足のopen,close,high,low,volumeが入っています。

msgdata.k  = {
    c: 1111,//クローズ
    o: 1111,//オープン
    h: 1111,//ハイ
    l: 1111,//ロー
    v: 1111,//ボリューム
}

InfluxDBに保存する

1mローソク足の情報が取れたので、次にデータベースに入れていきます。 必要な情報は influxdata/influxdb-client

  • organizations
  • buckets
  • API Token
  • Bucket name
  • field

influxdbに接続するために

まずはライブラリーを追加します。 公式

npm install --save @influxdata/influxdb-client
npm install --save @influxdata/influxdb-client-apis

必要なもの

InfluxDBで作成した情報を入れていきます。

organization
crypto-influx-organization
Bucket
crypto-influx-buckets
API token

API tokenは分からない場合は作成してください。

javascript code

Influxdbにjavascriptでアクセス、書き込みを行います。

import { InfluxDB, Point, ClientOptions } from '@influxdata/influxdb-client'
import WebSocket from "ws";
import dotenv from 'dotenv';
dotenv.config();
const symbol = "btcusdt";
const org = 'local';
const influxBucket = "BTC";
const influxPointname = "BTC/USDT"
let writeApi;

writeApi = influxdb.getWriteApi(org,influxBucket);

const point = new Point(influxPointname)
    .tag('interval', interval)
    .timestamp(data['t'] * 1e6)
    .floatField('close', parseFloat(data['c']))  // Changed from fields to field
    .floatField('open', parseFloat(data['o']))
    .floatField('high', parseFloat(data['h']))
    .floatField('low', parseFloat(data['l']))
    .floatField('volume', parseFloat(data['v']));

writeApi.writePoint(point);

書き込み

正常に書き込みができるとfilterにintervalが増えています。30mは30分後に正常に書き込みが完了しないと追加されません。そのため、1mが追加できていれば成功しているはずです。

crypto-influx-bucket-btc

グラフで見ると

crypto-influx-graph

まとめ

influxdbにBTCのデータを書き込むことができました。使っていると4h,1dが書き込めていない、5mが一定期間書き込めていない状況が発生していました。ログも確認しましたが、何もなく...何が問題なのかもう少し長期で様子見をする必要がありますが、安定してデータを取得できました。
influxdbでグラフで見ることができますが、grafanaがやっぱりカスタマイズできるのでgrafanaも入れる方が良いと思いました。

関連記事

コメント

コメントを書く

質問や、間違いがありましたら、お気軽にどうぞ

※お名前とコメントの内容を入力してください。
※全てこのブログ上に公表されます。
※許可なく管理者によって修正・削除する場合がございます。 詳しくはプライバシーポリシーを参照ください