【初心者向け】Zaif API×Pythonでプチフィンテック13 現物取引API特有の異常への対応

今回は、現物取引API特有の異常が発生した際に、適切に対処する方法を解説していきます。

<スポンサーリンク>

現物取引API特有の異常

異常への対応については、第6回と第7回の記事でそれぞれ1種類ずつを解説しました。

今回は前回の予告通り、サーバへのアクセス時に何らかの異常が発生し、処理が正しく行えない場合に適切に対処する方法について紹介したいと思います。...
前回から引き続き、今回もプログラム実行中に異常が発生した際の対応について説明していきます。 今回対象とする異常 さて、前回、プログラム実...

今回まずは、現物取引API利用時には、この2種類以外の異常が発生する可能性があるという点を説明したいと思います。

具体的にイメージをつかむために、実際に異常を発生させてみましょう。

例として、前回作成したプログラムのパラメータのうち注文数量を大きなものにすることにより、口座資金が足りない状況で発注が行われるようにしてみます。

#前回追加した4行のうち、AMOUNTを0.0001⇒1000に変更
CURRENCY_PAIR = 'btc_jpy'
ORDER_PRICE = 100000
AMOUNT = 1000 #変更
LIMIT = 200000

これでプログラムを実行すると、まずPyCharm上では前回同様、「Process finished with exit code 0」と表示され、特段のエラーは発生していないように見えます。

一方、Zaifにログインして注文状況を確認してみると、当然ながら注文は行われていません。

PyCharmのコンソール上には明示的にエラーが表示されていないという点から、第6回の異常とは異なるものだと言えます。

では次に、第7回で紹介した異常とも異なることを、レスポンスのステータスコードをみることにより確認してみます。

プログラムには、一番最後にステータスコードを表示するためのコードを追記します。

~省略~
print(response.status_code)

実行してみると、ステータスコードは「200」となっており、この方法でも異常が発生していることは検出できていません。

ここで、レスポンスの内容そのものを見てみましょう。

プログラムの最後に、レスポンスをテキストとして表示するためのコードを追記します。

~省略~
print(response.text)

これで実行してみると、「{“success”: 0, “error”: “insufficient funds”}」と表示され、資金が十分でないことからエラーとなっていることが分かります

これが、現物取引API特有の異常です。

では、正常パターンについても確認してみましょう。

先ほどのパラメータの数量を元に戻し、プログラムを実行してみます。

#AMOUNTを0.0001に戻す
CURRENCY_PAIR = 'btc_jpy'
ORDER_PRICE = 100000
AMOUNT = 0.0001 #変更
LIMIT = 200000

結果は以下の通り、冒頭に「”success”: 1」を含む文字列が返されており、この文字列内には「error」という言葉は含まれていません。

このように、現物取引APIでは、正常に取引等の処理が終了したか否かを、レスポンスの中に示すことがあります。したがって、現物取引APIを利用する場合には、このレスポンス自体の中身も確認して、異常が発生しているかどうかを確認する必要があるのです。

異常への対応実装

現物取引特有の異常がどのようなものであるか確認できたところで、異常が発生した際に適切に対応できるようなプログラムを作成していきたいと思います。

基本的には、レスポンスの中を見てみて、「”success”」が1(成功)か0(失敗)であるかにより処理を分けてやれば良さそうです。

では、レスポンスから「”success”」の値を取り出してやるためにはどのようにすればよいのでしょうか?

第4回目の記事で、レスポンスは「JSON」という形式で返されることを少し書きました。

前回までの記事で仮想通貨の自動取引botの開発準備が整いましたので、今回からはZaif APIやPythonの使い方を紹介しながら、botの...

そして、PythonにはJSON形式のデータを簡単に扱えるようにする「json」というそのものズバリのモジュールがありますので、これを使います。

具体的には、jsonモジュールを使ってリクエストを辞書型のデータに変換し、その辞書型データからキー「success」に対する値を取得するという方法でプログラムを実装します。

それでは、実装に参りましょう。

まずは例によってPyCharmを立ち上げ、新規のPythonファイルを作成した上で、前回作成したコードを丸々コピーします。ファイル名も例によって任意ですが、ここでは「tradetest3」という名称にしておきます。

そして、まずはインポート文を羅列している箇所に、jsonモジュールを使うためのインポート文を追記します。

import requests
from urllib.parse import urlencode
import hashlib
import hmac
from time import time
import json #追加
~省略~

次に、jsonモジュールを使って、レスポンスを辞書型のデータに変換するためのコードを、レスポンスをサーバから取得する処理の直後に追記します。

~省略~
response = requests.post('https://api.zaif.jp/tapi', data=encoded_params, headers=headers)
response_dict = json.loads(response.text) #この行を追加

#print(response.text)

追加した行ですが、jsonモジュールに含まれる「loads」というメソッドに、json形式の文字列である「response.text」を与えることにより、レスポンスを辞書形式に変換し、それを「response_dict」という変数に代入しています。

さらに、レスポンス内の「success」の値を見て、「0」(エラー)であれば、エラーが発生した旨とその時にレスポンスを表示するコードを追記します。

response = requests.post('https://api.zaif.jp/tapi', data=encoded_params, headers=headers)
response_dict = json.loads(response.text)
if(response_dict["success"]) == 0: #このifブロックを追加
    print("現物取引APIの異常発生")
    print(response_dict)

#print(response.text)

追加したコードについて、特段難しいところはないと思います。

最後に注文数量を大きな値に変更し、エラーが発生するようにしておきましょう。

#省略
CURRENCY_PAIR = 'btc_jpy'
ORDER_PRICE = 100000
AMOUNT = 1000 #0.0001から変更
LIMIT = 200000
#省略

テスト実行

では、プログラムを実行してみて、エラーに対して意図した通りにprint関数が実行されることを確認してみましょう。

以下のようなメッセージが表示されれば、プログラムの作成は成功です。

終わりに

今回は現物取引API利用時に発生する異常を検出し、それに対して適切に対処するための方法を解説しました。また、その過程で、JSON形式のデータの取り扱い方法も併せて説明しました。

次回はまたテーマを変えて、botを作成後の運用を見据えて、プログラムの処理の過程を逐一コンソールに表示するためのログ出力方法について解説したいと思います。

カテゴリ:フィンテック
<スポンサーリンク>

シェアする

フォローする