前回は、プログラムの主要な部分である公式APIからのJSON形式データの読み込みの仕方をお伝えしました。
今回は、JSON形式データ取得後のExcelシート上にデータを表示するプログラムについてお伝えします。
前回はAPIを利用してJSONデータを取得したところまでをお伝えしました。前回のプログラムはこちら↓
仮想通貨取引所BitmexからOHLCVデータを取得するVBAプログラム -Excel VBA
今回は前回からの続きのプログラムとなります。
それでは早速VBAコードを見てみましょう。
・VBAコード
まず、全体のプログラムです。
流れとしては、取得したJSONデータを配列変数に格納し、セルに出力します。
今回は公式APIから公開されている時間足(1分足、5分足、1時間足、日足)だけでなく、それを利用して3分足、15分足、30分足、2時間足、週足などのデータを集計しています。
変数名の付け方など細かいところで微妙な部分があるかもしれませんが、そのへんはスルーでお願いします。
tmp1 = Split(CryptoJSON.t, ",")
tmp2 = Split(CryptoJSON.o, ",")
tmp3 = Split(CryptoJSON.h, ",")
tmp4 = Split(CryptoJSON.l, ",")
tmp5 = Split(CryptoJSON.c, ",")
tmp6 = Split(CryptoJSON.v, ",")
If binsize = "1m" Or binsize = "5m" Or binsize = "1h" Or binsize = "1d" Then
Range(Cells(1 + i * 10000, 12), Cells(i * 10000 + UBound(tmp1), 12)) = WorksheetFunction.Transpose(tmp1)
Range(Cells(1 + i * 10000, 7), Cells(i * 10000 + UBound(tmp2), 7)) = WorksheetFunction.Transpose(tmp2)
Range(Cells(1 + i * 10000, 8), Cells(i * 10000 + UBound(tmp3), 8)) = WorksheetFunction.Transpose(tmp3)
Range(Cells(1 + i * 10000, 9), Cells(i * 10000 + UBound(tmp4), 9)) = WorksheetFunction.Transpose(tmp4)
Range(Cells(1 + i * 10000, 10), Cells(i * 10000 + UBound(tmp5), 10)) = WorksheetFunction.Transpose(tmp5)
Range(Cells(1 + i * 10000, 11), Cells(i * 10000 + UBound(tmp6), 11)) = WorksheetFunction.Transpose(tmp6)
ElseIf binsize <> "1m" Or binsize <> "5m" Or binsize <> "1h" Or binsize <> "1d" Then
ReDim tmpT(stick - 1) As Long
ReDim tmpO(stick - 1) As Double
ReDim tmpH(stick - 1) As Double
ReDim tmpL(stick - 1) As Double
ReDim tmpC(stick - 1) As Double
ReDim tmpV(stick - 1) As Double
ReDim utm_arr((UBound(tmp1) \ stick) - 1) As Long
ReDim opn_arr((UBound(tmp1) \ stick) - 1) As Double
ReDim cls_arr((UBound(tmp1) \ stick) - 1) As Double
ReDim max_arr((UBound(tmp1) \ stick) - 1) As Double
ReDim min_arr((UBound(tmp1) \ stick) - 1) As Double
ReDim vol_arr((UBound(tmp1) \ stick) - 1) As Double
For j = 0 To (UBound(tmp1) \ stick) - 1
For i = 0 To stick - 1
tmpT(i) = Join(WorksheetFunction.Index(tmp1, 0, i + 1 + (j * stick)), ",")
tmpO(i) = Join(WorksheetFunction.Index(tmp2, 0, i + 1 + (j * stick)), ",")
tmpH(i) = Join(WorksheetFunction.Index(tmp3, 0, i + 1 + (j * stick)), ",")
tmpL(i) = Join(WorksheetFunction.Index(tmp4, 0, i + 1 + (j * stick)), ",")
tmpC(i) = Join(WorksheetFunction.Index(tmp5, 0, i + 1 + (j * stick)), ",")
tmpV(i) = Join(WorksheetFunction.Index(tmp6, 0, i + 1 + (j * stick)), ",")
Next
utm_arr(a) = tmpT(0)
opn_arr(a) = tmpO(0)
cls_arr(a) = tmpC(stick - 1)
max_arr(a) = WorksheetFunction.max(tmpH)
min_arr(a) = WorksheetFunction.min(tmpL)
vol_arr(a) = WorksheetFunction.Sum(tmpV)
a = a + 1
Next
For j = 0 To a - 1
Cells(j + 1, 12) = utm_arr(j)
Cells(j + 1, 7) = opn_arr(j)
Cells(j + 1, 8) = max_arr(j)
Cells(j + 1, 9) = min_arr(j)
Cells(j + 1, 10) = cls_arr(j)
Cells(j + 1, 11) = vol_arr(j)
Next
それでは部分ごとに見ていきましょう。
オブジェクトCryptoJSONからそれぞれt, o, h, l , c, vのデータを配列にしてtmp1~6のvariant型変数に格納しています。JSONデータはカンマ区切りになっているのでsplit関数で配列にします。
tmp1 = Split(CryptoJSON.t, ",")
tmp2 = Split(CryptoJSON.o, ",")
tmp3 = Split(CryptoJSON.h, ",")
tmp4 = Split(CryptoJSON.l, ",")
tmp5 = Split(CryptoJSON.c, ",")
tmp6 = Split(CryptoJSON.v, ",")
時間足が1分足、5分足、1時間足、日足の場合、先程配列にしたデータをそのままシート上のセルに入力します。縦向き(行方向)にデータを入力するためWorksheetFunction.Transpose()を使用します。細かいですが1次元から2次元配列にしています。
If binsize = "1m" Or binsize = "5m" Or binsize = "1h" Or binsize = "1d" Then
Range(Cells(1 + i * 10000, 12), Cells(i * 10000 + UBound(tmp1), 12)) = WorksheetFunction.Transpose(tmp1)
Range(Cells(1 + i * 10000, 7), Cells(i * 10000 + UBound(tmp2), 7)) = WorksheetFunction.Transpose(tmp2)
Range(Cells(1 + i * 10000, 8), Cells(i * 10000 + UBound(tmp3), 8)) = WorksheetFunction.Transpose(tmp3)
Range(Cells(1 + i * 10000, 9), Cells(i * 10000 + UBound(tmp4), 9)) = WorksheetFunction.Transpose(tmp4)
Range(Cells(1 + i * 10000, 10), Cells(i * 10000 + UBound(tmp5), 10)) = WorksheetFunction.Transpose(tmp5)
Range(Cells(1 + i * 10000, 11), Cells(i * 10000 + UBound(tmp6), 11)) = WorksheetFunction.Transpose(tmp6)
3分足、15分足、30分足、2時間足、週足のデータを集計します。
可変配列変数により、足数を変更しています。stick変数が足数です。
ElseIf binsize <> "1m" Or binsize <> "5m" Or binsize <> "1h" Or binsize <> "1d" Then
ReDim tmpT(stick - 1) As Long
ReDim tmpO(stick - 1) As Double
ReDim tmpH(stick - 1) As Double
ReDim tmpL(stick - 1) As Double
ReDim tmpC(stick - 1) As Double
ReDim tmpV(stick - 1) As Double
ReDim utm_arr((UBound(tmp1) \ stick) - 1) As Long
ReDim opn_arr((UBound(tmp1) \ stick) - 1) As Double
ReDim cls_arr((UBound(tmp1) \ stick) - 1) As Double
ReDim max_arr((UBound(tmp1) \ stick) - 1) As Double
ReDim min_arr((UBound(tmp1) \ stick) - 1) As Double
ReDim vol_arr((UBound(tmp1) \ stick) - 1) As Double
WorksheetFunction.Indexでt, o, h, l , c, vの配列tmp1~6から集計に必要な足数だけtmpT~Vに移します。stickには3分足の場合、3が入ります。
その後、高値ならばmax関数、出来高ならsum関数を使用して集計して配列に格納します。
For j = 0 To (UBound(tmp1) \ stick) - 1
For i = 0 To stick - 1
tmpT(i) = Join(WorksheetFunction.Index(tmp1, 0, i + 1 + (j * stick)), ",")
tmpO(i) = Join(WorksheetFunction.Index(tmp2, 0, i + 1 + (j * stick)), ",")
tmpH(i) = Join(WorksheetFunction.Index(tmp3, 0, i + 1 + (j * stick)), ",")
tmpL(i) = Join(WorksheetFunction.Index(tmp4, 0, i + 1 + (j * stick)), ",")
tmpC(i) = Join(WorksheetFunction.Index(tmp5, 0, i + 1 + (j * stick)), ",")
tmpV(i) = Join(WorksheetFunction.Index(tmp6, 0, i + 1 + (j * stick)), ",")
Next
utm_arr(a) = tmpT(0)
opn_arr(a) = tmpO(0)
cls_arr(a) = tmpC(stick - 1)
max_arr(a) = WorksheetFunction.max(tmpH)
min_arr(a) = WorksheetFunction.min(tmpL)
vol_arr(a) = WorksheetFunction.Sum(tmpV)
a = a + 1
Next
集計したデータをセルに入力します。
For j = 0 To a - 1
Cells(j + 1, 12) = utm_arr(j)
Cells(j + 1, 7) = opn_arr(j)
Cells(j + 1, 8) = max_arr(j)
Cells(j + 1, 9) = min_arr(j)
Cells(j + 1, 10) = cls_arr(j)
Cells(j + 1, 11) = vol_arr(j)
Next
今回は慣れているという理由で1次元、2次元配列を使用しましたが、別の方法として連想配列を使用するやり方もあると思います。また機会があれば連想配列についても記事にできればと思います。
次回は処理速度を上げるために改良したプログラムをお伝えします。
次回に続く
第1回 仮想通貨取引所BitmexからOHLCVデータを取得するVBAプログラム -Excel VBA
他にもエクセルツールを作成しています!
どんなに小さな額でもチップをいただけると嬉しいです!
Donate BTC: 1LcULwCQPjxLGXdpEJkhNkPpqCwG5csasU
Donate LTC: LSXEG7tjeCCGWuzvf5eFvJUZM6Xpvsdc4f
当エクセルツールから表示される情報は、
内容の正確性、信頼性等を保証するものではありません。
これらの情報に基づいて被ったいかなる損害についても、当サイトは一切の責任を負いません。