【コード付き】Pythonで暗号通貨を自動で利確するプログラム〜coincheck編〜

前回、【初心者向け】BTCの自動利確アルゴリズムをPythonで実装する方法という記事を公開したところ、色々な反響をいただきました。
多かったのが、
・初めにビットコインを購入するとき、所持している日本円を全て使って買えるようにして欲しい

・GMOコインを使うと手数料が発生するので、コインチェックversionを実装して欲しい

といった声です。
そこで今回は、この2つの要望を取り入れたPythonコードを公開していきます。

プログラムの動き

前回の記事と全体的な流れはかなり似ています。
①まず、保有している日本円でBTCを買えるだけ買う
②一定期間毎に、市場のビットコイン価格をチェックする
③もし、要求した分より価格が上がっていれば、その場で全て利確する
前回との違いは
・①で自分のアカウントで所有している日本円を参照するようになったこと
・使うAPIがcoincheckのものになったこと
だけですね。

コードを動かすまでの準備

コードを動かすまでの下準備は、いつもと同じです。
必要な事前準備
・口座開設
・APIキーの発行
・必要ライブラリのインストール
下記記事で説明している通りの手順で完了します。
画像つきで解説しているので、参考にしてみてください。

【コピペOK】仮想通貨をPythonで自動売買する方法を初心者向けに解説

2020年12月7日

自動売買プログラム本体

さて、下記にコード本体を掲載します。
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

【保存版】仮想通貨の取引所APIを徹底比較。自動売買に最適な口座はココ!

2020年12月26日
スポンサーリンク

SNSシェアお願いします!

7 件のコメント

  • はじめまして。
    コインチェックでの自動売買をあれこれ探してこちらにたどり着きました。
    大変に興味深い内容でかじりつくように見ております。

    こちらの記事に書かれておりますコードを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)

      などを入れるなどするしかありません。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    CAPTCHA