VBAによる仮想通貨ビットコイン自動売買入門

ビットコイン売買補助ツール


仮想通貨取引を効率的に

さて取引所のサイトやアプリで簡単に取引を行うことはできますが、自分に合ったスタイルで面白味のある取引を行うという観点から、自分で仮想通貨の売買を補助するためのプログラムを作ってみようというのが本サイトの趣旨の一つであります。

ある意味ここからが本題となりますが、エクセルVBAを使用するため、最低限エクセルとインターネットエクスプローラー(IE)はご用意ください。

また、bitflyerでの取引を行うため、口座をお持ちでない場合は口座開設をお願いします。
ビットフライヤーの紹介

プログラミングのイメージ

↑※画像はイメージです。VBAとは関係ありません

まずは実際に取引を行うサイトを開いた状態で、取引の補助を行うための機能を持ったツールを作ってみることにしましょう。

エクセルを仕事や勉強で使ったことがある人でも、VBAを使えるという人は少ないかもしれません。

VBAとはVisual Basic for Applicationsの略で、簡単に言うとエクセルやアクセス等、Microsoft Officeのアプリケーション上で動作するプログラムを作成するためのプログラミング言語です。

対象の製品がインストールされていれば使用することができるため、手軽にプログラムを作って試すことができます。

VBAの基本的なところは入門サイトをご覧になっていただくとして、WEB操作に必要な部分だけを簡単に説明していきます。

ここではbitFlyerのビットコイン取引所サイトで売買の補助を行うプログラムを作ってみましょう。

bitFlyerのビットコイン取引所では売り気配、買い気配、最終約定価格がリアルタイムで更新されていますが、発注を行いたい場合には取引単位と価格を入力して「買い」か「売り」のボタンをクリックする必要があります。

気配値をクリックすることでその価格を指値として入力することはできますが、そこから価格を変更したい場合、新しい値を入力している間に価格が変動してしまって思ったように注文できないことも多いと思います。

この点をスムーズに行うために、必要な価格情報を自動的に取得し、自動的に最適な値を入力する作業をプログラムに行わせることを考えます。

それができればあとは買いか売りかをクリックすることに集中すればよく、短期売買を長時間にわたって繰り返す場合の疲労を軽減できるはずですし、誤入力、誤発注を減らすことにもつながります。

PC前の猫


ビットフライヤーのBTC注文入力ツール

以下にサンプルコードを載せますが、注意点がいくつかあります。

まず、新しいブックを作成し、以下のようなシートを作成してください。特に実行間隔のところは今回プログラムから参照するので大事です。

売買補助シートの準備

次にVBAからIEを扱いやすくするために、VBEを開いたらツールバーのツール→参照設定→参照可能なライブラリファイルの中から、『Microsoft Internet Controls』と『Microsoft HTML Object Library』を探してチェックしてください。

また、以下のサンプルでVBAから出力する計算式の結果を反映させるために、エクセルのオプション→数式→数式の処理の中から、R1C1参照形式を使用するにチェックを入れてください。この設定は数式を自分で入力するのであれば必要ありません。


売買補助ツールサンプルプログラム


Option Explicit

Type Place '操作位置構造体
    amount As Variant '数量
    price As Variant '価格
End Type

Public page As HTMLDocument '取引画面
Public order As Place '操作位置
Public tradeCount As Long '取引回数

Sub InitTrade() '初期設定処理

    Const siteURL = "https://bitflyer.jp/ja-jp/login?top_link" 'サイトURL(※参考、未使用)
    Const siteTitle = "ビットコイン取引所 - 仮想通貨ビットコイン(Bitcoin)の購入/販売所/取引所 【bitFlyer】" 'サイト名
    Dim element '要素を探すための一時変数
    For Each element In CreateObject("Shell.application").Windows 'Shellオブジェクト
        If element.Name = "Internet Explorer" Then '起動中のIEを探す
            If element.LocationName = siteTitle Then
                Set page = element.document 'ページをIEにセット
                Exit For
            End If
        End If
    Next
    If page Is Nothing Then
        Exit Sub 'IEで取引画面を開いていなければ終了
    End If
    
    order.amount = page.getElementsByClassName("form-control input_size") '数量入力位置
    order.price = page.getElementsByClassName("form-control input_price") '価格入力位置
    
    Set element = Nothing
    tradeCount = 1 '情報取得回数の初期値
    Call TradeBCT
End Sub

Sub TradeBCT() '情報取得及び注文入力処理

    Dim bidList As New Collection '売り指し値リスト
    Dim askList As New Collection '買い指し値リスト
    Dim ask, td
    For Each ask In page.getElementsByClassName("ita-asks") 'tr要素
        For Each td In ask.getElementsByTagName("td") 'td要素
            If td.Style.Color = "rgb(96, 148, 80)" Then
                bidList.Add td.innerText '売り指値を追加
            ElseIf td.Style.Color = "rgb(217, 83, 79)" Then
                askList.Add td.innerText '買い指値を追加
            End If
        Next
    Next
    
    Dim lastTime As String
    Dim lastPrice As Long
    Dim i As Long
    For Each ask In page.getElementById("trade-body").Children 'tr要素
        i = 0
        For Each td In ask.getElementsByTagName("td") 'td要素
            If i = 0 Then '時刻
                lastTime = td.innerText
                i = i + 1
            ElseIf i = 1 Then '価格
                lastPrice = td.innerText
                Exit For
            End If
        Next
        Exit For
    Next
    
    '取得した情報を出力
    Cells(tradeCount + 1, 1) = tradeCount '回数
    Cells(tradeCount + 1, 2) = lastTime '取引時刻
    Cells(tradeCount + 1, 3) = lastPrice '最終価格
    If tradeCount > 5 Then
        For i = 0 To 5
            If Cells(tradeCount - i, 3) <> lastPrice Then
                Exit For
                If i = 5 Then
                    Stop '同じ価格が連続
                End If
            End If
        Next
    End If
    Dim price
    i = 1
    For Each price In bidList
        Cells(1 + i, 8) = price
        i = i + 1
    Next
    For Each price In askList
        Cells(1 + i, 9) = price
        i = i + 1
    Next
    
    '注文入力処理
    order.amount.innerText = 0.01 '0.01BTCを指定
    Dim buy As Double, sell As Double
    Dim tradeType As String
    Dim targetPrice As Long
    sell = Abs(bidList(bidList.Count) - lastPrice)
    buy = Abs(lastPrice - askList(1))
    If sell > buy Then
        targetPrice = bidList(bidList.Count) - 10
        tradeType = "売り"
        Cells(8, 8) = tradeType
        Cells(7, 9) = ""
    Else
        targetPrice = askList(1) + 10
        tradeType = "買い"
        Cells(8, 8) = ""
        Cells(7, 9) = tradeType
    End If
    order.price.innerText = targetPrice '指値を入力
    
    Cells(tradeCount + 1, 4) = targetPrice '指値をセルに出力
    Cells(tradeCount + 1, 5) = tradeType '買いか売りかをセルに出力
    Cells(tradeCount + 1, 6) = "=IF(R[1]C[-3]>0,IF(RC[-1]=""売り"",RC[-2]-R[1]C[-3],R[1]C[-3]-RC[-2]),0)" '注文結果確認用の判定式をセルに出力
        
    DoEvents
    tradeCount = tradeCount + 1
    Application.OnTime Time + TimeSerial(0, 0, Cells(2, 12)), "TradeBCT"  '指定秒後に呼び出し
End Sub
	 	

サンプルプログラムの解説

まず、サイト上で入力すべき対象(数量、価格入力欄)を保持するための操作位置構造体を定義しています。

次に、取引画面、操作位置、取引回数を使いまわすため、publicで宣言しています。

初期設定処理(InitTrade)では、開かれているIEでビットフライヤー取引所サイトを探し、見つかれば数量入力位置、価格入力位置を取得してから情報取得及び注文入力処理(TradeBCT)を呼び出します。

このプログラムはIEを起動してビットフライヤーのサイトへ移動し、ログインしてビットコイン取引所が表示されている状態で実行することを前提としていますのでご注意ください。

情報取得及び注文入力処理(TradeBCT)では、最新の取引価格、買い指値、売り指値の一覧を取得してエクセルに出力します。

このとき、最終取引価格と最も約定に近い買い指値、売り指値を比較し、その差に応じて売りか買いか及びその際の指値を出力しています。

価格取得と価格の自動入力

↑売りか買いかの判定と注文価格の更新が自動的に行われている

この際に採用した指値をサイト上の価格入力欄にも自動入力していますので、あとは買いか売りのボタンを押すだけで余計なことを考えずに簡単に売買することが可能です。

なお最新の情報を取得して注文内容を更新する処理を呼び出すまでの時間はシート(※cells(2,12)に指定した実行間隔の値)から読み込むようにしています。


実行時の注意点

サンプル中で売りか買いかを判断して指値を決定する部分はあくまで仮の判定ロジックであることに注意してください。適宜書き換えるなどして自己責任でお試しください。

サンプルでは『order.amount.innerText = 0.01 '0.01BTCを指定』のところで、常に0.01BTCを数量指定するようになっており、途中で単位を変えたい場合に邪魔されます。

数量誤入力で大惨事…ということを避ける意味でも数量についてはこの部分をコメントアウトするなりして手動で入力するか、少ない数量を指定しておくようにしたほうがよいと思います。

また、指値で発注しただけではその価格で約定するのかは分かりません。発注操作後は注文履歴のステータスを確認するようにしてください。

なお、サンプルで出力される仮想収益は1回の取引で1単位のビットコインを売買したものとして算出しています。


取引の成績を評価する

サンプルは前述したように仮の判定による売買決定ですが、実際にこの判定にもとづいてすべての機会で発注し、約定したと仮定した場合の成績を見てみましょう。

仮想収益の列に一回の取引の収益が表示されていますので、そのまま計算してみます。

判定ロジックに基づく仮想収益の評価

↑17:36~17:41までの約5分間、50回の取引で14897円の利益

繰り返しますが、上記の利益はあくまで全ての注文が発注価格で約定した場合に対する仮想収益であることに注意してください。

この売買補助ツールでは手動でボタンを押すため1秒程度のタイムラグは発生しますし、取引手数料も考慮していません。

…ですがいかがでしょう、この結果を見てわくわくしませんか?

既にお気づきとは思いますが、この履歴からロジックの成績を評価するという作業には重要な意味があります。

いま、仮の売買判定にもとづいた取引結果を評価することができましたが、この履歴に対して様々な判断ロジックを適用してそのロジックの成績を評価(バックテスト)することができます。

過去の値動きに対して次にどう動くかを予想する手法は株取引やFXなどにおいて古くからテクニカル指標として研究されてきた歴史があり、一定の信頼が蓄積されています。

売買補助ツールによって任意の秒刻み価格推移を取得でき、様々な判断ロジックを簡単に試すことができることにより、値動きの規則性や隠れた法則を探す楽しみが生まれるはずです。

その先に大きな可能性が見えてくるように感じていただければ幸いです。

続いて、『補助』ではなく『自動売買(取引)』ツールを作成してみましょう。

自動売買は最終的に人の手で発注を行うのとは異なるため、慎重に行う必要があります。

プログラミング的にも若干ハードルが上がるため、十分に取引やプログラミングの経験を積んでから取り組むことをおすすめします。

取引における基本戦略の検討

仮想通貨自動取引ツール