FX・シストレ Python プログラミング

Pythonで自動売買Botを作る③~プライベートAPIを使ってビットコインを売買する

この記事は約9分で読めます。

 

前回のあらすじ

 

こんにちは、ミナピピン(@python_mllover)です!

 

前回はGMOコインのパブリックAPIを使って取引所の価格(ticker)と板情報を取得しました。今回はプライベートAPIを使ってプログラムから取引所にビットコインの売買注文を出していきたいと思います。

 

 

 

APIの種類について

 

前回と同じですが、再確認のためにもう1回まずAPIとは、何ぞやというところから説明するとAPI(アプリケーションプログラミングインターフェース)とは自分のソフトウェアを一部公開して、他のソフトウェアと機能を共有できるようにしたものです。

 

APIとしてソフトウェアの一部をWEB上に公開することによって、誰でも外部からその機能を利用することができるようになります。それによって他のソフトウェアの機能を自分のプログラムの中に簡単に埋め込むことができるようになるので、アプリケーション同士で連携することが可能になります。

 

今回の場合であれば、取引所の内部の一部システムをAPIという形で公開してくれていることで、私たちユーザー側からすると口座残高や価格情報を調べたり、注文を送信するといったような処理が簡単に行うことができるようになります。

 

他にもLineやtwitterのAPIを利用することで自動で呟くbotを作ることができたり、今回のように取引所に注文を出したりなどなどAPIを利用すれば高度なプログラミングが簡単に行うことが可能になります。

 

そして、APIは「パブリックAPI」と「プライベートAPI」の2種類が存在します。パブリックAPIはサイトの価格情報など誰でも特別な権限なしに公に見ることのできるデータを取得するAPIなのに対して、プライベートAPIとは自分の口座残高や鍵垢の呟きなど見られる人が制限されている情報を取得する際に用いるAPIです。

 

 

関連記事:【Web技術】APIについての分かりやすい解説

 

 

パブリックAPIはURLを打ち込むだけで簡単に取得できますが。プライベートAPIは秘密鍵など認証のためにリクエストヘッダーを変えたりなど、http通信についての知識が少し求められるので、若干難易度が高いですが、ライブラリを使えばそのあたりを勝手に行ってくれるので心配する必要はありません。

 

プライベートAPIを使って仮想通貨を自動で売買する

 

というわけで、プライベートAPIを使ってPythonから取引所に売買する処理を行ってみます。ビットコインの板情報や価格を取得するAPIは誰でも使えるパブリックAPIですが、取引注文を出すためには上述したプライベートAPIが必要になってきます。

 

パブリックAPIはURLを指定された書式で入力するだけですが、プライベートAPIの場合は個人を識別するためのプライベート鍵を取得する必要があります。

 

そして、プライベートAPIを使うとアカウント内の自分の口座の資産を売買したり他の取引所やウォレットに送金できてしまうので、逆に言えばこれが漏れてしまうと自分の資産を勝手に注文されたり、他の取引所やウォレットに送金される危険性があります。

 

プライベート鍵は言うなれば家の裏口の鍵みたいなものですので、プライベートAPIのカギは絶対に第3者に漏らさないように厳重に管理してください。

 

そして、「」のプライベートAPI鍵の取得はサイトの左側のタブの「API」⇒「APIキーを新規追加」で発行することができます。

 

 

PythonでプライベートAPIを設定する

 

まずは自分のAPI鍵をPython内のオブジェクトに格納します。もしAPI鍵が〇〇〇だとすると、API_KEY= ’〇〇〇’みたいな感じで入力してください。

 

# API鍵を設定する
apiKey = 'apiキー'
secretKey = 'api秘密鍵'

 

プライベートAPIの設定が終わったらさっそく動かしていきましょう。まずはアカウント内の資産を確認します。

 

# アカウント内の資産を確認する
import requests
import json
import hmac
import hashlib
import time
from datetime import datetime

apiKey = 'YOUR_API_KEY' 
secretKey = 'YOUR_SECRET_KEY'

timestamp = '{0}000'.format(int(time.mktime(datetime.now().timetuple())))
method = 'GET'
endPoint = 'https://api.coin.z.com/private'
path = '/v1/account/margin'

text = timestamp + method + path
sign = hmac.new(bytes(secretKey.encode('ascii')), bytes(text.encode('ascii')), hashlib.sha256).hexdigest()

headers = {
"API-KEY": apiKey,
"API-TIMESTAMP": timestamp,
"API-SIGN": sign
}

res = requests.get(endPoint + path, headers=headers)
print (json.dumps(res.json(), indent=2))

 

これで口座の余力が取得できます。次はそのぞれの資産額(BTCやJPY)を出してみましょう。

 

import requests
import json
import hmac
import hashlib
import time
from datetime import datetime

apiKey    = 'YOUR_API_KEY'
secretKey = 'YOUR_SECRET_KEY'

timestamp = '{0}000'.format(int(time.mktime(datetime.now().timetuple())))
method    = 'GET'
endPoint  = 'https://api.coin.z.com/private'
path      = '/v1/account/assets'

text = timestamp + method + path
sign = hmac.new(bytes(secretKey.encode('ascii')), bytes(text.encode('ascii')), hashlib.sha256).hexdigest()

headers = {
    "API-KEY": apiKey,
    "API-TIMESTAMP": timestamp,
    "API-SIGN": sign
}

res = requests.get(endPoint + path, headers=headers)
print (json.dumps(res.json(), indent=2))

 

次は注文を出してみましょう。GMOコインでは現物取引と信用取引の二種類が用意されています。トレードになれた方はいきなり信用取引から始めても問題ないと思いますが、初心者の方は現物取引から始めた方が良いかと思います。

 

また注文方法も指値注文と成行注文の大きく2種類分かれます。まずは現物で成行注文してみましょう。成行注文というのは即買みたいなイメージで指値は値段を設定しておいてその値段になると取引が実行される、みたいな感じです。

 

# ビットコインを現物成行で0.001btc購入する

import requests
import json
import hmac
import hashlib
import time
from datetime import datetime

apiKey    = ''
secretKey = ''

timestamp = '{0}000'.format(int(time.mktime(datetime.now().timetuple())))
method    = 'POST'
endPoint  = 'https://api.coin.z.com/private'
path      = '/v1/order'
reqBody = {
    "symbol": "BTC",
    "side": "BUY",
    "executionType": "MARKET",
    "size":0.001
}

text = timestamp + method + path + json.dumps(reqBody)
sign = hmac.new(bytes(secretKey.encode('ascii')), bytes(text.encode('ascii')), hashlib.sha256).hexdigest()

headers = {
    "API-KEY": apiKey,
    "API-TIMESTAMP": timestamp,
    "API-SIGN": sign
}

res = requests.post(endPoint + path, headers=headers, data=json.dumps(reqBody))
print (json.dumps(res.json(), indent=2))

 

というわけで次はいよいよ今までやってきたAPIでのプログラム処理を合体させて、実際に取引所で動くBotを作ってみます。

 

 

→(続き)PythonでシストレBotを作る④~簡易的な自動取引botで実際に取引してみる

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

コメント

タイトルとURLをコピーしました