こんにちは、はやたす(@hayatasuuu )です。
第9回目の本記事では、Pythonを使ってビットコインを指値注文してみたいと思います。
前回の記事 : #8 Python×ビットコイン自動売買 | 認証情報を設定して口座残高を取得してみよう!
もし口座内に残高がなければ、先に入金を済ませておきましょう。残高がないと発注できず、エラーになってしまいます。
また、第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(コインチェック)
仮想通貨を売買するためのエンドポイントは/api/exchange/orders
になります。
このAPIを利用する上で必要な要素は以下の3つです。
- 注文方法
- リクエスト方法
- 指定パラメータ
これらを理解していないと、うまく発注できません。
また、間違って発注をかけてしまう可能性もあるので、それぞれの要素をしっかり確認していきましょう。
注文方法
注文方法(=order_type)は、以下の4つあります。
- buy : 指値注文 現物取引 買い
- sell : 指値注文 現物取引 売り
- market_buy : 成行注文 現物取引 買い
- market_sell : 成行注文 現物取引 売り
コインチェックではレバレッジ取引ができません。すべて現物です。
個人的には、これも「コインチェックを選ぶ理由になってくるかな」って思います。
初心者のうちにワケも分からずレバレッジを使うと、すぐにお金を溶かしてしまうからです。
注文方法は4つと書きましたが、結局は”指値”か”成行”かです。
今回は学習のために「指値注文」を取り扱いますが、あとで自動売買するときは成行で発注をかけたいと思います。
※もちろん自分で自動売買ロジックを組むときは指値を使っていただいて大丈夫です!
リクエスト方法
いままでAPIにリクエストするときは、「GETメソッド」を使っていました。
コードで書くとrequests.get()
だったので、言われてみればそうだったなって感じですよね。
それに対して、ビットコインを購入するときは「POSTメソッド」を使っていきます。コードで書くと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の変更
今回使うエンドポイントについて理解できたところで、コードを変更していきましょう。
まずはURLの変更ですが、全体を書くと長くて見辛いので、該当する部分だけ載せておきます。
# 以前のコード
# url = BASE_URL + '/api/accounts/balance'
# 新しいコード
url = BASE_URL + '/api/exchange/orders'
STEP③ : パラメータの設定
次にビットコインを購入するためのパラメータ設定をおこないます。
最終的には成行で発注をかけますが、今回は指値でテスト注文してみましょう。いきなり成行で発注するのは、心理的にもハードルがあるので。
この記事を書いている時点で「1BTC = 約5,000,000円」なので、それより小さい3,000,000円で、0.005BTCを指値注文してみます。
リクエスト時に設定するパラメータは以下のようになります。
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
を書いていきます。
今回のように、リクエストでPOSTメソッドを使うときはbody
が必要になります。
現状だとbody
は以下のようになっています。
body = ''
message = nonce + url + body
このbody
に先ほど設定したパラメータを「文字列」で格納します。
コードで書くと以下のようになります。
# 新しくインポート
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
と書いて文字型に変換したパラメータを渡してあげます。
ここまで書けたらコードの作成は完了です。コード全体は以下になります。
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を使って指値注文できるようになりました!
今回はテストで指値を発注しただけなので、TraderViewからキャンセルしてしまいましょう。
キャンセルが完了すると、「利用可能な日本円」と「総資産」が一致するはずです。
つまり注文をかけていないし、ポジションを持っていない状態になっています。
これで指値注文のキャンセルも完了しました!
まとめ : Pythonを使ってビットコインを指値注文しよう!
というわけで、この記事ではPythonを使って、ビットコインを指値注文する方法を紹介しました。
今回紹介した指値注文を活用すれば、”トレンドが上に向いているとき、20%下がったら指値注文を入れる”というロジックを組むだけでも利益を出せそうですね!
次回は指値ではなく、成行でビットコインを購入をおこなっていきます。
少しずつ自動売買に近づいていくので、ぜひ楽しみながら学習していきましょう!