bifFlyerのAPI経由でPythonで「買い注文」を出してみよう

さあ! ようやくここまで来ました!
いよいよPythonでプログラムを書いて、実際にBitflyerに注文を出してみましょう! まずはシンプルに「買い」の注文を出してみることにします。

今回はあくまでテストなので、成約しないように、最低単位のBTCを指値で注文します。注文後は、いったん自分で手動で注文をキャンセルしてください。

(bitFlyerのアカウント登録がまだの方は、ぜひこちらから登録してください)

事前準備(必要な口座残高)

bitFlyer lightning の最低注文単位は0.01BTCからです。
現在(2018年4月)のレートでいうと1万円くらいですね。

bitFlyerFXで注文するための必要証拠金は、レバレッジの倍率によって違います。例えば、レバレッジ2倍で100万円分(=約1BTC)のポジションを取るには、最低50万円の残高が必要です。一方、レバレッジ10倍であれば、最低10万円の残高が必要です。

ちなみに追証ラインは80%、ロスカットライン(証拠金維持率)は50%です。レバレッジ2倍の例だと、90万円を切った時点で追証がかかり、75万円を切ると強制決済されます。レバレッジ10倍の場合だと、98万円を切った時点で追証がかかり、95万円を切ると強制決済されます。

Bitflyerの必要証拠金について
Bitflyerのロスカット(証拠金維持率)について

この記事では0.01BTCの注文しか出しませんので、残高は数万円もあれば十分です。

(追記) 2018年4月から最低注文単位が0.01BTCに引き上げられました。この記事はそれ以前に作成したものなので、文字部分は修正していますが、一部の画像が0.001BTCのままになっています。

bitFlyerの買い注文のAPI

bitFlyer(FX)の買い注文のAPIは以下のような形式になります。

https://api.bitflyer.jp/v1/me/sendchildorder

今まで勉強したパブリックAPIに似ていますね。ただしこちらのURLは今までのようにブラウザで見ることはできません。

理由は「POSTメソッドという通信方式で送らないといけないから」ですが、意味がわからなくても構いません。単に、何となく以下のようなパラメーターをボディに含めて送る方式だと理解してください。

必要なパラメーター

1)product_code
取引する通貨種類のこと。現物なら「BTC_JPY」。今回はFXなので「FX_BTC_JPY」

2)child_order_type
指値注文か成行注文か、という意味。今回は指値注文なので「LIMIT」と入れる。

3)side
買い(ロング)か売り(ショート)か。今回は買いエントリーするので「BUY」と入れる。

4)price
指値注文を入れる場合には、価格の指定が必須になる。今回は練習なので、bitFlyerFXの管理画面にログインして現在価格を確認して、そこから10~20%乖離した価格(間違って成約しない価格)を入れる。

5)size
注文数量(ロット数)。今回は、最低単位の0.01BTCだけ買いたいので、「0.01」を入れる。

他にも設定できるパラメーターはありますが、今回、指定する必須のパラメーターはこれだけです。

なお、どのようなパラーメーターを設定できるのかは、BitflyerのAPI仕様書を見ればわかります。前の記事でも言いましたが、なるべく自分でAPI仕様書を読むことに対して、抵抗感が無くなるようにしておきましょう。

買い注文のAPI仕様書(公式ドキュメント)

買い注文の価格について

もう少しレベルの高い自動売買BOTだと、指値の注文価格は当然、自動で設定します。例えば、API経由で現在の板情報を取得して、買い板の中で一番高い価格(買い気配値)を設定することが多いです。すでに当ブログでAPIの使い方を学んでくださった方は、大雑把なやり方のイメージは付くと思います。

ですが今回の記事では、BTC-FXの管理画面にログインして、自分の目で現在価格を確かめ、少し離したところに指値を入れることにします。この記事の執筆時点では、最終取引価格が90万500円なので、今回は10%以上離して、80万円に買い指値を入れてみます。

具体的なPythonコード

あまり前置きが長くなっても良くないので、いったん具体的なソースコードを全部見ておきましょう。少し長くなりますが、怖がらないで、まずはザっと意味を想像しながら、読んでみてください。


import hashlib
import hmac
import requests
import datetime
import json


api_key = "APIキーを入力"
api_secret = "APIシークレットを入力"

base_url = "https://api.bitflyer.jp"
path_url = "/v1/me/sendchildorder"
method = "POST"

timestamp = str(datetime.datetime.today())

param = {
	"product_code" : "FX_BTC_JPY",
	"child_order_type" : "LIMIT",
	"side" : "BUY",
	"price" : 指値価格を入力,
	"size" : 0.01,
}
body = json.dumps(param)

message = timestamp + method + path_url + body
signature = hmac.new(bytearray(api_secret.encode('utf-8')), message.encode('utf-8') , digestmod = hashlib.sha256 ).hexdigest()

headers = {
	'ACCESS-KEY' : api_key,
	'ACCESS-TIMESTAMP' : timestamp,
	'ACCESS-SIGN' : signature,
	'Content-Type' : 'application/json'
}

response = requests.post( base_url + path_url , data = body , headers = headers)
print( response.status_code )
print( response.json() )


今まで当ブログで紹介した中では、一番長いpythonコードが出てきました。「ほら…やっぱり、プログラムは難しいじゃないか…騙された….」と思った方もいるかもしれません。

ですが、上記をすべて自分で書く必要は全くありません。実は、「買い注文をするコード」を1行書くだけで実行してくれる便利な「ライブラリ」が存在するからです。

「なんだよ!だったら最初からそれを教えろよ!」と思うかもしれません。ちゃんと次の記事からはその方法を紹介します。しかし、1度だけでいいので、「自分でAPI経由で注文してみる」ということをやってみることをお勧めします。

応用力をつけて欲しい

CCXTなどの便利なライブラリは、結局のところ、内側でBitflyerのAPIを呼んでいるだけにすぎません。なので、内側で「どのようなことが行われているのか?」のイメージを掴んでおくことは、今後、自分で自動売買BOTを作る上で絶対に必要です。

そのイメージがないと、「ライブラリでどんなことが可能なのか?」「どのようなカスタマイズが可能なのか?」「なぜ自分のコードが動かないのか?」「エラーが出た場合、どこに原因がありそうか?」が全く理解できなくなり、応用ができなくなるからです。

内側で各取引所のAPIを呼んでいることを理解していれば、よりライブラリを便利に使いこなすことができます。BitflyerのAPIを直で使って注文を出すのは、今回の記事の1回限りなので、1度だけ勉強だと思って付き合ってみてください。

ソースコードの意味を解説

繰り返しになりますが、プログラム初心者の方は、最初から自分でソースコードを書く必要はありません。最初に目指すべきなのは、「ソースコードを自力で読めるようになること」「読めば、大体、何をやっているのか理解できるようになること」です。

読めるようになれば、ネットに落ちているソースコードを拾って、どの部分をカスタマイズすれば「やりたいこと」ができるのか、のアタリを付けることができます。

ここでも上記のソースコードの意味を上から純に説明していきます。

importするライブラリ

import hashlib
import hmac
import requests
import datetime
import json

まず最初にこのプログラムで必要なライブラリをインポートします。

hashlibとhmacは、APIシークレットを暗号化して送るために使うライブラリです。requestsはAPIリクエスト(https://api.bitflyer.jp/~)を送るためのライブラリです。

datetimeは現在時刻を取得するためのライブラリです。どの取引所でもAPIで注文を出すときには、現在時刻(タイムスタンプ)をリクエストに含めるのが普通です。またjsonは、指値価格や注文量などのパラーメータをJSON形式に変換するために使います。

必要な情報を揃える

api_key = "APIキーを入力"
api_secret = "APIシークレットを入力"

base_url = "https://api.bitflyer.jp"
path_url = "/v1/me/sendchildorder"
method = "POST"

ここは見れば意味がわかると思います。
今回のプログラムで必要なURLやAPIキーなどの情報を最初に変数に入れておきます。また今回はPOSTメソッドで通信するので、methodという変数も用意しておきます。

timestamp = str(datetime.datetime.today())

現在時刻を、datetime.datetime.today()で取得します。
この日付データを「文字」に変換するために、str()で囲っています。文字に変換しないとhttps通信で送れないからです。変換した結果を、「timestamp」という変数に入れておきます。これも後で使います。

注文に必要なパラメーターをセット

param = {
	"product_code" : "FX_BTC_JPY",
	"child_order_type" : "LIMIT",
	"side" : "BUY",
	"price" : 指値価格を入力,
	"size" : 0.01,
}
body = json.dumps(param)

これは、先ほど確認したように、bitFlyerのAPI注文で必要になるパラメーター(通貨の種類、指値/成行、ロング/ショート、指値価格、注文ロット数)です。

これをparamという変数にセットして、それをjson.dumps()でJSON形式に変換します。JSON形式にしないと、HTTPS通信のデータとして送れないからです。JSON形式に変換したデータは、bodyという変数に入れておきます。

これらのbodyのデータは、通信データの「ボディ」という部分に入れて送ります。メールの本文に該当するイメージです。

認証のための暗号文(署名)を作る

message = timestamp + method + path_url + body
signature = hmac.new(bytearray(api_secret.encode('utf-8')), message.encode('utf-8') , digestmod = hashlib.sha256 ).hexdigest()

最初に読んだとき、この部分が一番、「難しい…わからない…」と思った方が多いかもしれません。

この部分では、「この注文メッセージを作って送っているのが、本当にあなた本人である」「成りすましや通信途中での改竄がされていない」ということを証明するために、APIシークレットを鍵にして、本文を暗号化(署名)しています。

いわゆるメッセージ認証コード(HMAC)という認証のための暗号アルゴリズムですが、暗号分野に興味のある方以外は、深く理解する必要はありません。単に何となく「こう書くものなんだ」と考えておいてください。興味がある方は、「hmac() python」で検索すればわかります。

通信データのヘッダーを作る

headers = {
	'ACCESS-KEY' : api_key,
	'ACCESS-TIMESTAMP' : timestamp,
	'ACCESS-SIGN' : signature,
	'Content-Type' : 'application/json'
}

ここでは、通信データのヘッダーを作っています。
メールのヘッダーのようなものですね。ここに、「APIキー」「現在時刻」と、さきほどの「暗号署名」をセットします。これで通信文の準備はできたので、あとはbitFlyerのサーバーに送るだけです。

APIリクエストを送る

response = requests.post( base_url + path_url , data = body , headers = headers)
print( response.status_code )
print( response.json() )

requests()関数を使って、指定したURL(https://api.bitflyer.jp/~)宛に、さっき作った通信データ(bodyが注文情報、headersがAPIキーや署名)を、postメソッドで送っています。そしてサーバーから返ってきた情報を、responseという変数に入れています。

このrequests()は以前の記事でも何度も使いましたね。Pythonのプログラミングではめちゃくちゃよく使う関数なので、何となく慣れておきましょう。最後の2行は、bitFlyerのサーバーから返ってきた情報を、プロンプト(黒い画面)に表示するためのコードです。

実行してみよう!

上記のコードをエディタに打ち込んでください。
丸々コピペしてもいいですが、意味を考えながら自分の手で書き写した方が、プログラミングの上達は早くなります。

できたら、いつものように「test.py」というファイル名で保存して、Anacondaプロンプトで実行してみましょう。以下のように表示されれば成功です!

200
{'child_order_acceptance_id': 'JRF20180314-181041-090404'}

実際にbitFlyerのトレード画面にログインして注文状況を見てみましょう。ちゃんと注文が入っているのが確認できました。

今回はテストなので間違って刺さらないように、現在価格が90万円のところ、80万円で買い指値を入れました。普通に「×」ボタンを押せば、注文をキャンセルできます。

もし動かなかった場合

長いpythonのソースコードを自分で手打ちして動かした場合、1発では動かない方が普通なので安心してください。プログラミングはエラーを試行錯誤しながら修正する過程でしか上達しません。1発でエラーのないコードを書ける人はいません。

大抵は何かしらの打ち間違いなので、エラーをよく読んでください。

何行目のエラーかを確認する

「line 33」とあるので、33行目が何かしら間違ってるとわかります。
「name ‘signatuer’ is not defined」と書いてあります。名前がおかしいようですね。ここでは、「signature」のスペルミスでした。

ステータスコードを確認する

先頭に「404」と書かれています。
これはpythonのプログラム自体は正しく書けていて、通信データ自体は送れたものの、bitFlyerのサーバーから「404」エラーが返ってきていることを意味しています。

「404」はサーバー側で、リクエストURLが見つからなかった場合のステータスコードです。ここでは、指定したAPIのURLを書き間違ってました。ステータスコードを表示することで、エラーの原因を絞りこむことができます。

HTTPステータスコード一覧

最後に

前述のように実際に自動売買BOTを作る際には、外部の方が作ってくれている便利な「ライブラリ」を使います。例えば、次の記事からはCCXTというライブラリを使います。それを使えば、今回のような買い注文を出すコードは1行で書けます。

ただし知っておいて欲しいのは、ライブラリはbitFlyerの公式が提供しているAPIではないということです。そのため、利用は自己責任になります。皆が使っているようなライブラリで、かつgithubなどで全コードが公開されているものは、ある程度は安全だと思いますが、一応、危険性は理解しておいてください。

また便利なライブラリとはいっても、基本的には、内側で各取引所のAPIを叩いているだけです。なので、ライブラリを使っていて何か行き詰った場合は、「裏側でどのAPIを使ってるのか?」を考えたり調べたりしてみると、解決のヒントになります。

(練習問題)

自分で上記のコードをカスタマイズして、売り(ショート)注文を出してみてください!^^ ※ 指値価格を変え忘れるとすぐに約定してしまうので注意してね!

「bifFlyerのAPI経由でPythonで「買い注文」を出してみよう」への8件のフィードバック

  1. 始めまして。今日1日ブログを見て、勉強させて貰いました。
    恥ずかしながら何度もエラーを連発してて、
    何回も諦めそうになりましたが、注文が表示されたときの嬉しさは今まで味わった事のないものでした。
    ほんとにありがとうございます。
    頑張ります。

    1. コメントありがとうございます!m(__)m
      そう言っていただけて凄く嬉しいです。はじめてプログラムを書いて注文が通ったときはめちゃくちゃ嬉しいですよね。コメントいただいて、私も最初の頃のワクワク感を思い出しました!^^

  2. ただいま夏季休暇中で、プログラミング&システムトレードに興味を持ち一日でここまで来ました。
    ド素人の私でもpythonで買い注文までできました。他の方同様感動したので、つい書き込みました。
    とてもわかりやすくまとまっていて、タダで教えてもらうのが悪くなるくらいです..ありがとうございました。

  3. FX_BTC_JPYだと注文できなかったのですが、現在BitFlyerはBTCFXの新規登録を受け付けていないようです。テスト注文の際は現物で価格の低い仮想通貨を注文するのが良さそうです。

  4. 随分時間が空きましたがお礼です。
    ステータスコード200が帰ってきたときはすごい嬉しかったです!
    わかりやすいページをありがとうございます!
    共有ですが、base_urlは現在”.jp”から”.com”になっているようです。
    また、FXは2020年5月以降はできないようです。
    引き続きがんばります!

  5. {‘status’: -121, ‘error_message’: ‘Please accept the terms of use.’, ‘data’: None}
    というエラーがでたのですが、こちらのコメントにFXBTCは現在受け付けていないとのことで、通常のBTCにしたところ、注文通りました。感激です。
    ありがとうございます。

  6. 初めてコメントさせていただきます。
    外のサイトを見ても数多くのライブラリを使用して簡略化している物が多い中で、こんなに基礎的な部分から理解できるように解説してくれているサイトはほかにありません。本当に感謝しています。BFのアカウントもリンクより作らせていただきました。

    最終的な目標としては、おっしゃっていたようにAPI仕様書を見ただけでコードが書けるようになることが大切だと考えています。今現在は私の実力不足もあり、仕様書を見ただけでは上記のようなプログラミングに即転嫁されないのが現実です。「APIリクエストを送る」がなぜこのようなコードの並びになるのかなどがまだまだ理解できていません…。
    差し支えなければ、筆者様が勉強や参考にした教材や書物、こうしたものがおすすめというものがあればぜひ教えていただきたいです。なお英語が読めるので英語の書物やサイトでもかまいません。

    重ねてではありますが、本当に素晴らしいサイトをありがとうございます。これからも勉強させていただきます。

コメントを残す

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