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

今回は前回から引き続き、botの前処理を実装してきます。

<スポンサーリンク>

前処理の実装(続き)

メソッド定義(続き)

前回の続きからということで、まずは「サーバ時刻取得メソッド」を定義します。

###サーバ時刻取得メソッド
'''
    概要
        Zaifサーバ上の現在時刻を取得する
    引数
        key: 自アカウントのKey
        secret: 自アカウントのSecret
    戻り値
        サーバ上の現在時刻
'''
def getTimestamp(key, secret):
    params = {
        'method': 'get_info2',
        'nonce': time()
    }
    response_dict = tradeRequester(params, key, secret)
    timestamp = response_dict['return']['server_time']
    return timestamp

このメソッドは、これはZaifサーバ上の現在時刻を取得するメソッドです。

このメソッドの必要性について、説明します。

後ほど、メイン処理のループの中で、取引履歴を参照してその結果をポジションリストに反映する処理を実装しますが、参照の際には過去の全履歴を対象とするのではなく、「前回参照時点」から「今回参照時点」までの差分のみを参照する必要があります

例えば履歴中に、あるポジションに対する決済注文があったとして、毎回すべての履歴を参照してしまうとこの決済注文も毎回参照されてしまうため、そのポジションは常に決済済みとみなされてしまいます。すると、仮にすでに発注処理が行われていたとしても、再び発注処理が行われてしまうという不具合が発生することになります。

ここで、「前回参照時点」と「今回参照時点」をどう設定するかという問題が生じますが、作成するbotでは、参照を行った時点の「現在時刻」を使います

「現在時刻」を使うとして、使える時刻はプログラムを稼働させるコンピュータ上の時刻とZaifサーバ上の時刻の2つがあり、これらは必ずしも一致しているわけではありません。

どちらを使うべきか、ですが、取引履歴自体はZaifサーバ上の時刻を用いて記録されていますので、それに合わせて現在時刻もZaifサーバ上の時刻を使うようにします

さて、このメソッドの具体的な内容についても、2点ほど補足します。

まず1点目ですが、現在時刻取得のためには、現物取引APIの中の「get_info2」を使います。そして、このAPIを使った際のサーバからのレスポンス形式は、Zaif APIの仕様によると、以下のようになっています。

{
    "success": 1,
    "return": {
        "funds": {
            "jpy": 15320,
            "btc": 1.389,
            "xem": 100.2,
            "mona": 2600,
            "pepecash": 0.1
        },
        "deposit": {
            "jpy": 20440,
            "btc": 1.479,
            "xem": 100.2,
            "mona": 3200,
            "pepecash": 0.1
        },
        "rights": {
            "info": 1,
            "trade": 1,
            "withdraw": 0,
            "personal_info": 0
        },
        "open_orders": 3,
        "server_time": 1401950833
    }
}

ここで、必要なデータは「server_time」の値です。そこでプログラムでは、レスポンスにおける「return」の中の「server_time」のデータを取得するように記述しています

そして2点目の補足説明ですが、このメソッドを実行した場合、サーバの負荷状況によってはステータスコード502等が返されエラーとなります。しかしながら、メソッドの中にはエラー対応処理を入れていません。

これは、実態としてエラーがこのメソッド内で使用している「tradeRequester」というメソッド内で発生するためです

「tradeRequester」とは前回実装した1つ目のメソッドですが、この中でエラー対応処理を既に実装しているため、「getTimestamp」メソッド内ではエラー対応処理を実装する必要は特段無いのです。

さて、次に「現在価格取得メソッド」を定義します。現在価格の取得は、現物公開API中の「last_price」を使います。

###現在価格取得メソッド
'''
    概要
        取引対象通貨ペアの現在価格を取得する
    引数
        なし
    戻り値
        取引対象通貨ペアの現在価格
'''
def getLastPrice():
    response = requests.get('https://api.zaif.jp/api/1/last_price/' + CURRENCY_PAIR)
    if response.status_code == 200:
        response_json = response.json()
        last_price = response_json['last_price']
        return last_price
    else:
        raise Exception('status_code is {status_code}, params are {params}', status_code = response.status_code, params = 'last_price')

特に難しいところはないと思いますが、現物公開APIの使い方を忘れてしまった方は、第5回目の記事も見返してみて下さい。

前回は、仮想通貨の価格などの公開情報にブラウザからAPI経由でアクセスしました。 今回の記事では、仮想通貨の価格を収集するPython...

ログ取得設定

続いて、プログラム稼働中にログを出力できるよう、初期設定を行います。

##ログ取得設定
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

formatter = logging.Formatter('[%(levelname)s] %(asctime)s %(message)s')
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)

logger.addHandler(stream_handler)

こちらは第15回の記事で紹介している内容と全く同じですので、説明は割愛します。

今回は、前回紹介したログ出力処理の流れを踏まえ、実際にログ出力をおこなうプログラムを作成していきます。 ログ出力処理の流れ(再掲) まず...

時刻変数とループカウンタの定義・初期化

前処理の最後に、そのた必要な変数の定義と初期化を行っておきます。

##時刻変数定義
current_timestamp = None
previous_timestamp = None

##ループカウンタ初期化
counter = 0

時刻変数としては「current_timestamp」と「previous_timestamp」の2つを定義していますが、それぞれ前述の「今回参照時点」と「前回参照時点」に該当します。

これら変数に入れる時刻は後に実装するメイン処理の中で取得しますので、ここではNone(値なし)を設定しています。

また、続いてループカウンタというものを定義しています。メイン処理は繰り返し処理として実装しますが、「現在何回目の繰り返し処理なのか」を表すためにこのカウンタを用います。

ここでは「0」に初期化しておき、メイン処理の中でループを回すごとに「1」を加算します。

終わりに

今回で前処理の実装は完了です。

次回の記事では、冒頭のプログラムの流れ図の中の「②ポジションリストの生成と初期化」の実装を行っていきます。

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

シェアする

フォローする