Python システムトレード ビットコイン

ZaifのAPIを使ってPythonでビットコインの取引プログラムを作成してみたよ

スポンサードリンク

Contents

ZaifのAPIを使ってビットコインの取引プログラムを作成

今回は、ビットコイン取引所のZaifのAPIを使って
板情報とアカウント情報の取得、
注文を出す処理を実装します。

モジュールを使う

ZaifのAPIを簡単に使えるように
モジュールを公開されている方
いらっしゃいますので、
今回はこれを使わせてもらいます。

このモジュールのおかげで非常に簡単に
プログラムできたので感謝、感謝です。

最初にモジュールをインストールします。

pip install zaifapi

プログラミング

後はプログラムをコーディングするだけです。

# -*- 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を実行するなど)
以下のエラーが発生しました。

Exception: nonce not incremented

「nonce」は、1以上の数字でアクセスの都度
増分する必要があります。
同一プログラム内で続けて接続した場合は
これが増分しないままアクセスしてしまうためです。

完成までのあれやこれや

モジュールのおかげで非常にシンプルに
実装できたのですが、
実は完成するまでに色々と試行錯誤しました。

実は、tradeに渡す引数をどのように指定するかが
最初分かりませんでした。

当初、

body = {
    "method": "trade",
    "currency_pair": "btc_jpy",
    "action": "bid",
    "price": "5000.0",
    "amount": "0.001",
}

という辞書型で変数を作って、これを

zaif.trade(body)

というように渡そうとしたのですが、

TypeError: trade() takes 1 positional argument but 2 were given

というエラーが発生して処理が進みません。

困ってモジュールのソースを見てみました。
すると、「impl.py」内で以下のように定義されています。

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の引数を

zaif.trade("method"="trade","currency_pair"="btc_jpy","action"="bid","price"="5000.0","amount"="0.001")

としました。

すると、以下のエラーが出ます。

SyntaxError: keyword can't be an expression

よくよく見ると、keywordの部分は「"」で
囲まないということのようです。

zaif.trade(method="trade",currency_pair="btc_jpy",action="bid",price="5000.0",amount="0.001")

とすると、今度は以下のエラーが出ます。

Exception: {"price": ["must be of number type"], "amount": ["must be of number type"]}

これは分かりやすい。priceとamountの「"」を外します。

zaif.trade(method="trade",currency_pair="btc_jpy",action="bid",price=5000.0,amount=0.001)

というように修正しました。

しかしまだエラーが出ます。

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円単位でしか指定できないんですね・・・。

Zaifの口座をお持ちでない方は、以下から登録ください。

-Python, システムトレード, ビットコイン
-, , ,

© 2024 FX・ビットコイン・オプションのシステムトレード開発と取引録 Powered by AFFINGER5