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

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

https://coin.z.com/jp/corp/product/info/api/

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

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


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

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

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

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

https://api.coin.z.com/docs/#change-losscut-price

##開発環境

- インフラ環境
 - 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160993/a91b3e01-cb7c-eb13-7d5c-3224c7cbf4c9.png)|
|:-:|

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

|![api2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160993/991f02b4-9fae-0ef0-e23e-f65a7b505b7c.png)|
|:-:|

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


|![api3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160993/468b82b8-7e8a-bc08-c897-7c231f3172e3.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160993/a42247ab-1723-6d15-e1dd-89974e36a377.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

https://notify-bot.line.me/ja/


- 実装コード

ひとまず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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160993/2d6b3637-0205-f943-ae1e-612fb12c6e07.png)|
|:-:|