ビットコインの購入後、利益が出たら所持しているBTC残高を自動で全て売却するプログラムは作成可能ですか?
もちろんこういったプログラムは作成することが可能です。
ということで今回の記事では、自動利確プログラムのPythonサンプルコードを公開していこうと思います。
補足
前提として、そこそこ大きい値幅で機械的に利益確定を行いたい場合は、必ずしもプログラムに頼る必要はありません。
例えば400万円でビットコインを購入していた場合、10%の利益が出た時点で利確をしたいなら、440万円の自転に指値の売り注文を手動で置いておけばいいわけです。
(こちらの方がイレギュラーが少なくて安心感がありますね)
後でも説明するように、これはデモコードなので結構不自然な挙動をしています。 前提として、そこそこ大きい値幅で機械的に利益確定を行いたい場合は、必ずしもプログラムに頼る必要はありません。
例えば400万円でビットコインを購入していた場合、10%の利益が出た時点で利確をしたいなら、440万円の自転に指値の売り注文を手動で置いておけばいいわけです。
(こちらの方がイレギュラーが少なくて安心感がありますね)
購入⇒3%程度の利益で売却
という動きを繰り返す時にこういったプログラムが必要になることでしょう。
自分のやりたいことに合わせてカスタマイズしていくと良いと思います。
目次
自動利確プログラムの本体
さて、勿体つけずにコードを公開したいところですが、例によって今回も多少の下準備が必要です。APIキーの発行までを行っておく
今回は GMO コインの API を利用しているので、あらかじめ口座開設とAPIキーの発行を済ませておいてください。下準備の具体的な手順は下の記事で解説しているものと全く同じです。 この手順通りに作業し、APIキーを発行しておいてください。
また、今回使用するGMOのAPIラッパーも上記記事と同じものなので、記事の手順通りpipでインストールすればOKです。
プログラム本体
今回作成してみたプログラムの全体は、次のような感じです。import json
from gmocoiner import GMOCoin
import sys
import time
api_key = input("APIキーを入力してください")
secret = input('シークレットキーを入力してください')
#3%のリターンで利確するとする
return_ratio = 0.03
#購入後、デフォルトで5秒ごとに利確するか判定する
interval_sec=5
#botを作動させるおおよその秒数
working_time = 3000
#GMOのAPIラッパーのインスタンス
gmo = GMOCoin(api_key, secret, late_limit=True, logger=None)
#まず、何も考えず0.01ビットコインを成り行きで購入する
#実運用時は、特定の条件で買う仕様にすると良いかも?
buy_order_resp=gmo.order("BTC_JPY","BUY","MARKET","0.01").json()
print("最初にビットコインの購入注文を行いました。サーバーからの応答は以下です。")
print(json.dumps(buy_order_resp,indent=2))
#最新の約定情報を取得。APIのドキュメントによると、このメソッドは直近1日の約定した注文にしか使えないらしい
resp = gmo.latestexecutions("BTC_JPY")
#respの中身を表示しとく(デバッグ用)
print(json.dumps(resp.json(), indent=2))
#ちゃんと約定履歴が存在していたらレスポンスに"list"の値が入ってるみたい(未検証)
if "list" in resp.json().keys():
#想定する取引(先程のビットコインの購入)を対象にデータを取得できているか簡単にチェック
if resp.json()["list"][0]["side"]=="BUY" and resp.json()["list"][0]["symbol"]=="BTC":
#直近約定したビットコインの価格と数量を取得.数量はstringのままで良い
price_when_you_bought = float(resp.json()["list"][0]["price"])
amount_you_bought = resp.json()["list"][0]["size"]
else:
print("購入履歴データに想定外のデータが入っています")
print("プログラムを終了します。")
sys.exit()
else:
print("購入履歴データを参照できませんでした。※始めの購入が正常に行われなかった可能性があります。")
print("プログラムを終了します。")
sys.exit()
for i in range(int(working_time/interval_sec)):
#ビットコインの直近価格を取得
price_now = float(gmo.ticker(symbol='BTC_JPY').json()["data"][0]["last"])
#True or False
you_want_sell = price_now > (1 + return_ratio)*price_when_you_bought
if you_want_sell:
print("利確ラインを超えたので、売却処理を行います。")
amount_you_sell = amount_you_bought
#初めに購入した分だけでなく、全ての保有ビットコインを売りたい場合は、下記のようにするといいはず(未検証)。
# for dict in gmo.account_assets().json()["data"]:
# if dict["symbol"]=="BTC":
# print(dict)
# amount_you_sell = dict["amount"]
sell_order_resp=gmo.order("BTC_JPY","SELL","MARKET",amount_you_sell).json()
print("サーバーからの応答は以下です。")
print(json.dumps(sell_order_resp,indent=2))
print("利確処理を行ったのでプログラムを終了します。")
sys.exit()
time.sleep(interval_sec)
print("利確ラインに一度もビットコイン価格が到達しませんでした。売れずに残っているビットコインを手動で処理してください。")
ただし、今回のプログラムでは僕自身未検証な部分が多いです。
例えば、latestexcutionsというメソッドで自分の約定履歴を参照していますが、最新の約定履歴が存在していない場合返ってくる辞書に”list”というキーがありません。
これが原因で、僕自身は本番に近い状態でテストすることができなかったんですよね。
(つまり、実際に直近にビットコインを購入していれば正常に作動するはずなのですが、僕はこれを書いた時にビットコインの購入履歴がありませんでした。
なのでテストする術がなかったということです)
もしこのコードを実際に使ってみた人で該当箇所が原因で正常に動作しなかったよと言う方は報告していただけるとありがたいです。
さて、今度は補足としてこのコードの動きを日本語でも説明していきます。
コードの動作の説明
このコードがやってることは以下の通りです。自動利確プログラムの動き
①まず何も考えずにBTCを成行注文で購入してみる②自分の約定履歴を参照して約定価格と約定数量を取得する
③その後、一定時間ごとにBTC価格を観測し続ける
④もし途中ではじめに指定した価格よりも値上がりしていたなら即座に売却する
その場合は余ったビットコインを手動で処理する必要が出てきます。
発展としては、①で無条件にビットコインを購入するのではなく特定の条件でのみ購入するようにしておくともう少しbotらしくなるかもしれませんね。 【追記】コインチェック版も作りました!(下記記事)
こんばんは。
初めまして。
アサヒと申します。
このようなコードを探していたので非常に参考になります。
ありがとうございます。
GMOコインだと手数料が発生してしまうため、
コインチェックで自動売買を考えております。
きむ公様のコード参考に作成しようとしたのですが、うまくいっておらず。。。
同様の内容でコインチェックverご教授いただけないでしょうか。
また、以下コードを日本円残高を取得しその金額でBTCを購入に変更したいです。
#まず、何も考えず0.01ビットコインを成り行きで購入する
#実運用時は、特定の条件で買う仕様にすると良いかも?
buy_order_resp=gmo.order(“BTC_JPY”,”BUY”,”MARKET”,”0.01″).json()
print(“最初にビットコインの購入注文を行いました。サーバーからの応答は以下です。”)
print(json.dumps(buy_order_resp,indent=2))
行いたいイメージとして、日本円残高でBTC購入 → 3%程度の利益で保有ビットコインをすべて売却となります。
お忙しい中申し訳ありませんが、
よろしくお願い申し上げます。
アサヒ
コメントありがとうございます!
コードを新規記事として公開しておきました!