第六回では板情報を定期的に取得して,指定した条件を満たしたときに注文するプログラムについて学習しましょう.
今回は条件の分岐と自動的に処理を反復してくれる機能をメインに学習します.
自動化のアルゴリズムを作成する点において非常に重要です.今回も集中して取り組みましょう.
板情報の取得と売買のコードは第五回で説明しているので,まだの方は先にそちらをご覧ください.
価格下落時に注文
今回は例として,ビットコインの価格が指定した価格まで下がったときに買い注文を入れるプログラムをご紹介いたします.
ではこちらから今回のプログラムをダウンロードしてください.
※実行すると売買してしまうので,記事を最後まで読んでから実行してください.
4,5行目のyour_secret
とyour_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などで用いられているトレード方法の一つを実装してみようと思います。
コメントを残す