【初心者向け】Zaif API×Pythonでプチフィンテック18 仮想通貨自動取引botの作成(前処理の実装1)

前回紹介したbotの処理概要とプログラムの流れに基づき、今回はいよいよbotを実装していきます。

まずは今回と次回の2回に分けて、プログラム中の前処理部分を実装します。

<スポンサーリンク>

前処理の実装

インポート文の記述

まずはプログラムの先頭に、処理に必要となるモジュールをインポートするためのインポート文を列挙します。

#①前処理
##モジュールインポート
import requests
from urllib.parse import urlencode
import hashlib
import hmac
import json
from time import time, sleep
import logging
import sys

sleepモジュールとsysモジュールについてはこれまでの記事の中で説明していませんが、プログラムの中で実際にこのモジュールを使用するタイミングで、内容を説明します。

パラメータ設定

続いて、処理を行うために必要となる、価格や数量などの発注関連情報と認証情報を設定します。

##パラメータ設定
UPPER_PRICE = 2000000
LOWER_PRICE = 1000000
ORDER_INTERVAL = 100000
LIMIT = 200000
AMOUNT = 0.001
CURRENCY_PAIR = 'btc_jpy'
KEY = "xxx" #各自のKeyを指定
SECRET = "xxx" #各自のSecretを指定

ここでは、BTC/JPYを\1,000,000~\2,000,000のレンジで\100,000刻み、数量0.0001で発注する設定としています。また、リミットは\200,000に指定しています。

メソッド定義

次に共通メソッドの定義を行います。

プログラム全体では、「現物取引APIへの共通アクセスメソッド」、「サーバ時刻取得メソッド」、「現在価格取得メソッド」の3つを定義しますが、今回の記事では1つ目の「現物取引APIへの共通アクセスメソッド」のみ実装します。

ちなみに、2つ目の「サーバ時刻取得メソッド」と3つ目の「現在価格取得メソッド」は最終的に作成するプログラム中それぞれ1回ずつしか使いませんので、厳密には「共通」メソッドではありません。しかしながら、メソッドとして定義することにより、メイン処理内の記述が簡潔になること、また、これら処理が今後プログラムを拡張する時に複数回使う可能性のある処理であることを踏まえ、メソッドとして定義しています

##メソッド定義
###現物取引APIへの共通アクセスメソッド
'''
    概要
        現物取引API利用時の共通処理
    引数
        params: HTTPリクエストに指定するパラメータ
        key: 自アカウントのKey
        secret: 自アカウントのSecret
    戻り値
        HTTPレスポンス(ディクショナリ形式)
'''
def tradeRequester(params, key, secret):
    encoded_params = urlencode(params)
    signature = hmac.new(bytearray(secret.encode('utf-8')), digestmod=hashlib.sha512)
    signature.update(encoded_params.encode('utf-8'))

    headers = {
        'key': key,
        'sign': signature.hexdigest()
    }

    response = requests.post('https://api.zaif.jp/tapi', data=encoded_params, headers=headers)

    if response.status_code == 200:
        response_dict = json.loads(response.text)
        return response_dict
    else:
        raise Exception('status_code is {status_code}, params are {params}'.format(status_code = response.status_code, params = str(params)))

内容について、これまでの記事で説明していなかった部分を中心に解説します。

まず、メソッドの前に「’」3つで括られた部分があります。この「’」3つは複数行のコメントを付けたい場合に利用します。今回は各メソッドの機能概要を一目で分かるようにするため、この記法を利用してコメント付けしています。

次にこのメソッドの内容について、1点だけ補足説明します。

このメソッドでは、ステータスコードが200以外、すなわち現物取引API特有のエラーが発生した際、

raise Exception('status_code is {status_code}, params are {params}'.format(status_code = response.status_code, params = str(params)))

という記述により例外を投げるようにしています。

ここで、「Exception」の中に文字列を指定することにより、後に実装するtry~ExceptionのException句で例外をキャッチした際、指定した文字列を表示することができます。つまり、例外発生時に具体的にどのような例外が発生したのかを明示することができます。

さらに、一般的に文字列については、文字列内に「{引数名}」を入れ、さらに文字列そのものの後に「.format(引数=値)」と付け足すことで、文字列内の「{引数名}」の箇所を後段の「format」の中で指定した値に置き換えることができます

例えば今回の場合、サーバから返ってきたステータスコードが「502」、指定したパラメータが「{‘method’ = ‘trade’}」であった場合、例外に指定された文字列は「status_code is 502, params are {‘method’ = ‘trade’}」となります。

終わりに

今回はbot内の前処理の、さらに前半部分を実装しました。

現時点ではプログラムが完成していないために実行できませんので、イメージが掴みづらい部分もあるかとは思いますが、不明な点があれば、過去の記事も読み返して頂ければと思います。

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

シェアする

フォローする