前回、【初心者向け】BTCの自動利確アルゴリズムをPythonで実装する方法という記事を公開したところ、色々な反響をいただきました。
多かったのが、
・初めにビットコインを購入するとき、所持している日本円を全て使って買えるようにして欲しい
といった声です。・GMOコインを使うと手数料が発生するので、コインチェックversionを実装して欲しい
そこで今回は、この2つの要望を取り入れたPythonコードを公開していきます。
目次
プログラムの動き
前回の記事と全体的な流れはかなり似ています。 ①まず、保有している日本円でBTCを買えるだけ買う
②一定期間毎に、市場のビットコイン価格をチェックする
③もし、要求した分より価格が上がっていれば、その場で全て利確する
前回との違いは②一定期間毎に、市場のビットコイン価格をチェックする
③もし、要求した分より価格が上がっていれば、その場で全て利確する
・①で自分のアカウントで所有している日本円を参照するようになったこと
・使うAPIがcoincheckのものになったこと
だけですね。・使うAPIがcoincheckのものになったこと
コードを動かすまでの準備
コードを動かすまでの下準備は、いつもと同じです。必要な事前準備
・口座開設・APIキーの発行
・必要ライブラリのインストール
画像つきで解説しているので、参考にしてみてください。
自動売買プログラム本体
さて、下記にコード本体を掲載します。from coincheck import market,order,account
import time
import pandas as pd
import sys
access_key=input("APIのアクセスキーを入力してください")
secret_key=input("APIのシークレットキーを入力してください")
#約何秒間botを起動させるか
working_time=300
#何秒ごとに価格データを確認するか
interval_sec=10
#何%のリターンで利確するか(デフォルトで3%)
return_ratio = 0.03
#コインチェックAPIのラッパーインスタンス
m1=market.Market()
o1 = order.Order(secret_key=secret_key,access_key=access_key)
#日本円残高を取得
a1 = account.Account(secret_key=secret_key, access_key=access_key)
your_jpy = float(a1.get_balance()["jpy"])
#APIラッパーに成行き注文が実装されてなかったので、現在価格で指値の買い注文を出す
#成行きにこだわる場合は、orderクラスを継承して自分で新しいクラスを作るしかないかも
##まず最新の価格を取ってくる
price_now = m1.ticker()["last"]
##買える数量を計算
amount = your_jpy/price_now
if amount < 0.005:
print("所持金不足により、最低注文数量(0.005)を満たせませんでした。")
print("プログラムを終了します。")
sys.exit()
print("買い注文を実行します")
print(o1.buy_btc_jpy(rate=str(price_now),amount=amount))
#自分の取引履歴を確認して、ちゃんと買えてるか簡単にチェック
#例によってこの辺は未検証部分多し
if len(o1.history()["transactions"]) > 0:
if o1.history()["transactions"][0]["pair"]=="btc_jpy" and o1.history()["transactions"][0]["side"]=="buy":
print("履歴からビットコインの購入が確認できましたが、実運用ではより厳密にチェックする必要があるでしょう")
rate_when_you_bought=float(o1.history()["transactions"][0]["rate"])
else:
print("購入履歴が想定外です。")
print("プログラムを終了します。")
sys.exit()
else:
print("購入履歴が存在しません。")
print("プログラムを終了します。")
sys.exit()
#BTC価格を観測し続けて、良いタイミングで売却を狙う
for i in range(int(working_time/interval_sec)):
##最新の価格をチェック
btc_price = m1.ticker()["last"]
#利確ラインにBTC価格が達したか
you_want_sell = btc_price > (1+return_ratio)*rate_when_you_bought
if you_want_sell:
print("利確ラインを超えたため、保有BTCを全て売却します。")
#保有BTC量を取得
amount_you_sell = float(a1.get_balance()["btc"])
#売却注文
print(o1.sell_btc_jpy(rate=str(btc_price),amount=amount_you_sell))
print("利確処理を行ったので、プログラムを終了します。")
print("※利確用の注文が指値注文になっているので、BTCが売れずに残っている可能性が無くはないので注意です。")
sys.exit()
time.sleep(interval_sec)
print("利確ラインに一度もビットコイン価格が到達しませんでした。売れずに残っているビットコインを手動で処理してください。")
プログラムを実行する時の注意点
今回のコードでも、色々と注意点が存在します。①前回と同じく、未検証の部分があります
コード作成時点で、導入部分の検証の為に僕自身が日本円を全て使ってビットコインを購入するという動きをしていません。
(もし損失が出たら嫌だったからです笑)
なので取引履歴を参照したりする部分は本番と同じ環境での検証が出来てません。
もしエラー吐いた場合はご一報いただけると嬉しいです。
②成行き注文に対応していない
GMOのAPIラッパーは成行注文が出来るのですが、コインチェックの方は未対応のようです
どうしても成行きで行きたい場合は、自分で新しいクラスを継承してつくると良いです。
もしくは、ラッパーの開発者にissueを投げるとかですかね……?
ということで、コインチェック版の自動利確プログラムでした!
エンジョイ投資ライフ(^^)b
プログラム作成依頼について
「こういうプログラム作って欲しいよ!」という要望がある場合は下記ページより依頼してくださいm(_ _)m
「こういうプログラム作って欲しいよ!」という要望がある場合は下記ページより依頼してくださいm(_ _)m
自動売買Pythonプログラムの開発依頼の受け付けを始めました
1週間程度でコードを書いてnoteで公開しようと思います。
はじめまして。
コインチェックでの自動売買をあれこれ探してこちらにたどり着きました。
大変に興味深い内容でかじりつくように見ております。
こちらの記事に書かれておりますコードをcmdで実行したところ
下記のようなエラーが出てそこから先に進まない状態になってしまいました。
Traceback (most recent call last):
File “coincheck.py”, line 24, in
your_jpy = float(a1.get_balance()[“jpy”])
KeyError: ‘jpy’
一部分変更(amount = 0.005)しましたがそれはこれよりもあとの行なので
影響はないと思うのですが…
関係あるかは分かりませんがpandasのインストール時に
コインチェックのバージョンなんたらと互換性がありません的なエラーが出ていましたが…
(消してしまって詳細不明です)
あと再度 pandasをインストール実行すると
WARNING: You are using pip version 20.1.1; however, version 21.0.1 is available.
バージョン相違のようですがこの後の動作を考えるとアップデートするべきなのでしょうか?
Pythonは記事と全く同じバージョンのものをインストールしました。
お手数ですがご教示いただけますと幸いです。
よろしくお願いします。
コメントありがとうございます。
アクセスキーとシークレットキーが間違っている可能性が高いです。
pandasのバージョンなどはこのエラーとは関係ないです。
正しいアクセスキーとシークレットキーを入力しないと、
a1.get_balance()
で以下のような辞書が返ってきます。
{‘success’: False, ‘error’: ‘invalid authentication’}
成功時と違い、この失敗時の辞書には’jpy’というキーが存在しないのでそこで怒られているのではないかな、と思います。
こんばんは。
繰り返し処理を行うと、以下のようなエラーが発生してしまいます。
こちらの対処方法ありますでしょうか。
利確ラインを超えない限りずっとプログラムを動かし続けているので、起きている現象かと思います。
HTTPSConnectionPool(host=’coincheck.com’, port=443): Max retries exceeded with url: /api/ticker (Caused by SSLError(SSLError(“bad handshake: SysCallError(10054, ‘WSAECONNRESET’)”)))
ご確認お願い致します。
おそらくコインチェックサーバーに頻繁にリクエストを送りすぎて怒られているのだと思います。
import time
した上で
forループの中に
time.sleep(3)
などを入れるなどするしかありません。
ありがとうございます。
申し訳ありません。
貼り付けるエラーコード間違えたのでコメント削除お願いします。。。
了解です。削除しておきました。
“履歴からビットコインの購入が確認できましたが、実運用ではより厳密にチェックする必要があるでしょう”のコメントが出た後、数分後に強制的に終了するんですがどうしたらいいですか?
数分間、bitcoinが指定ラインに値上がりしなければ、強制終了するのは仕様です。
もっと長時間粘りたい場合は
working_time=300
の所をもっと大きくすればOKです。
無限に作動させる場合は最後のfor文を
while True:
に変えてください。
売り注文確定後、強制的に終了するんですが繰り返し動作しないのはどこが問題ですか?
出来れば繰り返し自動取引がしたいです。
それは完全に仕様ですね。
繰り返し動作させたい場合は、sys.exit()を削除した上でコードのメイン部分をforループもしくはwhileループで回す感じに改造するしかありません。
ちなみに紹介していただいているコードですとどのように変更したらいいのですか?
tickerで、ファクトムやモナの最新のレートを拾うコードはありますか?
上記コードの
price_now = m1.ticker()[“last”]
では、ビットコインのものになってしまいます。
ファクトムやモナを指定することは可能でしょうか?
APIのドキュメントを読みましたが、モナやファクトムなどのアルトコインのティッカー情報を取得の方法は書いてないですね。
多分無理なのかもしれません。
ちなみに販売所の価格なら以下コードで取得可能でした。
import requests
import ast
#モナの販売所のレートを取得する場合
url = “https://coincheck.com/api/rate/mona_jpy”
print(float(ast.literal_eval(requests.get(url).text)[“rate”]))
下記も苦肉の策ですが、過去の約定価格ではなく現在でている注文レートを取得する方法です。
import json
url = “https://coincheck.com/api/trades?pair=mona_jpy”
trade_info = requests.get(url).text
print((json.loads(trade_info)[“data”][0][“rate”]))
何故かいつも整数の値が返ってくるのが不気味ですが…
こちらのプログラムを、受け取ったBTCで受け取ったときのJPY価格と比べて
利確時でも売却できるようにする方法を教えていただきたいです。
よろしくおねがいします。
マイナー兄 さん
コメントありがとうございあます。
「〜〜のプログラムはどう書くの?」系の質問は、現在note記事作成依頼としてのみ受け付けている状況です(下記ページ参照)。
https://in-base.com/contract-development-python
すっきり答えられずに申し訳ありません。。
(ちなみに、そのため厳密にご要望通りの機能を実装するのは難しいです。APIのドキュメントを読むに受け取り時のBTC価格はコインチェックサーバーに記録されていない可能性が高いからです。受取時の日時は取得できるので、妥協策として受取時付近のBTC価格を調べてその価格に対して利確処理〜〜というのは可能かもしれません。ただ少なからず誤差は生じます。)