【初心者向け】Zaif API×Pythonでプチフィンテック16 共通処理のメソッド化

今回はプログラム中に何度も出てくるような共通的な処理を一箇所にまとめて記述する、処理のメソッド化について紹介します。

<スポンサーリンク>

メソッド化の必要性

例えば、現物取引APIの中の資産情報を表示するAPI(getinfo2)と発注を行うAPI(trade)を1つのプログラムで使用したい場合、メソッド化を行わないのプログラムは以下のようになります。

なお、プログラムをシンプルにするため、エラー処理等は入れていません。

import requests
from urllib.parse import urlencode
import hashlib
import hmac
from time import time

KEY = "XXX" #KEYを指定
SECRET = "XXX" #SECRETを指定

#資産情報の取得
params = {
    'method': 'get_info2',
    'nonce': time()
}
encoded_params = urlencode(params)
signature = hmac.new(bytearray(SECRET.encode('utf-8')), encoded_params.encode('utf-8'), digestmod=hashlib.sha512)
headers = {
    'key': KEY,
    'sign': signature.hexdigest()
}
response = requests.post('https://api.zaif.jp/tapi', data=encoded_params, headers=headers)
print(response.text)

#発注処理
params = {
    'method': 'trade',
    'nonce': time(),
    'currency_pair': 'btc_jpy',
    'action': 'bid',
    'price': 100000,
    'amount': 0.0001,
    'limit': 200000
}
encoded_params = urlencode(params)
signature = hmac.new(bytearray(SECRET.encode('utf-8')), encoded_params.encode('utf-8'), digestmod=hashlib.sha512)
headers = {
    'key': KEY,
    'sign': signature.hexdigest()
}
response = requests.post('https://api.zaif.jp/tapi', data=encoded_params, headers=headers)

プログラムの前半で資産情報を表示し、後半でBTC/JPYの発注処理を行っています。

ただ、見て頂くとお判りになる通り、前半と後半で同じようなコードが繰り返されており、ずいぶん冗長なコードになっていますね

この冗長さを避けるために、共通の処理を1つの記述にまとめてしまうことをメソッド化と言います

そしてPythonでは、「def」という記述を用いて、共通処理をメソッド化することができます

具体的な使い方ですが、

def メソッド名(引数):
    共通処理

という形で、メソッドを定義することができます。

なお、このメソッドから何らかの値をメソッド呼び出し元に返したい場合、共通処理の中に「return 返す値」と記述します。

実装

それでは、前述のプログラム中の共通処理をメソッド化することにより、プログラムをスッキリさせてみましょう。

まずはPyCharmで新規にPythonファイルを作成します。ファイル名はお好みで構いませんが、ここでは「tradetest5」という名称で作成します。

ファイルが作成できましたら最初に、2つの処理の前提となる、モジュールのインポートとKEY/SECRETの記述を行います。これらは、前述のコードと全く同様です。

import requests
from urllib.parse import urlencode
import hashlib
import hmac
from time import time

KEY = "XXX" #KEYを指定
SECRET = "XXX" #SECRETを指定

続いて、共通処理をメソッドとして記述します。

def tradeRequester(params_arg): #①
    encoded_params = urlencode(params_arg) #ここから②
    signature = hmac.new(bytearray(SECRET.encode('utf-8')), encoded_params.encode('utf-8'), digestmod=hashlib.sha512)
    headers = {
        'key': KEY,
        'sign': signature.hexdigest()
    }
    response = requests.post('https://api.zaif.jp/tapi', data=encoded_params, headers=headers) #ここまで②
    return response #③

内容を順に説明します。

まず①ですが、「tradeRequester」というメソッド名称でメソッドを定義しています。メソッドの引数に該当する箇所には「params_arg」という名称が入っていますが、この記述により、このメソッドを利用する際に与えた引数に対して、メソッド内では「params_arg」という名前でアクセスすることができるようになります

次に②ですが、基本的には前述のコードの共通部分をコピーしただけです。ただし1点だけ、パラメータに該当する部分は、冒頭のプログラム中では「params」という名称でしたが、このメソッド内では「params_arg」という名称に置き換えられていることにご留意下さい。

そして③ですが、共通処理の中で取得したHTTPレスポンスを「return」の後に記述することで、このメソッドの呼び出し元にHTTPレスポンスを返してやるようにしています。

最後に、このメソッドを使うための記述を追記します。

#資産情報の取得
params = {
    'method': 'get_info2',
    'nonce': time()
}

returned_response = tradeRequester(params)
print(returned_response.text)

#発注処理
params = {
    'method': 'trade',
    'nonce': time(),
    'currency_pair': 'btc_jpy',
    'action': 'bid',
    'price': 100000,
    'amount': 0.0001,
    'limit': 200000
}
tradeRequester(params)

パラメータは2つの処理で別個のものを指定する必要がありますが、共通処理部分は「tradeRequester(params)」という記述により、1行にまとめられていることがお判りになるかと思います。

なお、前半の資産情報を取得する処理では、メソッドを実行した結果として生成されるHTTPレスポンスを表示する必要があるため、メソッドの実行結果を「returnd_response」という変数に入れてprint関数にてそれを出力しています。

一方、後半の取引を行う処理では、レスポンスを使いませんので、単にメソッドを呼び出すだけの記述にしています。

テスト実行

それではプログラムを実行し、資産情報の表示とBTC/JPYの発注処理ができることを確認してみましょう。

プログラムを実行すると、まずコンソール上に、以下のように資産情報が表示され、その後にプログラムが終了したことを示す「Process finished with exit code 0」という文字列が表示されます。

次にZaifにアクセスして、発注も行われていることを確認してみましょう。

プログラムは無事に動きましたでしょうか?

終わりに

ここまで結構長丁場でしたが、これで仮想通貨取引botを作成するための基本的な情報は一通り解説し終わりました。

そこで、次回からは実際にbotの作成をしていきたいと思います。

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

シェアする

フォローする