初心者が一攫千金を目指してBitcoin自動取引botを作るよ! その1
初心者が一攫千金を目指してBitcoin自動取引botを作るよ! その2の続きになります。
今回はついに、自分で情報を取得し売買を行うbitcoin自動取引Botもどきを作成します!
仕様
組み合わせて動くかの実験として、
**安くなったら買う、そして、高くなったら売る!**みたいな愚直なBotを作ってみました。
①前回の取引額を渡す(この金額が判断の基準となる)
②Bitcoinを持っていてかつ値上がりした場合、売る!(そして、前回取引額を更新する)
③日本円を持っていてかつ値下がりした場合、買う!(そして、前回取引額を更新する)
④取引が処理されない場合、1分待って、待っても処理されない場合、キャンセルする(そして、前回取引額を元に戻す)
【参考】
・取引後のResponseの「order_id」が0でない(order_idが発行されている)場合、取引が保留となっている。
実装
今回より、keyとsecretをjsonにして別ファイルで保管するように変えました。
[]・・・フォルダ
[zaif]
|- main.py
|- [config] - zaif_keys.json
|- ...<略>
# -*- coding: utf-8 -*-
import json
import time
from zaifapi import ZaifPublicApi # Zaifが公開している認証情報が要らないAPIを実行するクラス
from zaifapi import ZaifPrivateApi # Zaifが公開している認証情報が必要なAPIを実行するクラス
from pprint import pprint # 表示用(jsonをきれいに表示してくれる)
zaif_keys_json = open('config/zaif_keys.json', 'r')
zaif_keys = json.load(zaif_keys_json)
KEY = zaif_keys["key"]
SECRET = zaif_keys["secret"]
if __name__ == '__main__':
zaif_public = ZaifPublicApi()
zaif_private = ZaifPrivateApi(KEY, SECRET)
# 前回の取引額
Last_transaction_amount = 122210
# 情報取得
last_price = int(zaif_public.last_price('btc_jpy')["last_price"])
trade_info = zaif_private.get_info2()
funds_btc = trade_info["funds"]["btc"]
funds_jpy = trade_info["funds"]["jpy"]
print('■ 現在の情報です。')
print('last_price: ' + str(last_price))
print('funds_btc: ' + str(funds_btc))
print('funds_jpy: ' + str(funds_jpy))
cancel_flag = False
order_id = 0
last_price_old = 0
# btcを持っていて値上がりしたとき
if funds_btc != 0 and last_price > Last_transaction_amount:
# Bitcoinを売る
trade_result = zaif_private.trade(currency_pair="btc_jpy", action="ask", price=last_price, amount=funds_btc)
print('■ Bitcoinの売却申請を行いました。')
pprint(trade_result)
last_price_old = Last_transaction_amount
Last_transaction_amount = last_price
if trade_result["order_id"] != 0:
cancel_flag = True
order_id = trade_result["order_id"]
else:
print('■ 取引が完了しました。')
# jpyを持っていて値下がりしたとき
# (最小単位(0.0001btc分)の日本円以上を持っていたとき)
elif funds_jpy > Last_transaction_amount / 10000 and last_price < Last_transaction_amount:
# APIが小数点以下4桁までの対応なのでround()
# 小数点第5位が繰り上げの場合、資産不足になるため(- 0.0001)
amount = round(float(funds_jpy) / last_price, 4) - 0.0001
# Bitcoinを買う
trade_result = zaif_private.trade(currency_pair="btc_jpy", action="bid", price=last_price, amount=amount)
print('■ Bitcoinの購入申請を行いました')
pprint(trade_result)
last_price_old = Last_transaction_amount
Last_transaction_amount = last_price
if trade_result["order_id"] != 0:
cancel_flag = True
order_id = trade_result["order_id"]
else:
print('■ 取引が完了しました。')
# 取引が保留となった場合、60秒待ってまだ保留の場合はキャンセルを行う
if cancel_flag:
print('■ 60秒間待機します。')
time.sleep(60)
trade_info = zaif_private.get_info2()
if trade_info["open_orders"] > 0:
print('■ キャンセルしました。')
pprint(zaif_private.cancel_order(order_id=order_id))
Last_transaction_amount = last_price_old
else:
print('■ 取引が完了しました。')
pprint(trade_info)
main.pyと同じ階層にフォルダ「config」を作成し、下記jsonファイルに保存します。
{
"key" : "【作成したKey】",
"secret" : "【作成したsecret】"
}
■実行結果
btcを持ってて値上がりしたとき
■ 現在の情報です。
last_price: 126725
funds_btc: 0.0075
funds_jpy: 7.9355
■ Bitcoinの売却申請を行いました。
{u'funds': {u'btc': 0.0, u'jpy': 7.9355, u'mona': 0.0, u'xem': 0.0},
u'order_id': 156957485,
u'received': 0.0,
u'remains': 0.0075}
■ 60秒間待機します。
■ 取引が完了しました。
{u'deposit': {u'btc': 0.0, u'jpy': 958.373, u'mona': 0.0, u'xem': 0.0},
u'funds': {u'btc': 0.0, u'jpy': 958.373, u'mona': 0.0, u'xem': 0.0},
u'open_orders': 0,
u'rights': {u'info': 1, u'personal_info': 0, u'trade': 1, u'withdraw': 0},
u'server_time': 1491323133}
■実行結果
jpyを持ってて値下がりした時
■ 現在の情報です。
last_price: 126815
funds_btc: 0.0
funds_jpy: 959.048
■ Bitcoinの購入申請を行いました
{u'funds': {u'btc': 0.0, u'jpy': 7.9355, u'mona': 0.0, u'xem': 0.0},
u'order_id': 156951488,
u'received': 0.0,
u'remains': 0.0075}
■ 60秒間待機します。
■ 取引が完了しました。
{u'deposit': {u'btc': 0.0, u'jpy': 959.048, u'mona': 0.0, u'xem': 0.0},
u'funds': {u'btc': 0.0, u'jpy': 7.9355, u'mona': 0.0, u'xem': 0.0},
u'open_orders': 1,
u'rights': {u'info': 1, u'personal_info': 0, u'trade': 1, u'withdraw': 0},
u'server_time': 1491322779}
1日無限ループで動かしてみた結果
上記コードを加工し、1分ごとに1回実行し、1日動かしてみました。
①「# 情報取得」の手前に無限ループ「while True:」を挿入
②コードの一番後ろに「time.sleep(60)」を挿入
その結果は・・・!
昨晩の1回目の取引の金額:¥957.8495
■ 取引が完了しました。
{u'deposit': {u'btc': 0.0, u'jpy': 957.8495, u'mona': 0.0, u'xem': 0.0},
u'funds': {u'btc': 0.0, u'jpy': 957.8495, u'mona': 0.0, u'xem': 0.0},
u'open_orders': 0,
u'rights': {u'info': 1, u'personal_info': 0, u'trade': 1, u'withdraw': 0},
u'server_time': 1491324869}
只今の所持金:¥958.8245
■ 現在の情報です。
last_price: 127740
funds_btc: 0.0
funds_jpy: 958.8245
計算してみると。。。
¥957.8495▶¥958.8245なので、¥0.975の利益・・・!
(´◉◞౪◟◉)うん…
反省点をまとめようか。
反省点というか問題点
・1分ごとの瞬間の値しか見れない(変動がわからない)
・取引額を変数に格納しているだけなので、エラーで落ちると飛ぶ
・自宅PCのコンソールで動かし続けるの美しくない(寝るときPCのファンがうるさい)
・以下の場合(条件から外れて帰ってこない場合)、取引が一切できなくなる
・Bitcoinを持っていてかつ値下がりした場合
・日本円を持っていてかつ値上がりした場合
・0.0001でも値上がりした場合でも売るってだめなのでは(利益でない・・・)
おわりに
なにはともあれ1日落ちずに動いたのは良かったです。
次回は反省点を活かし、AWS Lambda上で実行してみたいと思います!
Lambdaだと都度実行になるので、データが飛ばないようにDBにもデータを格納しないといけませんね。
※Lambdaとは、簡単に言うとコードをアップすると実行してくれるやつです。[参考]
サーバーを立てなくていい、環境を構築しなくていい優しいフレンズです(*´ω`*)
お疲れ様でした~
更新履歴
2017/04/06:keyとsecretをjsonにして別ファイルで保存した旨の記載が抜けてました。。。