仮想通貨に全ツッパ

仮想通貨投資の記録とプログラマーとしての技術備忘録の日記です。

bitbankで自動取引(bot)を試してみた

f:id:hotkou:20180120150513j:plain

こんばんわ。

今回は、bitbankでAPIを使用して自動取引を試してみました。

自動売買ツールについて

最近は、なみなみと上がったり下がったりで、ここしばらくドカンと来ないですね。
XRP(リップル)について、3/6は10%くらい上がりましたが、すぐに戻っちゃいました。
何かニュースがあったようですが、聞いた気がするけどもう記憶から消し飛んでしまいました。

今回何がしたいかというと、このまま並々の状態ならサヤ抜きできそうな気がしたので自動取引したいなと思いました。
寝ているときも、本業中でもトイレ行っている時も、パソコンちゃんに自動で取引していただき、利益を得てくだされば最高です。不労所得の第一歩です。
体は1つしかありませんので、自分の分身を作りたい!と奮い立ちました。

なので、物は試しにbitbankでpython自動取引ツールを作ってみました。
なぜbitbankかというと、
理由①:日本取引所で、とりあえず円建てで買いたかった、その方が逃げやすいから。
理由②:キャンペーンにより現在、bitbankは現物の売買手数料は0%です。無料です。
理由③:zaifは注文が通りにくいという噂ですし、他の日本取引所は今はちょっと。。という感じですので、とりあえずbitbankで!一旦完成してから他の取引所でもということにします。

自動取引プログラムを作成するにはAPIが必要です。
bitbankでAPIを使用するには、ユーザー登録が必要です。

APIの入手方法は過去記事を参考にしてください。
www.crypto-attack.work

処理の概要

今の価格の○○円の上下レンジを設定し、○○円高く売注文○○円安く買注文を同時にだす。ただひたすらそれを繰り返す。それだけです。
今は難しいロジックは考えません。まずは自動取引をした!という偉業を達成したかったのです。
対象通貨はXRP/JPYにしました。理由は安く買えるから。安い金額で買えた方が現実見がある。増えた感がある。

図解にすると次のようになります。
f:id:hotkou:20180307231051p:plain

ちょっとよくわからないかもですが、次のイメージ図のような横ばい時に有効です。
f:id:hotkou:20180307231656p:plain

簡単な処理の流れ

  1. 資産情報の確認
  2. 現在の価格を確認
  3. アクティブな注文一覧の確認
  4. 注文

1~4を繰り返し(○○秒ごとに)

本当は買注文が約定したら、売注文をだすIFD注文で繰り返ししたかったのですが(仮想通貨でトラリピってやつ)
まずbitbank.ccにはIFD注文がないようです。
そして何より問題なのが、
現在は取引履歴をAPIから呼び出せないよう制限がかかっているみたいです。今trade_historyを叩いてもエラーが起こります。

以下bitbank公式ページより

12月27日22時29分現在、取引数の急増に伴いシステム負荷が急激に高まったため、取引履歴画面および取引履歴APIの利用に一時的な制限を加えております。

制限の内容は以下の2点となります。

取引履歴画面(リンク)

期間指定(開始日・終了日)を伴う取引履歴の検索
※取引履歴の確認は、通常どおり行うことが可能です。

取引履歴API(GET /user/spot/trade_history)

取引履歴APIの呼び出し
bitbankをご利用のお客様には大変ご不便をおかけいたしますこと、深くお詫び申し上げます。取引履歴画面・APIの利用制限の解除日時に関しましては、あらためてお知らせ致しますので今しばらくお待ち下さい。

取引履歴ページ・取引履歴APIの一時的な制限について

えー!それじゃ簡単に注文が約定したかわからんじゃん・・・!
こうなるとですね、買注文が約定したかどうかを判断するには、一工夫必要になってきます。
アクティブな注文一覧に、対象の買注文があるかどうかを確かめます。
なければ【約定済or注文をキャンセル】のどちらかになります。
なので、処理開始時にアクティブな注文一覧を確認する処理を入れておく必要があります。

動作環境

  • Windows10(64bit)
  • Python3(Anaconda)
  • Spyder(IDEなのでなんでもよいです)

注意事項

今回のプログラムではサンプルだけ紹介していますが、注文処理については実際に動かすと、実際に注文が行われます。
損をする可能性もあります。なので自己責任でお願いします。

機能のごとのサンプルプログラム

実現するためのサンプルを紹介します。
検証で作成したプログラムは処理が長いので、ここでは処理を実現するサンプルだけ紹介します。
後日公開予定

もう一度簡単な処理の流れ

  1. 資産情報の確認
  2. 現在の価格を確認
  3. アクティブな注文一覧の確認
  4. 注文

1~4を繰り返し(○○秒ごとに)

1.資産情報の確認

取引できる資産があるかどうか資産情報の確認を行います。

2.現在の価格を確認

現在の価格を取得します。

横ばいがしばらく続きそうなのかをチェックします。
過去の価格を保存しておく必要があるのでデータベースが必要になってくると思います。僕はsqliteで用意しました。

3.注文情報の確認

現在の注文中データを取得する。

import python_bitbankcc
API_KEY = 'APIキー'
API_SECRET = 'Secretキー'

prv = python_bitbankcc.private(API_KEY, API_SECRET)
activeOrders = prv.get_active_orders(pair)

もし注文中があれば以下を確認する。
注文状況から買と売ペアの取引が完了しているかを確認する。
買分だけ約定していても、売が約定しないと成功していないので、その注文ラインは放置する。

4.注文

1、2、3、その他の条件をすべて満たす場合であれば買と売注文を同時に出します。

#注文処理サンプル
import python_bitbankcc
API_KEY = 'APIキー'
API_SECRET = 'Secretキー'

prv = python_bitbankcc.private(API_KEY, API_SECRET)

#注文データ
buyOrderInfo = {"pair":"xrp_jpy",#ペア
             "amount":10,#注文枚数
             "price":95.7,#注文価格
             "orderSide":"buy", #buy or sell
             "orderType":"limit" #指値注文の場合はlimit
             }
sellOrderInfo = {"pair":"xrp_jpy",#ペア
             "amount":10,#注文枚数
             "price":95.5,#注文価格
             "orderSide":"sell", #buy or sell
             "orderType":"limit" #指値注文の場合はlimit
             }
#注文を行う
buyInfo = Order(buyOrderInfo)
sellInfo = Order(sellOrderInfo)


#注文処理
def Order(orderInfo):
    #Order
    value = prv.order(
        orderInfo["pair"], # ペア
        orderInfo["price"], # 価格
        orderInfo["amount"], # 注文枚数
        orderInfo["orderSide"], # 注文サイド 売 or 買(buy or sell)
        orderInfo["orderType"] # 注文タイプ 指値 or 成行(limit or market))
    )    
    return value

これらをwhileで囲って、time.sleep(<○秒>)で○秒ことに繰り返しします。

検証

設定パラメータ

サヤ取りが成功した場合は、次のようにLINE通知が飛んでくる仕組みにしてみました。
f:id:hotkou:20180308002040p:plain
・期間:3/7 1:00 ~ 0:00
・対象通貨:XRP/JPY
・一度にトラップを仕掛ける個数:4個まで
・レンジ幅:0.1円
・購入枚数:10XRP+利益分(複利)・・・一回のサヤ取りで約2円の利益w
若干何回かいろいろパラメータを一時的に変更したりしました。

検証結果

・サヤ取り成功回数:64回
・利益:+136.413円(爆益なう)

約4000円分の投資で134円稼いだので3.35%の利益ができましたw
うますぎる!働かないで稼いだ金は最高にメシウマです。
※111円で10XRP売り損ねた注文が2件残っており、その分は含み損で約20円マイナスですが考慮していませんw
 現物取引は最大の攻撃で最大の防御です。

今回が以上です。