注目の投稿

今まで作成したエクセルツールまとめ

2018/05/23

第2回 仮想通貨取引所BitmexからOHLCVデータを取得するVBAプログラム -Excel VBA

仮想通貨取引所、Bitmexから価格と取引高の情報であるOHLCVデータをExcelで取得するVBAプログラムを公開したいと思います。

前回は、プログラムの主要な部分である公式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


他にもエクセルツールを作成しています!

ビットバンクからOHLCVデータを取得&表示するExcelツール  読取太郎





どんなに小さな額でもチップをいただけると嬉しいです!

Donate BTC: 1LcULwCQPjxLGXdpEJkhNkPpqCwG5csasU

Donate LTC: LSXEG7tjeCCGWuzvf5eFvJUZM6Xpvsdc4f




当エクセルツールから表示される情報は、
内容の正確性、信頼性等を保証するものではありません。
これらの情報に基づいて被ったいかなる損害についても、当サイトは一切の責任を負いません。
投資・投機に関するすべての決定は、利用者ご自身の判断でなさるようお願いいたします。


bitFlyer ビットコインを始めるなら安心・安全な取引所で