ZaifのAPIを使ってビットコインの取引プログラムを作成
今回は、ビットコイン取引所のZaifのAPIを使って
板情報とアカウント情報の取得、
注文を出す処理を実装します。
モジュールを使う
ZaifのAPIを簡単に使えるように
モジュールを公開されている方が
いらっしゃいますので、
今回はこれを使わせてもらいます。
このモジュールのおかげで非常に簡単に
プログラムできたので感謝、感謝です。
最初にモジュールをインストールします。
1 |
pip install zaifapi |
プログラミング
後はプログラムをコーディングするだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# -*- coding: utf-8 -*- """ Created on Fri Mar 10 14:37:22 2017 @author: ichizo """ from zaifapi import ZaifPublicApi, ZaifPrivateApi api_key = 'APIキー' api_secret = 'APIシークレット' zaif = ZaifPublicApi() print(zaif.depth('btc_jpy')) zaif = ZaifPrivateApi(api_key, api_secret) print(zaif.get_info()) """ zaif = ZaifPrivateApi(api_key, api_secret) print(zaif.trade(currency_pair="btc_jpy",action="bid",price=130000,amount=0.001)) """ |
実行時の注意点
上記のget_infoとtradeを同時に実行すると
(get_infoの後に続けてtradeを実行するなど)
以下のエラーが発生しました。
1 |
Exception: nonce not incremented |
「nonce」は、1以上の数字でアクセスの都度
増分する必要があります。
同一プログラム内で続けて接続した場合は
これが増分しないままアクセスしてしまうためです。
完成までのあれやこれや
モジュールのおかげで非常にシンプルに
実装できたのですが、
実は完成するまでに色々と試行錯誤しました。
実は、tradeに渡す引数をどのように指定するかが
最初分かりませんでした。
当初、
1 2 3 4 5 6 7 |
body = { "method": "trade", "currency_pair": "btc_jpy", "action": "bid", "price": "5000.0", "amount": "0.001", } |
という辞書型で変数を作って、これを
1 |
zaif.trade(body) |
というように渡そうとしたのですが、
1 |
TypeError: trade() takes 1 positional argument but 2 were given |
というエラーが発生して処理が進みません。
困ってモジュールのソースを見てみました。
すると、「impl.py」内で以下のように定義されています。
1 2 3 |
def trade(self, **kwargs): schema_keys = ['currency_pair', 'action', 'price', 'amount', 'limit', 'is_token'] return self._execute_api(inspect.currentframe().f_code.co_name, schema_keys, kwargs) |
実はPythonにまだあまり慣れていないので
「**kwargs」というのを初めて見ました。
何これ?ということで調べてみると、
可変長引数だったんですね。
「**kwargs」は辞書型で保存するらしいです。
そこでtradeの引数を
1 |
zaif.trade("method"="trade","currency_pair"="btc_jpy","action"="bid","price"="5000.0","amount"="0.001") |
としました。
すると、以下のエラーが出ます。
1 |
SyntaxError: keyword can't be an expression |
よくよく見ると、keywordの部分は「"」で
囲まないということのようです。
1 |
zaif.trade(method="trade",currency_pair="btc_jpy",action="bid",price="5000.0",amount="0.001") |
とすると、今度は以下のエラーが出ます。
1 |
Exception: {"price": ["must be of number type"], "amount": ["must be of number type"]} |
これは分かりやすい。priceとamountの「"」を外します。
1 |
zaif.trade(method="trade",currency_pair="btc_jpy",action="bid",price=5000.0,amount=0.001) |
というように修正しました。
しかしまだエラーが出ます。
1 |
Exception: invalid price parameter |
priceのパラメーターがおかしいようです。
「5000.0」という金額が実態と離れすぎているからかと思い
金額を調整してみてもエラーは変わりません。
「5000.0」を「5000」に変えてみると、
insufficient funds(残高不足)となります。
今、Zaifの口座残高は0円なので、
当然表示の通りになります。
ここまでできれば大丈夫でしょう。
モジュールのおかげでプログラムは非常に簡単にできましたが、
パラメーターの指定で以外に時間がかかってしまいました。
(ドキュメント読めよっていう話ですが)
APIの仕様を見てみると、
価格(priceおよびlimit) btc_jpy : 5円単位
数量(amount) btc_jpy : 0.0001BTC単位
となっていました。
価格の指定が小数点だとエラーになって当然でした。
しかし価格は5円単位でしか指定できないんですね・・・。