Skip to content
@_P_E_N_T_A edited this page Apr 7, 2020 · 23 revisions

目次

インストール

方法1: パスの通った場所にシンボリックリンクを貼る(おすすめ)

少し行儀の悪い方法ですが、おそらく一番トラブルの少ない方法です。

  1. パスの通っている場所を調べる。
$ python3 -c 'import sys; print(sys.path)'
['', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload',
 '/home/sk/.local/lib/python3.8/site-packages', '/usr/lib/python3.8/site-packages']
  1. どこでも良いので(できれば管理者権限の必要ないディレクトリ)にbotfwのシンボリックリンクを作成。
$ cd /home/sk/.local/lib/python3.8/site-packages  # pip install --user で使われるディレクトリ
$ ln -s /path/to/btc_bot_framework/botfw botfw

方法2: PYTHONPATHにプロジェクトディレクトリを追加

使用しているシェルの設定ファイル(.bashrc, .zshrc等)にPYTHONPATHを追加します。
正しい作法ですが、IDEによってはlinterのエラーがでたり、自動補完が効かなかったりします

export PYTHONPATH="/path/to/btc_bot_framework:$PYTHONPATH"

方法3: そもそもインストールしない

プロジェクト内に直接コードを書いて、プロジェクトルートからモジュールとして実行する場合は
特にインストール作業は必要ありません。
例えば、samples/bitflyer/orderbook.pyなら以下のように実行できます。(__init__.pyが必要かも)

$ python3 -m samples.bitflyer.orderbook

マニュアル

プロジェクトファイル構成

  • bin – 実行ファイル
  • botfw – フレームワーク本体: 取引所共通部分のディレクトリ(base)、取引所毎のディレクトリ(bitflyer, bitmex, ...)、etc
  • samples – 実行可能なサンプルプログラム
  • test – TODO

クラス一覧

取引所

  • Api
  • Websocket
  • OrderManager
  • OrderGroupManager
  • OrderGroup
  • Trade
  • OrderBook

API

APIクラスはccxtライブラリのラッパークラスで、APIレート制限の方法が異なることを除けばccxtと全く同様の方法で使用することができます。

ccxtではAPIレートを1秒ごとに呼び出せる回数を制限するという方法で制御しますが、本フレームワークでは制御自体は行わず、呼び出し可能と思われるAPI容量を常に内部変数の'capacity'に更新し続けます。 capacityはAPI呼び出しを1回行う毎に1ずつ減少します。0になった場合、APIの呼び出し回数の猶予がまったくないことを示していますが、フレーワーク側でAPIの呼び出しを制限するといったことは行いません。

したがって、取引所のAPI制限に抵触する可能性のあるロジックを実装する場合、capacityを参照して十分な余裕があることを確認してからAPI呼び出し(注文やキャンセルなど)を行うことが奨励されます。 API呼び出し回数に余裕がなくなってきた際は、優先度の低いAPI呼び出しを間引くなどの対処をご自身で行ってください。

capacityの最大容量や1秒あたりの補充回数は取引所によって異なります。 たとえば、bitflyerでは最大60回で1秒あたりに1回補充されます。

APIクラスはccxtにない追加メソッドをいくつか提供しています。 これらは主に取引所や商品に固有のメソッドで、例えば、現在のポジションを取得するfetch_position()などが含まれます。

Websocket

Websocketクラスは取引所とwebsocketによる接続を行うクラスで、1つのインスタンスあたり1つのコネクションを作成します。

主にwebsocketによるチャンネルの購読を必要とするクラスに引数として渡すためのクラスですが板情報や約定情報のようにユーザー認証を必要としないクラスは、引数にWebsocketが指定されなかった場合、内部で自動的にWebsocketインスタンスを生成します。

OrderManagerのように認証済みのコネクションを必要とするクラスの場合は認証付きのWebsocketのクラスインスタンスを生成して渡す必要があります。 認証付きWebsocketは引数にApi keyとApi secretを指定することで作成できます。

Trade(約定情報)

Tradeクラスはリアルタイムな約定情報を提供するクラスです。 約定情報情報は取引所にかかわらず、価格はQuate通貨、枚数はBase通貨で表現されます。 例えば、BTC/JPYの場合、JPYがQuate通貨でBTCがBase通貨です。

メソッド一覧

  • __init__(symbol, ws=None)
    symbolに取得する約定のシンボルを指定します。 wsはWebsocketのインスタンスですが省略した場合は、内部で自動的に生成されます。
  • add_callback(cb)
    約定データを受信した際に呼び出されるコールバック関数(引数: ts, price, size)を指定します。 コールバック関数は複数追加可能ですが、websocketのスレッドから登録した順に呼び出されるため、ブロッキングする処理は避けてください。
  • remove_callback(cb)
    add_callbackで追加したコールバック関数を削除します。 メソッド変数はインスタンス経由で参照する度にidが変わるため、コールバック関数として追加したメソッドを後から削除する場合は、予めadd_callbackする際に変数に控えておいてください。
cb = obj.method
trade.add_callback(cb)

# trade.remove_callback(obj.method) # これは正常に動作しない
trade.remove_callback(cb) # 正常にコールバック関数を削除

Orderbook(板情報)

Orderbookクラスはリアルタイムな板情報を提供するクラスです。 板情報は取引所にかかわらず、価格はQuate通貨、枚数はBase通貨で表現されます。 例えば、BTC/JPYの場合、JPYがQuate通貨でBTCがBase通貨です。

メソッド一覧

  • __init__(symbol, ws=None)
    symbolに取得する板のシンボルを指定します。 wsはWebsocketのインスタンスですが省略した場合は、内部で自動的に生成されます。
  • bids()
    買い板のリスト(正確にはビューオブジェクト)を返します。 価格が高い順(best bidが先頭)に[price, size]の形式で格納されています。
  • asks()
    買い板のリスト(正確にはビューオブジェクト)を返します。 価格が低い順(best askが先頭)に[price, size]の形式で格納されています。 売り板のリスト
  • add_callback(cb)
    板が更新された際に呼び出されるコールバック関数(引数なし)を追加します。 コールバック関数は複数追加可能ですが、websocketのスレッドから登録した順に呼び出されるため、ブロッキングする処理は避けてください。
  • remove_callback(cb)
    add_callbackで追加したコールバック関数を削除します。 メソッド変数はインスタンス経由で参照する度にidが変わるため、コールバック関数として追加したメソッドを後から削除する場合は、予めadd_callbackする際に変数に控えておいてください。

注文

定数値

フレームワーク内で定義されている定数値です。

Order Type

注文形式。create_order()のtypeに指定する値です。

  • LIMIT (='limit')
    指値注文。priceで価格を指定してください。
  • MARKET (='market')
    成行注文。priceは不要です。

Order Side

注文の売り又は買い。create_order()のsideに指定する値です。

  • BUY (='buy')
    買い注文
  • SELL (='sell')
    売り注文

Order State

  • OPEN (='open')
  • CLOSED (='closed')
  • CANCELED (='canceled')
  • WAIT_OPEN (='wait_open')
  • WAIT_CANCEL (='wait_cancel')

Order Event

  • EVENT_EXECUTION (='execution')
  • EVENT_OPEN (='open')
  • EVENT_OPEN_FAILED (='open_failed')
  • EVENT_CANCEL_FAILED (='cancel_failed')
  • EVENT_CLOSE (='close')
  • EVENT_ERROR (='error')

取引所固有の仕様

TODO

bitflyer

binance

bitmex

コーディングスタイル

  • 多少コードが冗長になる場合でも、基本的には設計上の正しさを優先します。

  • フレームワーク部分(botfw)については以下の規則を適用します。

    • pep8に準拠。ただし__init__.pyは例外
    • コメントを含めて英語(askiiコードのみ)で記述。それ以外のsampleやgitログ等は自由。
  • メソッド名や引数の変数名とその順序、また定数変数(全部大文字の変数)の内部値は可能な限りccxtと揃えます。

    • 'FX_BTC_JPY'(bitflyer) -> 'FX_BTC_JPY'(ccxt)
    • 'BTC_JPY(bitflyer) -> 'BTC/JPY'(ccxt)
    • 'BUY'(bitflyer), 'Buy'(bitmex), 'BUY'(binance) -> 'buy'(ccxt)
    • 'LIMIT'(bitflyer), 'Limit'(bitmex), 'LIMIT'(binance) -> 'limit'(ccxt)
  • メソッド名の英単語は省略しませんが、変数名、及び引数名は意味の分かる範囲内で自由に省略します。

  • 日本語部分(サンプルコード、README)を含め、全角スペース全面禁止

重要な変更点

commit 161 (9537ca0a8404e68d4021eac02c86d675492e0545) ----------

  • 注文・キャンセルを非同期(デフォルト)に変更。同期はsync=Trueを引数に渡す。
  • simulation mode 実装
  • liquid 追加
  • OrderGroupの注文一覧(orders)を削除。代わりにget_orders()を追加。
  • 変数名commissionをfeeに変更。手数料周りの実装を共通化。

commit 217 (6667332febf181d03ad7f77f15600de9f82a6bb8) ----------

  • bitflyer web注文API 削除

commit 251 (b453d933ee80907ff7bfec3b18894f63088d69ae) ----------