TechReport

技術者情報

ソリューション

2018年11月28日(水)公開

第221回

窓使いのCoin Trading System -Vol.5

PowerShellによる仮想通貨システムトレードの始め方(Liquid by QUOINE APIの使い方)

引き続き各取引所のAPIの利用方法を紹介します。
今回はLiquid by QUOINEです。

記事INDEX

前提・条件

・開発実行環境は、24時間システムを稼働することも考慮し、「お名前.comデスクトップクラウド」の仮想マシンを使って作成~稼働まで行っています。

PowerShellの基本的な文法、使い方については解説を省略しています。

・APIを公開している仮想通貨取引所の口座開設が完了しているものとします。口座開設方法については省略しています。

・システムトレードを行うことによって必ずしも利益が出るという保証はありません。

・.NET Framework で TLS1.1 および 1.2 を有効化する

PowerShellで使用される暗号化プロトコルは以下で確認することができます。
[Net.ServicePointManager]::SecurityProtocol
Ssl3, Tls


既定ではSSL3、TLS(1.0)が利用可能となっています。
しかし最近では暗号化プロトコルにTLS 1.2を必須とするサイトが増えてきており、仮想通貨取引所のAPIも同様となっています。既定の設定では.NET Frameworkを利用しているInvoke-WebRequestコマンドを実行するとエラーとなる場合があります。Invoke-WebRequestコマンドでTLS 1.2を利用するようにあらかじめ設定をしておきましょう。

1つ目の方法としてはInvoke-WebRequestコマンドを呼び出す前にTLS 1.2で通信することを明記します。こちらはスクリプト毎にその都度明記する必要があります。

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$res = Invoke-RestMethod $Url -Method POST -Headers $Header -Body $Body -ContentType "application/json"


もう1つの方法としては、以下のコマンドを実行して、レジストリでTLS 1.2で通信を既定値として設定しておきます。

Set-ItemProperty -Path HKLM:\\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 -Name SchUseStrongCrypto -Value 1"


いずれかの対策を事前に行うことで、Invoke-WebRequestコマンドでAPIを利用する場合のエラーを回避することが可能です。

参考:.NET Framework で TLS1.1 および 1.2 を有効化する方法


Liquid by QUOINE APIの使い方

Liquid by QUOINE(以降 QUOINE)では仮想通貨の現物とFX取引で同じ価格板を利用することができます。FX取引では最大25倍までレバレッジを掛けて資金の数倍の取引を行うことができます。APIを利用した場合、注文方法はWebの取引画面と同様にすべての機能が利用可能となっています。

QUOINEでも現物取引とFX取引でAPIが共通する部分と異なる部分があるので、現物取引を「QUOINE」、FX取引を「QUOINEFX」として紹介します。

まずはコードの一覧です。

https://github.com/InvokeV/PSdeCoinEX/blob/master/Sample_05.ps1

価格情報の取得:Get-Price


Public APIを使って板情報から売値(sell_price_levels)と買値(buy_price_levels)を取得します。
QUOINEの場合はhttps://api.quoine.com/products/5/price_levelsこのURLからGetメソッドで直接ビットコインの価格情報が取得可能です。ブラウザで直接URLを開いても価格情報を表示することができます。

37-42: 現物取引とFX取引ともに同じ価格板を参照しているので、両方とも同じロジックで価格情報を取得することができます。
44-50: PSCustomObjectに売値の最安値と買値の最高値の情報を格納してテーブル形式で表示しています。

Get-Price "QUOINE"

Name AskPrice AskSize BidPrice BidSize
---- -------- ------- -------- -------
QUOINE 913515 0.00500 913515 0.00500

API KeyとSecret Keyの取得:Get-Keys

Private APIを利用するための「APIアクセストークン」を取得します。QUOINEの右上の設定メニューから「トークン」を選択します。
https://app.liquid.com/settings/api-tokens

こちらからAPIトークンを作成します。

APIキーの取得
APIキーの取得


キーを直接コード内に記述するのは避けたいので、Keys.jsonファイルとして別途保存しておきます。これまでと同様にjson形式で追加しておきます。QUOINEとQUOINEFXは同じAPIキーを利用することができます。

[
{
"SiteName": "bitFlyer",
"APIKey": "取得したAPIキー",
"SecretKey": "取得したシークレットキー"
},
{
"SiteName": "bitFlyerFX",
"APIKey": "取得したAPIキー",
"SecretKey": "取得したシークレットキー"
},
{
"SiteName": "Zaif",
"APIKey": "取得したAPIキー",
"SecretKey": "取得したシークレットキー"
},
{
"SiteName": "ZaifFX",
"APIKey": "取得したAPIキー",
"SecretKey": "取得したシークレットキー"
} ,
{
"Site": "bitbank",
"APIKey": "取得したAPIキー",
"SecretKey": "取得したシークレットキー"
},
{
"Site": "QUOINE",
"APIKey": "取得したAPIキー",
"SecretKey": "取得したシークレットキー"
},
{
"Site": "QUOINEFX",
"APIKey": "取得したAPIキー",
"SecretKey": "取得したシークレットキー"
}
]

(Keys.json)

Header情報の作成:Get-Header

取得したキーを使ってAPIの認証を行うためには、Invoke-RestMethodコマンドにHeaderとして認証情報を作成して渡す必要があります。QUOINEの場合は必要な情報を文字列として連結して、SHA256ハッシュ関数を使ってシークレットキーで署名したものが認証に必要な情報となります。難しい話は読み飛ばしてもコードをそのまま再利用すれば使えるものを紹介します。


113: Nonce(number used once:ノンス)と呼ばれる重複しないための値を作成します。協定世界時(UTC)の1970年1月1日午前0時0分0秒から、Get-Dateコマンドで取得した時間までの経過時間(UnixTime)をミリ秒で表したもの。
114-130: Queryデータ、Nonce、APIキーを合わせたものをBodyデータとして作成します。HeaderデータとBodyデータを合わせたものを、SHA256ハッシュ関数を使ってシークレットキーで署名してHeader情報を作成します。

資産情報の取得:Get-Asset

QUOINEに保持している日本円とビットコインの残高を取得します。QUOINEでは、ビットコイン以外の仮想通貨の取引が可能なので、他の通貨情報も取得可能です。


資産情報はInvoke-RestMethodコマンドのGETメソッドで取得できます。このときHeader情報に認証データを含めることになります。

138: リクエストURLをクエリー値としてGet-Headerコマンドに渡しHeader情報を取得します。
140: Invoke-RestMethodコマンドの実行結果から、BTCもしくはJPYの値を抽出します。

Get-Asset "QUOINE" "jpy"

10,000

売買注文:Set-Order

現物取引とFX取引では、POSTするデータの一部分が異なります。今回は明確に現物取引とFX取引の注文を分けるために、それぞれ別の注文方法として紹介します。

現物取引 QUOINE


294: エンドポイントはhttps://api.quoine.com/orders/となります。
298: ビットコインの売買を行うためにproduct_idは5を指定します。
299: 売り注文の場合は”sell”、買い注文の場合は”buy”となります。
300: 成行注文の場合は”market”、指値注文の場合は”limit”となります。
302: 最小注文単位は0.01btcとなります。
304: Invoke-RestMethodコマンドで注文を行います。エラーとなった場合メッセージを表示して戻り値を0としています。
305: 注文が成功した場合はオーダーIDを戻り値として返します。

Set-Order "QUOINE" "buy" "limit" "600000" "0.001"

385104862




FX取引 QUOINEFX


308-316: ここまでは現物取引と同様の設定項目となります。
317: レバレッジを2~25までの値で指定します。固定値として2倍を指定しています。
318: 仮想通貨との取引に利用する通貨を指定します。既定ではUSDとなっているので、日本円で取引するためにJPYを指定します。
320: 同様にInvoke-RestMethodコマンドでデータをPOSTして注文を行います。

Set-Order "QUOINEEX" "buy" "limit" "600000" "0.001"

385104863

注文の確認:Get-Order


QUOINE、QUOINEFXともに共通です。
372: エンドポイントのhttps://api.quoine.com/orders/にビットコインの注文状況を取得するためのパラメーターを追加します。

Get-Order "QUOINE"

id : 385104862
order_type : limit
quantity : 0.001
disc_quantity : 0.0
iceberg_total_quantity : 0.0
side : buy
filled_quantity : 0.0
price : 600000.0
created_at : 1532830005
updated_at : 1532830005
status : live
leverage_level : 1
source_exchange : QUOINE
product_id : 5
product_code : CASH
funding_currency : JPY
crypto_account_id :
currency_pair_code : BTCJPY
average_price : 0.0
target : spot
order_fee : 0.0
source_action : manual
unwound_trade_id :
trade_id :
settings :
trailing_stop_type : False
trailing_stop_value : False
executions : {}
stop_triggered_time :

注文のキャンセル:Cancel-Order


QUOINE、QUOINEFXともに共通です。
注文時に取得したオーダーIDを指定します。statusのプロパティー値がcanceledとなっていれば成功です。

Cancel-Order "QUOINE" 385104862

id : 385104862
order_type : limit
quantity : 0.001
disc_quantity : 0.0
iceberg_total_quantity : 0.0
side : buy
filled_quantity : 0.0
price : 600000.0
created_at : 1532830005
updated_at : 1532830074
status : cancelled
leverage_level : 1
source_exchange : QUOINE
product_id : 5
product_code : CASH
funding_currency : JPY
crypto_account_id :
currency_pair_code : BTCJPY
average_price : 0.0
target : spot
order_fee : 0.0
source_action : manual
unwound_trade_id :
trade_id :

FX取引のポジションクローズ:Close-FX

QUOINEのFX取引では、オープンしているポジション(注文)をクローズするために、クローズ処理を行う必要があります。クローズするオーダーIDと数量を指定します。今回はオープンしているオーダーのすべての数量をクローズすることとしています。クローズする場合はすべて成行での価格となるため、意図した価格ですべてがクローズするとは限りませんので注意が必要です。


470: オーダーIDに紐づいた数量を取得します。
471: エンドポイントにオーダーIDを含めて指定します。
475: パラメーターとしてクローズする数量を指定します。
477: Invoke-RestMethodコマンドでPOSTしてポジションをクローズします。

コマンドサンプル

以降は作成した各コマンドのサンプルとなります。




以上がLiquid by QUOINEの基本的なAPIの利用方法となります。
Liquid by QUOINEは現物と同じ価格板を利用できるFX取引が可能で、APIのエラーも少なく安定しているので使いやすいと思います。

参考
Liquid by QUOINE (https://www.liquid.com/ja/)
APIリファレンス(https://developers.quoine.com/)

樋口 勝一

GMOインターネット株式会社

1999年6月GMOインターネットに入社。Windowsを用いたホスティング事業の立ち上げの際、サービス開発からその後の保守・運用まで1人で担当。2010年には「お名前.comWindowsデスクトップ」をリリースし、マイクロソフト社と強い信頼関係を構築。2007年から連続で「マイクロソフトMVPアワード」を受賞し、Windowsのスペシャリストとして活躍。

執筆者一覧

Hyper-Vで本格的なサーバー仮想環境を構築。仮想環境を設定・操作できる!

できるPRO Windows Server 2016 Hyper-V
GMOインターネット株式会社 樋口 勝一 著

◇Hyper-Vのさまざまな機能がわかる
◇インストールからの操作手順を解説
◇チェックポイントやレプリカも活用できる
Windows Server 2016 Hyper-Vは、仮想化ソフトウェア基盤を提供する機能であり、クラウドの実現に不可欠のものです。
本書では、仮想化の基礎知識から、Hyper-Vでの仮想マシンや仮想スイッチの設定・操作、プライベートクラウドの構築、Azureとの連携などを解説します。

詳細はこちら → Amazonインプレスブックス

初めてのWindows Azure Pack本が発売

Windows Azure Pack プライベートクラウド構築ガイド
GMOインターネット株式会社 樋口 勝一 著

本書は、Windows Azure PackとHyper-Vを利用し、企業内IaaS(仮想マシン提供サービス)を構成するための、IT管理者に向けた手引書です。試用したサーバーは、最小限度の物理サーバーと仮想マシンで構成しています。Windows Azure Packに必要なコンポーネントのダウンロード、実際にプライベートクラウド構築する過程を、手順を追って解説しています。これからプライベートクラウドの構築を検討するうえで、作業負担の軽減に役立つ一冊です。

詳細はこちら