Python×ビットコイン自動売買

#9 Python×ビットコイン自動売買 | Pythonを使ってビットコインを指値注文しよう!

python-bitcoin-limit-order

こんにちは、はやたす(@hayatasuuu )です。

前回の記事では、認証情報の設定と口座残高の取得をおこないました。

前回の記事はこちら

python-bitcoin-balance
#8 Python×ビットコイン自動売買 | 認証情報を設定して口座残高を取得してみよう!こんにちは、はやたす(@hayatasuuu )です。 前回の記事では、API Keyの取得と設定ファイルの準備をおこないました。...

今回から、いよいよPythonを使ってビットコインを発注していきます。
もし口座内に残高がなければ、先に入金を済ませておきましょう。

残高がないと発注をかけたとき、エラーになってしまいます。

※コインチェックのアカウントを持っていない場合は、まず口座開設(無料)しましょう!
»公式ページ : 仮想通貨取引所・販売所の口座開設|Coincheck(コインチェック)

また第1回目でも書きましたが、投資における損失はいかなる理由があっても自己責任です。
その点だけ注意していただけたらと思います。

Pythonを使ってビットコインを指値注文しよう!

前回まで書いていたコードは、以下のようになっていました。

import hmac
import hashlib
import time
from pprint import pprint
import configparser

import requests

conf = configparser.ConfigParser()
conf.read('config.ini')

ACCESS_KEY = conf['coincheck']['access_key']
SECRET_KEY = conf['coincheck']['secret_key']

BASE_URL = 'https://coincheck.com'
url = BASE_URL + '/api/accounts/balance'

nonce = str(int(time.time()))

body = ''
message = nonce + url + body
signature = hmac.new(SECRET_KEY.encode(),
                     message.encode(),
                     hashlib.sha256).hexdigest()
headers = {
    'ACCESS-KEY': ACCESS_KEY,
    'ACCESS-NONCE': nonce,
    'ACCESS-SIGNATURE': signature,
    'Content-Type': 'application/json'
}

r = requests.get(url, headers=headers)
r = r.json()

pprint(r)

 

今回は、この続きからコードを書いていきましょう。

STEP① : エンドポイントの確認

ビットコインを売買するためのAPIは、これまでより複雑になっています。
少しずつ理解していきたいので、まずはドキュメントを確認するところから始めましょう。

»参考記事 : 取引所APIドキュメント | 仮想通貨取引所のCoincheck(コインチェック)

要点を先に書いておくと、以下の3つを見ていくことになります。

  1. 注文方法
  2. リクエスト方法
  3. 指定パラメータ

上記を理解していないと、うまく発注できません。
また間違って発注をかけてしまう可能性もあるので、しっかり確認していきましょう。

注文方法

注文方法(=order_type)は、以下の4つあります。

  • buy : 指値注文 現物取引 買い
  • sell : 指値注文 現物取引 売り
  • market_buy : 成行注文 現物取引 買い
  • market_sell : 成行注文 現物取引 売り

コインチェックではレバレッジ取引ができません。すべて現物です。

個人的には、これもコインチェックを選ぶ理由になってくるかなって思います。
それは、初心者のうちに訳も分からずレバレッジ取引をすると、すぐにお金を溶かしてしまうからです。

注文方法は4つと書いていますが、結局は「指値」か「成行」かです。
今回は学習のために「指値注文」を取り扱いますが、自動売買するときは成行で発注をかけたいと思います。

※もちろん、自分で自動売買ロジックを組むときは指値を使っていただいて大丈夫です!

リクエスト方法

実は今まで、APIにリクエストするとき「GETメソッド」を使っていました。

Pythonのコードで書くとrequests.get()だったので、言われてみればそうだったなって感じですよね。

それに対して、ビットコインを購入するときは「POSTメソッド」を使っていきます。
Pythonのコードで書くとrequests.post()です。

GETとPOSTの違いは、簡単に述べると以下のとおりです。

  • GET : 情報を取得するときに使う
  • POST : 情報を登録するときに使う

今回で考えると、ビットコインの最新価格や板情報など、情報を取得するときはGETを使ってあげます。

反対にビットコインの購入は「購入する」という情報をコインチェック口座に登録するのでPOSTを使っていきます。

指定パラメータ

板情報を取得するとき、以下のようにパラメータを設定していました。

params = {
    'limit': 1
}
r = requests.get(url, params=params)

 

仮想通貨の購入においても、このようにパラメータを指定することで自分の希望する内容で注文をかけられます。

具体的に、必要になるパラメータは以下になります。

  • pair : 通貨ペア(※必須)
  • order_type : 注文方法(※必須)
  • rate : 注文レート(※指値のみ)
  • amount : 注文量(※指値のみ)
  • market_buy_amount : 使用する日本円の金額(※成行のみ)
  • stop_loss_rate : 逆指値レート・ストップロス

これらを上手く使うことで、自分が希望する注文をかけていくことになります。

STEP② : URLの変更

今回使うAPIについて理解できたところで、コードを変更していきましょう。

まずはURLの変更です。
仮想通貨を購入するためのエンドポイントは/api/exchange/ordersになります。

全体を書いてしまうと長くて見辛いので、該当する部分だけ載せておくと以下になります。

# 以前のコード
# url = BASE_URL + '/api/accounts/balance'

# 新しいコード
url = BASE_URL + '/api/exchange/orders'

STEP③ : パラメータの設定

次にビットコインを購入するために、パラメータ設定をおこないます。

最終的には成行で発注をかけますが、今回は指値でテスト注文してみましょう。
いきなり成行で発注するのは、心理的にもハードルがあるので!

この記事を書いている時点で、1BTCは約5,000,000円です。
なので、それよりも小さい3,000,000円で、0.005BTCを指値注文したいと思います。

つまり、Pythonで設定すべきパラメータは以下になります。

params = {
    'pair': 'btc_jpy',
    'order_type': 'buy',
    'rate': '3000000',
    'amount': '0.005'
}

 

もしビットコインの価格が、この記事を読んでいる時点で3,000,000円なら、2,000,000円など指値がかからないラインで発注をかけましょう。

ちなみに、ビットコインの最低取引量は0.005BTCからです。
なので、それよりも少ないロットでの発注は不可能です。

例えば0.001BTCで指値注文をすると、以下のようなエラーが出力されます。

{'error': 'Amount 量が最低量(0.005 BTC)を下回っています', 'success': False}

STEP④ : bodyの設定

パラメータを設定できたら、次にbodyの設定をしましょう。
これまでbodyの部分は以下のように書いていました。

body = ''
message = nonce + url + body

 

でもPOSTするときは、このbodyが必要になってきます。
具体的に、body内には先ほど設定したパラメータの文字列を格納する必要があります。

Pythonのコードで書いてあげると、以下のとおりです。

# 新しくインポート
import json

params = {
    'pair': 'btc_jpy',
    'order_type': 'buy',
    'rate': '3000000',
    'amount': '0.005'
}

# これまでのコード
# body = ''

# 新しいコード
body = json.dumps(params)

message = nonce + url + body

 

json.dumps()を使うことで、辞書になっていたparamsを文字型に変換できます。

STEP⑤ : POSTメソッドでAPIにアクセス

最後にAPIにアクセスして、指値注文をかけましょう。
そのためには、今までGETではなくPOSTを使って、以下のようにコードを作成します。

# 今までのコード
# r = requests.get(url, headers=headers)

# 新しいコード
r = requests.post(url, headers=headers, data=body)

 

GETのときはparams=paramsのように書くことで、辞書のままパラメータを渡していました。

でも今回のようにPOSTの場合は、data=bodyと書いてdataにパラメータを文字型に変換したものを渡してあげます。

ここまで書けたら、コードの作成は完了です。全体像は、以下のようになります。

import hmac
import hashlib
import json
import time
from pprint import pprint
import configparser

import requests

conf = configparser.ConfigParser()
conf.read('config.ini')

ACCESS_KEY = conf['coincheck']['access_key']
SECRET_KEY = conf['coincheck']['secret_key']

BASE_URL = 'https://coincheck.com'
url = BASE_URL + '/api/exchange/orders'

nonce = str(int(time.time()))

params = {
    'pair': 'btc_jpy',
    'order_type': 'buy',
    'rate': '3000000',
    'amount': '0.005'
}

body = json.dumps(params)

# body = ''
message = nonce + url + body
signature = hmac.new(SECRET_KEY.encode(),
                     message.encode(),
                     hashlib.sha256).hexdigest()
headers = {
    'ACCESS-KEY': ACCESS_KEY,
    'ACCESS-NONCE': nonce,
    'ACCESS-SIGNATURE': signature,
    'Content-Type': 'application/json'
}

# r = requests.get(url, headers=headers)
r = requests.post(url, headers=headers, data=body)
r = r.json()

pprint(r)

 

それでは、いま書いたコードを実行してみましょう。
おそらく、以下のような出力になるはずです。

{'amount': '0.005',
 'created_at': '2021-02-14T00:34:09.000Z',
 'id': 3119672666,
 'market_buy_amount': None,
 'order_type': 'buy',
 'pair': 'btc_jpy',
 'rate': '3000000.0',
 'stop_loss_rate': None,
 'success': True}

 

しっかり自分が希望した指値注文が入っていますね!

STEP⑥ : コインチェックで指値注文を確認

念のためコインチェックのTraderViewで、いま発注した指値注文を確認してみましょう。

python-bitcoin-limit-order1

そうすると未約定の注文で、いま発注した指値が入っているかと思います。

これでPythonを使った指値注文ができるようになりました!
今回はテストで指値を発注しただけなので、TraderViewからキャンセルしてしまいましょう。

python-bitcoin-limit-order2

キャンセルが完了すると、利用可能な日本円と総資産が一致するはずです。

python-bitcoin-limit-order3

つまり注文をかけていないし、ポジションを持っていない状態になっています。
これで指値注文のキャンセルも完了しました!

まとめ : Pythonを使ってビットコインを指値注文しよう!

というわけで、今回はPythonを使って、ビットコインを指値で注文しました。

今回紹介した指値注文を活用すれば「トレンドが上に向いているとき、20%下がったら指値注文を入れる」というロジックを組むだけでも利益を出せそうですね!

次回は指値ではなく、成行でビットコインの購入をおこなっていきます。
少しずつ自動売買に近づいていくので、ぜひ楽しみながら学習していただけたらと思います!

第10回目の記事はこちら

market-order-bitcoin-using-api
#10 Python×ビットコイン自動売買 | Pythonを使ってビットコインを購入しよう!こんにちは、はやたす(@hayatasuuu )です。 前回の記事では、Pythonを使ってビットコインの指値注文をおこないました...

トップページはこちら

python-bitcoin-auto-trade
Python×ビットコイン自動売買 | 初心者でも理解できる入門講義『Pythonを使ったビットコインの自動売買って、どうやって実装するんだろう...。分かりやすく書かれている入門記事はないかな〜。』このような悩みを解決する記事になっています。Pythonを使ったビットコインの自動売買を学んでみたい人は必見です。...
ABOUT ME
はやたす
たくさんPythonを紹介するYouTuberです(登録者1.94万人) | フリーランスで機械学習/分析案件も請けています(経験業界 : 金融, 情報通信, サービス) | 元プログラミングスクール講師