注目の投稿

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

2018/05/27

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

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

前回は、JSON形式データ取得後のExcelシート上にデータを表示する配列処理のプログラムについてお伝えします。

前回までのプログラムはこちら↓
第1回 仮想通貨取引所BitmexからOHLCVデータを取得するVBAプログラム -Excel VBA

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



今回は前回のプログラムの改良版となります。前回はベースとなる時間足データ取得から3分足などの任意の時間足を集計するところまでセルに出さずに配列変数内で処理していましたが、それだと処理速度が遅くなってしまったため、今回は時間足データ取得後に一旦セルに出力し、worksheetfunctionを使用して集計し、集計結果をまたセルに出力したいと思います。

ちなみに、このプログラムは約70万行の1分足のOHLCVデータを約2分程度で取得して表示します。環境は私個人の普通のPCです。努力次第でまだ速くなるかもしれません。



それでは早速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, ",")
’ベース時間足
    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)

    i = i + 1
    a = 0
Loop
’ここからベース時間足以外の時間足を集計
MaxRow = Cells(Rows.Count, 7).End(xlUp).Row

If binsize <> "1m" And binsize <> "5m" And binsize <> "1h" And binsize <> "1d" Then

    For j = 0 To MaxRow - 1 Step stick

         utm_arr(a) = Cells(1 + j, 12).Value
         opn_arr(a) = Cells(1 + j, 7).Value
         cls_arr(a) = Cells(1 + j, 10).Value
         max_arr(a) = WorksheetFunction.max(Range(Cells(1 + j, 8), Cells(stick + j, 8)))
         min_arr(a) = WorksheetFunction.min(Range(Cells(1 + j, 9), Cells(stick + j, 9)))
         vol_arr(a) = WorksheetFunction.Sum(Range(Cells(1 + j, 11), Cells(stick + j, 11)))
         a = a + 1
    Next
 
    For j = 0 To a - 1
        Region(j + 1, 6) = utm_arr(j)
        Region(j + 1, 1) = opn_arr(j)
        Region(j + 1, 2) = max_arr(j)
        Region(j + 1, 3) = min_arr(j)
        Region(j + 1, 4) = cls_arr(j)
        Region(j + 1, 5) = vol_arr(j)
    Next

    Range("G:T").Clear
 
Dim RowMax As Long
    '1次元目の要素数を取得
    RowMax = UBound(Region, 1) - LBound(Region, 1) + 1
    'Rangeで開始セルから貼り付ける
    Range("G1").Resize(RowMax, 6).Value = Region
 
Else: End If


このプログラムよりも良い記述の仕方があるかもしれません。今回は大量のデータを扱いますので、for文を1個追加しただけで速度が大分落ちてしまいます。そのためできるだけfor文を使用しないように一括処理を考えて記述しました。

WorksheetFunctionやRangeをうまく使えば、コードが少なくて済み、処理速度が向上します。前回の第2回のプログラムでは20、30分くらいかかる処理が今回のプログラムでは2,3分程度になりました。ポイントは一括処理をできるだけ増やすことです。


さて、次回はプログラムの最初から最後までの全体についてお伝えします。




次回に続く




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


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


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

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





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

Donate BTC: 1LcULwCQPjxLGXdpEJkhNkPpqCwG5csasU

Donate LTC: LSXEG7tjeCCGWuzvf5eFvJUZM6Xpvsdc4f




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


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