第六回では板情報を定期的に取得して,指定した条件を満たしたときに注文するプログラムについて学習しましょう.
今回は条件の分岐と自動的に処理を反復してくれる機能をメインに学習します.
自動化のアルゴリズムを作成する点において非常に重要です.今回も集中して取り組みましょう.

板情報の取得と売買のコードは第五回で説明しているので,まだの方は先にそちらをご覧ください.

価格下落時に注文

今回は例として,ビットコインの価格が指定した価格まで下がったときに買い注文を入れるプログラムをご紹介いたします.

ではこちらから今回のプログラムをダウンロードしてください.
※実行すると売買してしまうので,記事を最後まで読んでから実行してください.

4,5行目のyour_secretyour_keyはあなたが取得したものに書き換えてください.

from zaifapi import *
from time import *

zaif_secret = "your_secret"
zaif_key = "your_key"

zaif = ZaifPublicApi()
zaifP = ZaifTradeApi(zaif_key, zaif_secret)

# トレードしたい通貨ペア
pair = "btc_jpy"

# 注文条件の設定
zaif_board_data = zaif.depth(pair)
ask_price = zaif_board_data["asks"][0][0]
desired_price = ask_price - 200
desired_amount = 0.001

print("DesiredPrice:", desired_price, 
      "DesiredAmount:", desired_amount)

# 定期的に板情報を監視
while (True):
    zaif_board_data = zaif.depth(pair)
    ask_price = zaif_board_data["asks"][0][0]
    ask_amount = zaif_board_data["asks"][0][1]
    print("AskPrice:", ask_price, "AskAmount:", ask_amount)

    # 注文条件が成り立っているか確認
    if (ask_price <= desired_price): if (ask_amount >= desired_amount):
            # 注文
            status = zaifP.trade(currency_pair=pair, 
                                 action="bid",
                                 price=int(ask_price),
                                 amount=desired_amount)
            print(status)
            break

    sleep(30)

注文条件の設定

まず,注文条件の設定を14~17行目にて行っています.
今回は0.001BTCを現在の売り注文の最安値より200円安い価格で買うことにします.

定期的な板情報の監視

今回のプログラムでは,指定した価格でビットコインを買うことができるかを定期的に確認する必要があります.
このような,ある処理を定期的に繰り返し実行するのに用いられるのが以下に示す「while文」です.

  while (条件式):
    条件式が成り立つときに実行する処理

「while文」は条件式が成り立っている限り,字下げされたブロック内の処理を繰り返し実行します.

今回のプログラムの「while文」の条件式はTrueとなっていますが,これは常に条件が成り立っていることを意味します.

つまり,プログラムを強制終了するまで次の処理が繰り返し実行されます.

zaif_board_data = zaif.depth(pair)
    ask_price = zaif_board_data["asks"][0][0]
    ask_amount = zaif_board_data["asks"][0][1]
    print("AskPrice:", ask_price, "AskAmount:", ask_amount)

    # 注文条件が成り立っているか確認
    if (ask_price <= desired_price): if (ask_amount >= desired_amount):
            # 注文
            status = zaifP.trade(currency_pair=pair, 
                                 action="bid",
                                 price=int(ask_price),
                                 amount=desired_amount)
            print(status)
            break

    sleep(30)

注文条件が成り立っているか確認

次に最初に設定した価格と量で板に並べられているビットコインを買うことができるのかを確認しています.
ここで条件の確認に用いているのが以下に示す「if文」です.

if (条件式):
    条件式が成り立つときに実行する処理

「if文」は条件式が成り立っていれば,字下げされたブロック内の処理を一度だけ実行します.

プログラムの30行目は

if (ask_price <= desired_price):

となっていますが,これはask_price(現在の売り注文の最安値)がdesired_price(希望購入価格)以下であれば,次に31行目の

if (ask_amount >= desired_amount):

が実行されます.
ここで,ask_amount(現在の最安値の売り注文量)がdesired_amount(希望購入量)以上であれば,初めて33行目にて注文を行います.
そして,38行目にてbreakが実行され,「while文」の繰り返し処理が中断されます.
※breakが実行されると繰り返し処理から抜けます

もし,30,31行目の条件のどちらか一方でも不成立ならば,注文は行われずに40行目のsleep(30)が実行された後,再び23行目の「while文」から実行されます.
ここで,sleepとは括弧内で指定した時間(秒)だけ処理を停止させるもので,ZaifのAPIを短時間のうちに過剰に呼び出さないため措置となっています.

Tips: 条件式について

今回のように単純な数値の比較では,以下のようなものがあります.

条件式 説明
a == b aがbと等しい
a != b aがbと等しくない
a > b aがbより大きい
a < b aがbより小さい
a >= b aがbより大きいか等しい
a <= b aがbより小さいか等しい

また,条件式は以下のように組み合わせることができます.

条件式 説明
条件式1 and 条件式2 条件式1と条件式2が共に成立していれば成立
条件式1 or 条件式2 条件式1と条件式2のうち一方でも成立していれば成立
not 条件式 条件式が成立していれば不成立,そうでなければ成立

これらを使うことで以下のような複雑な条件式を書くことができます.

# aが0であり,かつbが10以下あるいは20以上であれば成立
a == 0 and (b <= 10 or b >= 20)

いかがでしたでしょうか?

条件分岐と繰り返し処理を学習すればこれまで学習したような一度実行して止まるプログラムではなく,自動的に自分の望む動作を実行してくれるプログラムを作成できます.

第七回では実際にFXなどで用いられているトレード方法の一つを実装してみようと思います。