LoginSignup
26
29

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-07-06

初めに

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キーを新規追加

api1.png

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

api2.png

APIキーとAPIシークレットが作成されます。

api3.png
  • サンプルコード(注文)
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取引画面でも、約定のポップアップがでて注文が確定したことが確認できます。

api4.png

自動取引について

現在の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()
  • 結果
api5.png
26
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
29