GMOコインAPIでプログラムを使った取引環境を作ってみた! PART1


初めに

GMOコイン株式会社より5月29日に参照系と更新系のAPIのリリースされたました。
できることできないこと、今後の発展などをまとめてみました。

GMOコインのAPIでできること

Public APIは認証不要で、各通貨の価格や取引量などの情報を取得ができる。
Private APIは認証必要で自身の口座にアクセスをして情報の取得ができる。

取得できる情報は以下の通りとなる。

  • Public API

    • 取引所の稼働状況
    • 最新レート
    • 板情報
    • 取引履歴
  • Private API

    • 余力情報
    • 資産残高
    • 注文情報取得
    • 有効注文一覧
    • 約定情報取得
    • 最新の約定一覧
    • 建玉一覧を取得
    • 建玉サマリーを取得
    • 注文
    • 注文変更
    • 注文キャンセル
    • 決済注文
    • 一括決済注文
    • ロスカットレート変更

リファレンス

リファレンスではjavascriptとpythonのサンプルコードがあります。

  • Node.js v10.15.3 で動作確認済みのサンプルがある
  • Python 3.7.2で動作確認済みのサンプルがある

開発環境

  • インフラ環境

    • AWS
    • CentOS7.6
  • Python 3.7.2

Public APIのサンプルコードを試してみた

認証不要なPublic APIを利用して、現在の市場の相場RATEを見てみます。

・サンプルコード(最新レート取得)

import requests
import json

endPoint = 'https://api.coin.z.com/public'
path     = '/v1/ticker?symbol=BTC'

response = requests.get(endPoint + path)
print(json.dumps(response.json(), indent=2))
});

symbolパラメータを指定しない場合、全銘柄分の最新レートを取得します。

  • symbolパラメータ
    BTC ETH BCH LTC XRP BTC_JPY ETH_JPY BCH_JPY LTC_JPY XRP_JPY
    ※現物取引とレバレッジ取引に対応

  • 実行結果
    symbolはXRP_JPY

{
  "status": 0,
  "data": [
    {
      "ask": "41.72",
      "bid": "41.65",
      "high": "41.859",
      "last": "41.665",
      "low": "40.91",
      "symbol": "XRP_JPY",
      "timestamp": "2019-07-06T03:29:49.525Z",
      "volume": "3194000"
    }
  ],
  "responsetime": "2019-07-06T03:29:50Z"
}

Private APIのサンプルコードを試してみた

Private APIを利用して、仮想通貨の注文をしてみました。

  • APIキー作成

API > APIキーを新規追加

ラベル名は任意な名前を入力、取得する情報にチェックをいれる。
今回はすべての情報を取得として、IP制限はAWSの開発環境からのみアクセスとする。

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    = 'POST'
endPoint  = 'https://api.coin.z.com/private'
path      = '/v1/order'
reqBody = {
    "symbol": "BTC_JPY",
    "side": "BUY",
    "executionType": "LIMIT",
    "price": "430001",
    "size": "0.02"
}

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))
  • 指定できる値

    • symbol:銘柄
    • side:買い(BUY) or 売り(SELL)
    • executionType:成行(MARKET) or 指値(LIMIT)
    • price(LIMIT指定時のみ必要):指定した値段になったら銘柄を購入
    • size : 購入する銘柄の量 
  • 実際に購入
    テストのため、購入可能な最小値でXRPを取得します。
    status0で正常に完了しました。

[root@gmo-api gmo-api]# python neworder.py 
{
  "status": 0,
  "data": "119038592",
  "responsetime": "2019-07-06T04:12:08Z"
}
  • WEB取引画面で購入確認

実際にWEB取引画面でも、約定のポップアップがでて注文が確定したことが確認できます。

自動取引について

現在のAPIリリース(V1)では決済基準となる情報が、銘柄価格のみとなるため、GMOコインで提供のAPIのみで完全自動取引に使うのは難しそうです。
理由としてはテクニカル(MACD、RSI)を利用したエントリ判断ができないため。

テクニカルの情報取得は今後APIのバージョンがあがることで、機能として追加される可能性はあるため、今後に期待しています。

半自動取引として、GMOコインの現物取引とレバレッジ取引でできない、「IFD注文」、「OCO注文」機能をAPIを利用して実装することは可能と思われます。

  • IFD注文

現在価格が1XRP40円の場合に、 1XRP45円になったらBUY、1XRP50円になったら指値決済

  • OCO注文

現在価格が1XRP40円の場合に、 1XRP45円になったらBUY、1XRP50円になったら指値決済、1XRP35円になったら逆指値決済

実装には、APIから取得したJSONデータをデータベースに格納して、その値をpythonプログラムが定期的に参照、約定時と価格変化したときの値を確認して決済(指値決済・逆指値決済)する処理を実装することで機能の実現が可能と考えています。
今後もGMOコインAPI機能を利用した、自動取引の実装は追って注視していこうと思います。

現在の相場レートをLINEに通知してみる

最後に現在の仮想通貨のレートをLINEに通知してみる、プログラムを作成してみました。
LINEへの通知はLINE Notifyを利用しました。

  • LINE Notify

  • 実装コード

ひとまず5分間隔でcronまわしてみました。

import requests
import json 
import subprocess
import re

#GMO接続
endPoint = 'https://api.coin.z.com/public'
path     = '/v1/ticker?symbol=XRP_JPY'
response = requests.get(endPoint + path)

#データ成型
tmpfile = open("tmpfile", "w")
print(json.dumps(response.json(), indent=2), file=tmpfile)
tmpfile.close()
f = open('tmpfile', 'r') 
response2 = f.read()
tmpfile.close()
response3 = re.findall('XRP_JPY|ask.*|bid.*', response2)

#LINE転送
def line():
    url = "https://notify-api.line.me/api/notify"
    token = "Fpf2nw2KWyJVwOeVJL3qngXCTNu8jDtkdRDl3InW6r3"
    headers = {"Authorization": "Bearer " + token}
    message = response3
    payload = {"message":  message}
    requests.post(url, headers=headers, params=payload)

if __name__ == '__main__':
    line()
  • 結果