初心者が一攫千金を目指してBitcoin自動取引botを作るよ！ その２【APIで取引】

[初心者が一攫千金を目指してBitcoin自動取引botを作るよ！ その１](http://qiita.com/speedkingg/items/2d874beee26106ce9f9a)の続きになります。

今回は**認証情報が必要なAPI**を動かして、実際に取引したいと思います✧+(0ﾟ・∀・) + wktk✧
早速動きを検証していきます。

# 検証
認証情報が必要なAPI：**ZaifPrivateApi**を動かしてみます。
今回は情報取得（get_info()）と取引(trade())を検証しました。

## ０．準備
このAPIはkeyとsecretという2つのキーが必要なので、**[zaif](https://zaif.jp)**にて作成します。

　0. zaifへ新規ユーザ登録を行い、ログインする
　1. 右上のアカウントを選択
　![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/172701/b33ff26e-f7f8-70d6-f07a-8579427739f0.png)

　2. 開発者向けAPIのAPI KEYを選択
　![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/172701/d3239eff-59d0-7b4e-b6ad-b742fb421f0a.png)

　3. get Verification Codeを選択
　![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/172701/1e63248c-90fc-b7b7-696a-48e7af78308b.png)

　4. 登録したメールアドレスに6桁のコードが送られてくるので、それを入力する
　![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/172701/b391722f-8dfa-cb03-b491-8281483bc39a.png)

　5.Keyの名前を入力し、キーに紐付ける権限を選択する（info,tradeを紐付けます）
　![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/172701/3b84dba1-da22-544b-b3aa-afb41c3e2beb.png)


　6. createを押し、キーを生成する
　7. KeysのKey,secretをそれぞれコピーし、控えておく

## １．情報取得
**０．準備**で作成したKey,secretを使用して取引の情報を取得します。

```python:main.py
# -*- coding: utf-8 -*-

from zaifapi import ZaifPrivateApi  # Zaifが公開している認証情報が必要なAPIを実行するクラス
from pprint import pprint  # 表示用(jsonをきれいに表示してくれる)

if __name__ == '__main__':
    key = '【準備で作成したKey】'
    secret = '【準備で作成したsecret】'

    zaif = ZaifPrivateApi(key, secret)
    pprint(zaif.get_info())
```

■実行結果

```console:
{u'deposit': {u'btc': 0.0, u'jpy': 0.0, u'mona': 0.0, u'xem': 0.0},
 u'funds': {u'btc': 0.0, u'jpy': 0.0, u'mona': 0.0, u'xem': 0.0},
 u'open_orders': 0,
 u'rights': {u'info': 1, u'personal_info': 0, u'trade': 0, u'withdraw': 0},
 u'server_time': 1491068366,
 u'trade_count': 0}
```
保証金(deposit)、資金(funds)、注文数(open_orders)、権限情報(rights)、トレード回数(trade_count)が取得できました。
トレード回数を取得しない軽量版の[get_info2()](https://corp.zaif.jp/api-docs/trade-api/#method_get_info2)も用意されているようです。


## ２．取引(trade)
さて、ウォーミングアップが終わったところで、本日のメインディッシュ「**取引**」です。

取引テスト用に￥1,000ほど入れてみます。
「日本円入出金」メニューにはクレジットカード決済がなかったので、
[クレジットカードでビットコインを購入](https://zaif.jp/ccheck/form/1)から直接Bitcoinを購入します。
![キャプチャ6.PNG](https://qiita-image-store.s3.amazonaws.com/0/172701/83fff429-b27b-4b5e-fb03-d61755fc164a.png)

必要情報を入力して購入。
無事買えました！ヾ(o´∀｀o)ノ
![キャプチャ7.PNG](https://qiita-image-store.s3.amazonaws.com/0/172701/7bce3888-ff1b-9ced-9433-244be1d91c82.png)

**・・・ん？**
![キャプチャ8.PNG](https://qiita-image-store.s3.amazonaws.com/0/172701/ec6f251c-4f90-72d0-9294-574d2c62b412.png)
手数料で7.6%ほど取られたもよう…(´・ω・`)

最低金額での購入だから、きっと相対的に手数料が高いんだよね・・・
気を取り直して取引(trade)の検証へ(｀・ω・´)

### ２－１．取引(trade：Bitcoinの売却)
[ドキュメント](https://corp.zaif.jp/api-docs/trade-api/#method_trade)さん曰く、currency_pair、action、price、amountを渡してやればいいっぽい。
![キャプチャ10.PNG](https://qiita-image-store.s3.amazonaws.com/0/172701/17e8fd44-9f6f-2aaa-49b0-837903761f50.png)

きちんと順番をあわせ、各値をセットする。
保有しているBitcoin（0.0076btc）をすべて売りに。
売却金額は現在のBitcoin金額の￥121,800を指定します。
![キャプチャ9.PNG](https://qiita-image-store.s3.amazonaws.com/0/172701/0a0ed6fe-67e6-dc66-ba2e-c3f874db4e5d.png)
・・・何やら怒られている。引数がおかしいと。

```console:
TypeError: trade() takes exactly 1 argument (5 given)
```

コンソールのエラーを確認すると、１つしか入らないのに、５個渡していると言われています。
（ドキュメントに４つのパラメータは必須って書いてあるやん。渡してるの４つだし。。。）

　
ぐぐると[先人の方](http://fx.ichizo.biz/2017/03/10/zaif-bitcoin.html)が解決してくださってました。(ありがとうございます。とても助かりました。)
どうやらパラメータの指定の仕方が悪かったみたいです。
![キャプチャ11.PNG](https://qiita-image-store.s3.amazonaws.com/0/172701/2c66f530-9de9-e9c4-8b49-6c0d951e8484.png)

```python:main.py
# -*- coding: utf-8 -*-

from zaifapi import ZaifPrivateApi  # Zaifが公開している認証情報が必要なAPIを実行するクラス
from pprint import pprint  # 表示用(jsonをきれいに表示してくれる)

if __name__ == '__main__':
    key = '【準備で作成したKey】'
    secret = '【準備で作成したsecret】'

    zaif = ZaifPrivateApi(key, secret)
    # Bitcoinを売る
    pprint(zaif.trade(currency_pair="btc_jpy", action="ask", price=121800, amount=0.0076))
```

■実行結果

```console:
{u'funds': {u'btc': 0.0, u'jpy': 925.946, u'mona': 0.0, u'xem': 0.0},
 u'order_id': 0,
 u'received': 925.946,
 u'remains': 0.0}
```

動いた～ヾ(ﾟωﾟ*)ﾉ
btcが0になって、jpyが増えているので、成功です。

### ２－２．取引(trade：Bitcoinの買付)
Bitcoinの売却ができたので、同じようにBitcoinの買付もやってみます。
保有している日本円（￥925.946）で買えるだけBitcoinを買います。
買い付け量は所持金（￥925）÷ 現在の1bitcoinの価格（￥122,210）で求めます。

```python:main.py
# -*- coding: utf-8 -*-

from zaifapi import ZaifPrivateApi  # Zaifが公開している認証情報が必要なAPIを実行するクラス
from pprint import pprint  # 表示用(jsonをきれいに表示してくれる)

if __name__ == '__main__':
    key = '【準備で作成したKey】'
    secret = '【準備で作成したsecret】'

    zaif = ZaifPrivateApi(key, secret)

    # 現在の1Bitcoinの価格
    price = 122210

    # APIが小数点以下４桁までの対応なのでround()
    # 小数点第５位が繰り上げの場合、資産不足になるため(- 0.0001)
    amount = round(925.0/price, 4) - 0.0001

    # Bitcoinを買う
    pprint(zaif.trade(currency_pair="btc_jpy", action="bid", price=price, amount=amount))

```

■実行結果

```console:
{u'funds': {u'btc': 0.0075, u'jpy': 9.4085, u'mona': 0.0, u'xem': 0.0},
 u'order_id': 0,
 u'received': 0.0075,
 u'remains': 0.0}
```

Bitcoinを0.0075買い付けましたヾ(ﾟωﾟ*)ﾉ
日本円が￥9.4085残ってしまいましたが、最小単位の0.0001Bitcoin分(￥12.221)以下は仕様上仕方がないみたいです。

### ２－３．ZaifPrivateApiのその他メソッドについて
今回、検証したget_info(),get_info2(),trade()以外にも以下のメソッドが用意されています。[[詳細]](http://corp.zaif.jp/api-docs/trade-api/#method_toc)

```
 - get_personal_info : チャットに使用されるニックネームや画像URLを取得する
 - get_id_info : ユーザーIDやメールアドレスといった個人情報を取得する
 - trade_history : 取引履歴を取得する
 - active_orders : 現在有効な注文一覧を取得する
 - cancel_order : 注文を取り消す
 - withdraw : 暗号通貨の出金リクエストを行う
 - deposit_history : 入金履歴を取得する
 - withdraw_history : 出金履歴を取得する
```

# おわりに
今回は**取引情報の取得**と**取引**を行うことができました！ヽ(*´∀｀)八(´∀｀*)ノ
途中つまづきましたが、無事動いて良かったです。
情報の取得と取引の検証が完了したので、
次回は今回検証した内容を組み合わせて「情報の取得▶売る/買う▶最初に戻る」を繰り返して、
勝手に取引してくれるものを作成したいと思います。
**ついにBotと呼べるものが出来上がるのでは・・・！！**と期待しています。

お疲れ様でした！！