流行りに乗って仮想通貨(Bitcoin etc)を自動取引できるwebサービス作った


流行りに乗り遅れた感が否めませんが、
仮想通貨を自動取引=システムトレードできるサービスを作ってみました。
「自分が使いたいものなら、他の人も使ってみてくれるのでは」という思いからつくりはじめました。皆さんのフィードバックを頂きたく、投稿します。

2018/2/5追記

  • 作成済みの自動取引ボットについて、ボット設定を変更できる機能をリリースしました。

Alphatrader

以下、「使い方」「追加したいこと」「技術的なこと」です。

使い方

  1. ユーザ登録をする

  2. APIキーを設定する

    • https://dashboard.alphatrader.io/setting から、 取引所のAPIキーを登録する
    • 現在対応している取引所は、「Poloniex」「Hitbtc」「Bitflyer」の3取引所です。
    • 誤ったAPIキーを登録しても、実行中のコードで取引ができないだけなので問題ありません。
  3. 自動取引ボットを作成する

    • https://dashboard.alphatrader.io/trader へ移動する。
    • 画面左のコード入力画面を参考に、 Python3で自動取引コードを入力する。(ドキュメントは現在作成中)
    • 説明欄に識別用の名前を入れ、自動取引実行間隔を選択して、 「自動取引ボット作成」を押下
    • 「作成」ボタンを押すと、自動取引ボットが作成され、画面上に作成したボットが表示されます。
  4. 自動取引ボットを停止・削除する

    • 作成したボットは、「停止」ボタンを押すことで停止できます。
    • 1分以内に停止します。
    • 停止したボットは、「削除」ボタンを押すことで削除できます。

コードの書き方

tick()

  • 自動取引ボットは、「実行間隔秒」ごとに、 tick() 関数を実行します。

  • tick()関数内では、自動取引の条件を記述したり、売買を実行できます。

  • 自動取引コード上では、必ずtick()関数を宣言する必要があります。

def tick():
      # Poloniex「ETC_USDT」の60秒間隔tickerを100個取得
      charts = data.charts('poloniex','ETC_USDT',60,100)
      # 最新の終値が、1分前の終値より低いとき、Poloniex「ETC_USDT」をUSDT保有量の100%で買う
      if charts.close.values[-1] < charts.close.values[-2]]:
          trade.buy('poloniex','ETC_USDT',1)

data

  • 取引所・通貨ペアごとのチャートデータを呼び出すためのモジュールです。

  • 最新のチャートデータを取り出す「data.ticker()」、現時点から指定個数分のチャートデータを取り出す「data.chart()」があります。
    - data.ticker(取引所, 通貨ペア, 間隔秒)
    - data.chart(取引所, 通貨ペア, 間隔秒, 取得件数)

def tick():
      # Poloniex「BCN_BTC」の60秒間隔tickerを取得
      ticker = data.ticker('poloniex','BCN_BTC',60)
      # Poloniex「ETC_USDT」の60秒間隔tickerを100個取得
      charts = data.charts('poloniex','ETC_USDT',60,100)

      # 100件のチャートデータを使用してボリンジャーバンド指標を生成
      upper, middle, lower  = talib.BBANDS(charts.close.values, matype=talib.MA_Type.T3)

talib

def tick():
      # Hitbtc「ARDR_BTC」の60秒間隔tickerを100個取得
      charts = data.charts('hitbtc','ARDR_BTC',60,100)

      # 100件のチャートデータを使用してボリンジャーバンド指標を生成
      upper, middle, lower  = talib.BBANDS(charts.close.values, matype=talib.MA_Type.T3)
      # 100件のチャートデータを使用して単純移動平均線を生成
      sma = talib.SMA(charts.close.values, timeperiod=25)      

trade

  • 取引を実行するためのモジュールです。

  • ベータ版では成行注文にのみ対応してます。

def tick():
      # Bitflyer「BTC_JPY」の60秒間隔tickerを100個取得
      charts = data.charts('bitflyer','BTC_JPY',60,100)

      # 100件のチャートデータを使用してボリンジャーバンド指標を生成
      upper, middle, lower  = talib.BBANDS(charts.close.values, matype=talib.MA_Type.T3)

      # 最新の終値が最新のボリンジャーバンド(lower)を下回ったとき、Bitflyer「BTC_JPY」をJPY保有量の100%で買う
      if charts.close.values[-1] < lower[-1]:
          trade.buy('bitflyer','BTC_JPY',1)
      # 最新の終値が最新のボリンジャーバンド(upper)を上回ったとき、Bitflyer「BTC_JPY」をBTC保有量の100%で売る
      elif upper[-1] < charts.close.values[-1]:
          trade.sell('bitflyer','BTC_JPY',1)

追加したいこと

  • バックテスト機能
  • 提供APIの拡充
  • 多数取引所への対応

技術的なこと

Angular2

  • フロントエンド

  • データは後述のREST APIサーバから取得

  • 流行りのMaterial Designを導入しておしゃれに仕上げる

  • レスポンシブでスマホ対応

Go

  • APIサーバ・取引所データ取得サーバetc

  • Webフレームワークにecho・ORMにgormを採用

Python

  • ユーザが入力したコードを確認・実行する基盤に使用

その他

  • gRPC - APIサーバがコアシステムと通信する際に使用
  • kubernetesを使うことも考えましたが、スケールする見込みは今の所ないため断念

最後に

思い立って作り始めたときは小規模なものでしたが、こうして公開する段階では数リポジトリをまたぐ大規模なプロジェクトになっていました。ある程度時間をかけたので、せっかくだから使って欲しいという思いがあります。
ベータ版というかたちで公開していますが、今後は機能を拡充して正式にリリースしたいです。
問題点・改善点やアドバイスなどあれば、コメントお願いします。