見出し画像

【仮想通貨】 WebSocket複数同時接続モジュール 【マルチプロセス、Python】

こんにちは。MAZMEXです。

約1年ぶりに、仮想通貨トレードBOT関連のnoteを書きました。
昨年は、BitMEX APIの基礎的な内容や便利なAPIの詳細などについて綴っていました。

このnoteでは、昨年に実装してからよくBOTに組み込んできたWebSocketのモジュール(部品)を公開してみようと思います。

内容としては、多数の取引所にWebSocketで同時接続する、マルチプロセス製のモジュールになります。

はじめに

2018年の春頃に、リアルタイム性の高い情報を重視したBOTを何種類か作ってみようと思ったのがきっかけになりますが、そこから少しずつ改善をしながらできたものです。

それまでは、足データから算出した各種の線を引いてみるタイプの、インジケータ頼みのBOTをよく作っていました。
しかし、BOTの有効性を確かめるまでの時間の長さや相場の変化に合わせる運用コストが気になったことから、トレード数が多めのBOTを作ることが多くなりました。

必然的に、WebSocketでの情報を頼りにすることが多くなりましたが、その用途としてたとえば以下のようなものがありました。

・直近 N秒といった短期のデータで自作の指標を構築する
・トレード対象の(対象外の)取引所の価格急変時に素早くエントリー(イグジット)する
・複数取引所の値動きを同時に見ることで、自身の(短期的な)ポジション期待値を評価する

こういったことを実装してみれば、BOTで結果を出すヒントになるだろうと考えていました。(筆者の解釈です)

そして、その頃はWebSocket接続をBOTに組み込むこと自体に多少の実装ストレスがあったため、
アイデアを具体化してみて実践の数をこなすに当たっては、以下のような項目を押さえた部品にしておきたいと考えました。

・軽快かつ安定して動くこと
・多数の取引所をサポートすること
・注文や指標計算のロジックと合わせたときも、BOT全体が高速に動くこと
・組み込みやすく、余計な記述をする煩わしさがないこと

これらの項目が本noteの関心事項となっており、具体的なロジックだったり注文部分に関しては触れていませんので予めご了承ください。


使用例

モジュールの使い方としては、接続したい取引所のWebSocketクラスだけを投げ込んで、ループで回すだけでリアルタイムな取得ができる記述のものになっています。

ws_processor = WebSocketProcessor().add_ws(
    BitfinexWS, 
    BitflyerFxWS, 
    BitmexWS, 
    BinanceWS, 
).run()

while True:
   trades = ws_processor.get()

なお、この例では、Bitfinex, bitFlyer, BitMEX, Binance に接続するプロセスが内部で4つ生成され、各WebSocket接続が並行で取得を続けます。
接続切れを起こした際は、各プロセス内で再接続が行われます。

本noteでは、そのコード一式と使い方や設計について記載しています。


付属のコード

以下に示す10個の接続先に対して、通貨ペアはBTC-(JPY/USD/USDT)購読チャネルは約定履歴 のWebSocket接続の実装を付属しています。

・Binance
・Bitfinex
・bitFlyer
・bitFlyer(FX)
・BitMEX
・Bitstamp
・Coincheck
・GDAX
・HitBTC
・OKEx

前述の WebSocketProcessor というクラスに、接続したい取引所を任意の組み合わせで指定し、同時接続を張れるようになっています。

WebSocketに関する共通処理は、1つのクラスに集約されて実装されているので、「さらに接続先を増やしたい」「購読のチャネルや通貨ペアを変えたい」といったこともしやすい実装になっているかと思います。
(各取引所に関するクラス実装はそれぞれ50行程度しかありません。)

また、導入のサンプルとして、スクリプトを2つ同梱しています。

1.対象の取引所すべての約定をリアルタイムでプリントするもの
2.対象の取引所すべてのN秒間の約定サイズを参照し続けるできるもの

2つ目のスクリプトは、いなごFlyerというWebツールの20秒間の累積ボリュームを表示している機能とほぼ同等のサンプルになります。
当然ですが、Python から直接接続するため、ブラウザを介さずに高速にデータ取得・制御できます。

なお、モジュール本体が14ファイルで、計550行程度、
サンプルスクリプトが2ファイルで、計250行程度の内容になっています。


要件

本モジュールはPythonによる実装で、言語バージョン3.6以上で動作を確認しています。

プログラミングが行えることを前提とした価格設定・公開であり、
その導入を助けるものとしてサンプルのスクリプトを同梱していますが、サポート体制はないということを予めご了承ください。

サンプルの起動については、Python 3.6以上の実行環境とpipが使えることが前提となりますが(Web上の無料記事で紹介されている内容です)、その環境があればpythonコマンドだけで十分です。


注意事項

有料部分をご覧になる際には、以下の項目をあらかじめご確認ください。

・本noteの内容は、トレードBOTに使える部品という位置付けで、BOT本体ではありません。

・本モジュールの出来の良し悪しによって生じた損益の変化については一切の責任を持てませんので予めご了承ください。

・筆者の環境では長期間の動作確認ができていますが、環境固有の不具合などにすべて対応できているとは憚りながら言い切れません。
 問題が報告されたら、解決に努めますが問題の程度によっては解決しきれない可能性があります。

・取引所の仕様変更など、外的要因で接続ができない状況になったときにコードをアップデートすることは保証できませんので予めご了承ください。

・付属するコードや知見は、本noteを購入された読者の個人利用に留めるものとし、商用利用は禁止とさせていただきます。
(利用規約にも定められる通り、著作権の譲渡・貸与などを認めるものではありません。)


有料部分の内容

本noteの有料部分に含まれている内容です。

・WebSocketProcessor のソースコード一式
・サンプルの起動方法
WebSocketProcessor の使用方法
・各クラスと設計についての説明
・サンプル1の説明

・サンプル2の説明
・マルチプロセス製BOTの構成例

BOT本体ではなく、モジュールについての内容となりますので、今一度ご確認の上お進みください。

この続きをみるには

この続き:6,070文字/画像1枚

【仮想通貨】 WebSocket複数同時接続モジュール 【マルチプロセス、Python】

MAZMEX

3,000円

この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

77
BitMEXのトレードBOT開発 note するよ。 BitMEX公式APIライブラリの改善版を実装・公開しています。 モバイル向けの運用チェックツール「MEXView」も公開、開発継続中です。

コメント9件

基本的には問題なく動作しているようなのですが、ws_exec.logを見てみると毎日どこかがon_errorで再接続しています。取引所ごとでいえば、一週間で1,2回という頻度ですが、websocketってそういうものなんでしょうか?
それとも、私の環境(AWSの設定とか)かwebsocket-clientのバージョンを変えたことが関係しているのでしょうか。よろしくお願いします。
そうですね。接続環境によりますが、Websocketの接続は切れることがあるものです。
取引所側の問題か、接続側の問題かも特定しにくいので、再接続がネックになりにくいように利用を考えるのがいいプラクティスかと存じます。
了解です。ありがとうございます。
それにしても、頻度が多いような気がして訊いてみました。週一回くらいは再接続するということを前提に設計するということにします。
Liquid対応だとなお売れると思う。
と言うのもLiquidの取引所を自分で追加しようとトライしてみたけど、エラーが出てしまってダメだった。
Liquidはちょっと特殊になので、このプログラムに追加するのは難しい模様。
その他の取引所は自力で追加できると思う。
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。