*

BinanceとPoloniexのアービトラージシステムを作るやり方

Originally posted 2018-04-03 14:13:16.

この記事ではポロニエックスとバイナンスでAPIを使ったアービトラージシステムを作る具体的な方法を解説しています。

 

開発の背景

ずっと国内の大手3社でアービトラージしているのですが、サーバーの脆さや約定力のなさが目立つことが良くあります。

組み合わせを変えたり、4社目(QuoinExとか)を入れるという選択肢もあるのですが、プログラマーの経験上、この方向性は泥沼になるような気がしていました。

他にも日本の取引所vs海外の取引所でアービトラージする方法もあるにはありますが、ドル円の換算レートをどうするかという問題があり、

ドル円レートがちょっとでも変わるとそれぞれのレートが大きく変わってしまいます。

本当にレート差が発生しているのか、参照しているドル円レートの差によるものなのか分からないので、変数が増えて苦労して終わりそうな予感がします。

ということで、第三の選択肢として、今回は海外の取引所同士でアービトラージをしてみようと思います。

 

なぜバイナンスとポロニエックスか

海外同士であれば、ドルベースでレートを比較できるため、為替レートを考慮する必要がありません。

また、海外の取引所サーバーは日本の取引所よりも頑丈で、かつ、取引量も多いので、上記のような問題は多かれ少なかれ解決するのではないか、という魂胆です。

Poloniexに関しては、以前までは破たんの噂やチケットが処理されないなどの問題がありましたが、買収されて管理者が変わることで改善されていくのではないかと思います。

Binanceは歴史が浅すぎるのでかなり心配していたのですが、以前のハッキングの対応や、拠点をマルタに移すこともあり、FX業界の人からするとそこそこ長くやるつもりなのかな、という印象を持ちました。

他にも海外の取引所の中で取引量が大きくてメジャーなところはありますが、日本人がフツーに口座開設できて大きなところはこの2つだと思います。

Poloniexに関してはこれまでにレート取得や残高照会をAPIでやっているので、そちらを見ていただければ特に問題なく実装できると思います。

 

Poloniex APIドキュメント

https://poloniex.com/support/api/

Binanceに関してはドキュメントがちょっと読みにくい印象があったのですが、こちらも特に問題なくこれまでのメソッドをちょっと書き換えるだけで流用できると思います。

Binance APIドキュメント

https://github.com/binance-exchange/binance-official-api-docs/blob/master/rest-api.md

Binanceはレバレッジ取引(証拠金取引)ができないので、アービトラージは必然的に現物のみとなります。(せっかくPoloniexでレバレッジ取引のメソッドを作ったのに・・・)

この点からも実装に関しては国内3社のときよりもかなり楽になるかと思います。

 

レートを比較してみる

下記は実際にレートを比較してみた際のレートです。

時刻 2018/4/3 14:6:43
Poloniex ask:7377.355 -bid:7364.275 = 13.08
Binance ask:7360 -bid:7355.02 = 4.98

時刻 2018/4/3 14:8:6
Poloniex ask:7368.188 -bid:7353 = 15.188
Binance ask:7355.05 -bid:7355 = 0.05

時刻 2018/4/3 14:8:39
Poloniex ask:7365.589 -bid:7353 = 12.589
Binance ask:7349.03 -bid:7349 = 0.03

Binanceは他と比較してかなりスプレッドが狭くなる傾向があるようです。
しかし、取引量が多いということはそれだけアービトラージをする人たちも多いということで、レート差は国内に比べると小さいみたいですね。

ちなみにBinanceのレートは

 

Poloniexは、

です。

どちらもGETで、jsonで返ってくるので、適当に配列に入れて取り出してください。

国内の取引所だとビットコインのアービトラージしかできませんが、この組み合わせならライトコインやイーサリアムをはじめとするアルトコインのアービトラージができるんじゃないかと思います。

 

バイナンスのプライベートAPIのクセ

BinanceのプライベートAPIにちょっと他の取引所とは違うクセがあったので、今回はそれを紹介します。

APIドキュメント
https://github.com/binance-exchange/binance-official-api-docs/blob/master/rest-api.md

一般的にプライベートメソッドを使うときは、特定のパラメータを連結させてHash化するのですが、Binanceの場合、Hash化した署名をさらに再帰的にパラメータの中に入れる必要があります。

 

今までにない方法なので、ちょっと違和感があります。(というか署名はヘッダーに入れればそれでよくない?)

オーダーするときはこんな感じです。

 

ただ、Binanceはエラーコードが親切丁寧なので、エラーさえ出れば何が悪いのかがすぐに分かるようになっています。

Binance APIエラーコード

https://github.com/binance-exchange/binance-official-api-docs/blob/master/errors.md

MQL並に細かいエラーコードがあるので、この点はさすがと言った感じです。

あとは現物しかできないので、証拠金取引特有の変なクセやバグも気にせず使えます。

 

ポロニエックスのAPIのおさらい

Binanceのオーダーができるようになったので、一応PoloniexのAPIによるオーダーもおさらいしておきます。
今回のシステムは現物のみなので、(Binanceが現物しかできないので)、
・ポジションの決済
・片方の取引所だけポジションをとった時の処理
などめんどくさいことは考えずに済みます。

また、2社固定なので、組み合わせによる場合分けもしなくてOKです。

ドキュメントには以下のように記載されています。
Trading API Methods
To use the trading API, you will need to create an API key.

Please note that there is a default limit of 6 calls per second. If you require more than this, please consider optimizing your application using the push API, the “moveOrder” command, or the “all” parameter where appropriate. If this is still insufficient, please contact support to discuss a limit raise.

All calls to the trading API are sent via HTTP POST to https://poloniex.com/tradingApi and must contain the following headers:

Key – Your API key.
Sign – The query’s POST data signed by your key’s “secret” according to the HMAC-SHA512 method.
Additionally, all queries must include a “nonce” POST parameter. The nonce parameter is an integer which must always be greater than the previous nonce used.

いろいろメソッドがありますが、使うのはbuyくらいです。

buy
Places a limit buy order in a given market. Required POST parameters are “currencyPair”, “rate”, and “amount”. If successful, the method will return the order number. Sample output:

{“orderNumber”:31226040,”resultingTrades”:[{“amount”:”338.8732″,”date”:”2014-10-18 23:03:21″,”rate”:”0.00000173″,”total”:”0.00058625″,”tradeID”:”16164″,”type”:”buy”}]}

You may optionally set “fillOrKill”, “immediateOrCancel”, “postOnly” to 1. A fill-or-kill order will either fill in its entirety or be completely aborted. An immediate-or-cancel order can be partially or completely filled, but any portion of the order that cannot be filled immediately will be canceled rather than left on the order book. A post-only order will only be placed if no portion of it fills immediately; this guarantees you will never pay the taker fee on any part of the order that fills.

sell
Places a sell order in a given market. Parameters and output are the same as for the buy method.

Poloniexでは成行注文のメソッドがないので、自動的に指値になります。指値でアービトラージするとオーダーが約定しなかったり、一部残ることがあるので、現在レートから不利なレートを指定することで実質的な成行注文にします。

もちろん指値でアービトラージできなくもないと思いますが、約定しなかったり、タイミングが大きくずれてきたりすることがあるので、ちょっと意味合いが変わってくると思います。

 

ポロニエックスのオーダー関数

以下は例によってオーダー関数です。一応0からドキュメントを読んで自前で作った方が良いと思いますが、
ドキュメントが良く分からなくてもこの関数にてきとうに変数に値を代入すれば動きます。

 

今回は現物の取引しかしないので、わざわざCURLを関数にまとめる必要はないと思いますが、使い回しなのでそのままにしています。

 

APIで残高を参照する

順番が前後しましたが次は残高照会をやります。アービトラージをする上で必ずなければならないものではないので、残高照会をせずに構築する場合はスルーして結構です。

まず、Binanceです。
GetでSHA256でパラメータにタイムスタンプが必要です。

Account information (USER_DATA)
GET /api/v3/account (HMAC SHA256)
Get current account information.

Weight: 5

Parameters:

Name Type Mandatory Description
recvWindow LONG NO
timestamp LONG YES
Response:

{
“makerCommission”: 15,
“takerCommission”: 15,
“buyerCommission”: 0,
“sellerCommission”: 0,
“canTrade”: true,
“canWithdraw”: true,
“canDeposit”: true,
“updateTime”: 123456789,
“balances”: [
{
“asset”: “BTC”,
“free”: “4723846.89208129”,
“locked”: “0.00000000”
},
{
“asset”: “LTC”,
“free”: “4763368.68006011”,
“locked”: “0.00000000”
}
]
}

例のように返ってくるjsonはbalancesの中に通貨ごとに入っているので、取り出す際はちょっと面倒です。BTCは常に先頭ですが、USDTの残高を紹介したい場合は、

 

こんな感じでfor文で回せばいいと思います。(もっと良い方法がありますが、こちらの方が汎用性が高いので)

Poloniexはスマホアプリを作った際にやったと思いますが、

 

こんな感じでとりだせます。

returnBalances
Returns all of your available balances. Sample output:

{“BTC”:”0.59098578″,”LTC”:”3.31117268″, … }

例のような戻り方をするので、binanceよりも取り出しが楽です。

 

開発の枠組み

今までAPIを使ったトレードシステムを作るときには、オーダーとレート取得ができれば後の枠組みは解説していなかったのですが、今回はどのような枠組みで構築するかを少し説明したいと思います。

MQLで自動売買プログラムを作ったことがある人には説明不要ですが、基本的には上から順番に
・トレードに使う変数の数値の確認
・レート取得(パブリックAPI)
・最後のトレード時刻と現在時刻を比較
・取得したレートを比較
・条件を満たした場合オーダー(プライベートAPI)
・通知メール送信
という感じです。

必要に応じてアカウント残高を参照して、あと何回トレードできるかを調べたり、トレードの前にサーバー状態を確認するオプションを付けても良いと思います。

あとはこれを繰り返し呼び出してあげます。自動売買専用プログラムであるMQLの場合、繰り返しの呼び出しはStart(),OnTick()などの関数で行われるのですが、自前のプログラムの場合は何らかの方法で繰り返し実行させる必要があります。ここらへんについてはすでに過去の記事で説明済みなので、そちらを参照してください。

通知メールについてはPHPの場合、少し検索すればいくらでもテンプレがでてくるので、そちらをコピペして微修正してみてください。

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

Message

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

コインチェックのAPIの使い方[PHP] 仮想通貨の自動売買開発

公開:2017/6/21 PHPプログラマと言っても、いろいろな分野の人がいるわけで、WEB系だか

記事を読む

仮想通貨APIでコピートレード配信システムを作るやり方

仮想通貨、暗号通貨の流行りって基本的にFXと同じ道をたどるので、 今後予想される流行の一つにコピー

記事を読む

サービス展開向けの仮想通貨自動売買システムを作るには

前置き ビットコイン、仮想通貨の自動売買を作る目的として、通常は個人的に利用するというものがほとん

記事を読む

一回の演算で複数のAPIリクエストを送るやり方 仮想通貨の自動売買開発

公開:2017/9/4 基本的にjson形式でAPIをたたく場合、nounceにUNIXタイムスタ

記事を読む

サーバー上で稼働するタイプの自動売買システムをローカルPCで稼働させる方法

これまで開発したビットコインの自動売買では、 ローカルPC -> PHPサーバー -> 取引所サー

記事を読む

 
  • fxfx.work

    (↑広告です。このサイトの管理者の運営ではありません)

     


  • 横瀬兼元(ペンネーム)です。

    プロフィール
    商材を買わせようとする偽者がいるらしいのでご注意ください。
    ツイッター始めました(イマサラー)
    https://twitter.com/FxantennaC
    (埋め込みするとページ表示が極端に遅くなるので、リンクでご容赦を) 4000文字未満のトピックや話題はツイッターで発信しています。
  • fxfx.work

    (↑広告です。このサイトの管理者の運営ではありません)

Translate »
ページトップへ