Giter Club home page Giter Club logo

btc_bot_framework's Introduction

暗号通貨高頻度取引bot用websocketベースフレームワーク

概要

Pythonによる暗号通貨の高頻度取引bot向けフレームワークです。
このフレームワークの役割は主に以下の3つです。

  • websocketを最大限利用することでAPI制限とデータ取得遅延の問題を緩和すること。
  • 取引所毎のwebsocketの仕様の差異を吸収すること。
  • Bot開発において頻繁に出現する処理を再利用可能な形でモジュール化すること。

簡単な動作確認しかできていないので、バグが多く残っているものと思われます。
コードを参考にする程度に留めるか、実行する際はご自身で十分に検証を行ってください。
プログラムの実行は自己責任です。不具合等によって損失が生じた場合でもこちらでは責任を負えません。

主な機能

  • websocket経由の約定データ、板情報、注文イベントの取得
  • 注文・キャンセル
  • 注文イベントの処理: 注文管理、ポジションサイズ計算、(未確定)損益計算
  • ポジションの仮想的な分割(複数ロジックの実行)
  • リアルタイムシミュレーション
  • UDP経由の操作(webインターフェース等との連携用)
  • クラス(ロジックファイル)の動的なロード・アンロード

取引所対応状況

取引所 API 約定情報 板情報 建玉管理・注文管理 バグ取り
bitbank ×
bitflyer
bitmex
binance
bybit
gmocoin ×
liquid △(JPYペアのみ)

動作環境

  • UNIX互換環境(Windowsは未検証)
  • python>=3.6.1

依存ライブラリ

  • ccxt>=1.40.51
  • websockets
  • sortedcontainers

インストールと使い方

wikiをご覧ください。

このプロジェクトの対象外

  • STOP、IFDOCO等の親注文
  • ローソク足やインジケータ等のチャート情報
  • 実用的な売買ロジック

今後の予定

  • gmocoin, bitbank 注文周りの実装

btc_bot_framework's People

Contributors

ahisayoshisuehiro avatar meetaco avatar penta2019 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

btc_bot_framework's Issues

【bitflyer】ポジションが変化しない

問題
simple_example_bot.pyを動作させたところ、ポジションを持っても表示が0のまま
'comission'が存在しないエラーが発生

修正
4箇所'comission'を'commission'に変更するとポジションを正しく取得するようになりました

def update(self, price, size, comission, sfd):
super().update(price, size)
self.position = round(self.position - comission, 8)
c = price * comission
self.commission += c
self.sfd += sfd
self.pnl += -c + sfd
class BitflyerOrderGroup(OrderGroupBase):
Order = BitflyerOrder
PositionGroup = BitflyerPositionGroup
def _handle_event(self, e):
if e.event_type != EVENT_EXECUTION:
return
size = e.size * (1 if e.side == BUY else -1)
self.position_group.update(e.price, size, e.comission, e.sfd)

わかりやすいフレームを作成して下さり、ありがとうございます

binance private websocketでkeepaliveする際にlistenKeyを渡していない

binance private websocketでkeepaliveする際にlistenKeyを渡していないのでkeepaliveに失敗しているようです。
いかがでしょうか?

2020-05-23 02:42:31.731693 l30 I MainThread real trade mode
2020-05-23 02:42:31.960300 l121 I BinanceWebsocket open websocket
2020-05-23 02:42:31.966790 l121 I BinanceWebsocket open websocket
2020-05-23 02:42:31.977858 util.py run_forever l50 E BinanceWebsocketPrivate BinanceWebsocketPrivate Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/ccxt/base/exchange.py", line 565, in fetch
response.raise_for_status()
File "/usr/local/lib/python3.7/site-packages/requests/models.py", line 940, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: https://api.binance.com/api/v3/userDataStream
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/botfw/etc/util.py", line 44, in run_forever
cb()
File "/usr/local/lib/python3.7/site-packages/botfw/binance/websocket.py", line 82, in __worker
self.__api.websocket_key('PUT') # keep alive
File "/usr/local/lib/python3.7/site-packages/botfw/binance/api.py", line 35, in websocket_key
return self.request('userDataStream', 'v3', method)
File "/usr/local/lib/python3.7/site-packages/botfw/base/api.py", line 39, in request
request['headers'], request['body'])
File "/usr/local/lib/python3.7/site-packages/ccxt/base/exchange.py", line 577, in fetch
self.handle_errors(http_status_code, http_status_text, url, method, headers, http_response, json_response, request_headers, request_body)
File "/usr/local/lib/python3.7/site-packages/ccxt/binance.py", line 1864, in handle_errors
raise ExchangeError(feedback)
ccxt.base.errors.ExchangeError: binance {"code":-1102,"msg":"Mandatory parameter 'listenKey' was not sent, was empty/null, or malformed."}

BitMEXのcommissionのPositionGroupでの管理について

BitMEXのcommission情報は約定した際にレート(0.025%のマイナス手数料なら-0.00025)で渡されるので、PositionGroupでcommissionとpnlを管理する際に絶対額に変換してやる必要があるように思います。

bitflyerの場合は絶対額で渡されるので現状で問題ないです。
binance futuresの場合は未確認です。

og.get_orders()を呼び出すと、RuntimeError: dictionary changed size during iteration

●現象
botのコードの中でog.get_orders()を定期的に呼び出しているのですが、稀に以下のようなエラーが発生します。

File "/usr/lib/python3.6/site-packages/botfw/base/order.py", line 489, in get_orders
for o in self.manager.order_manager.orders.values():
RuntimeError: dictionary changed size during iteration

●原因
おそらくループ中に別スレッドでself.manager.order_manager.ordersの注文情報が増減すると起こるのではないかと思っています。

●解決案
ループ用に一旦別オブジェクトを生成してやると実行時間は長くなりますが回避できます。
for o in list(self.manager.order_manager.orders.values()):

いかがでしょうか?

Realtime Private Channelの注文イベントのコールバック関数追加の機能について

ぺんたさんはじめまして、フレームワーク早速活用させていただいております。

約定データと板情報のアップデートタイミングでのコールバック関数はadd_callback()で自由に設定できるようになっていると思うのですが、
同様に、bitflyerでいうとRealtime Private Channelの注文イベントの受信時に呼ばれるコールバック関数を自由に追加・削除できるような機能についてどう思われますでしょうか?
単純に、約定タイミングでログ出力や、外部DBへのinsertを行えると便利かなと思いました。

bybitのprivate_get_position_listがccxt 1.40.50 で動かない

sample/simple_bot.pyをbybitでBTC/USDで動かしてみたところ、

File "/Users/usr/.local/lib/python3.8/site-packages/botfw/bybit/api.py", line 14, in init
self.private_get_position_list = getattr(
AttributeError: 'BybitApi' object has no attribute 'private_get_position_list'

のエラーが発生しました。調べてみたところ、
ccxt/ccxt#6827
のページがあり、ccxtの1.26.66?の以降のバージョンで変更があったみたいです。

botfw/bybit/api.py:14~15 の部分の

self.private_get_position_list = getattr(
            self, 'private_get_position_list')

self.privateLinearGetPositionList = getattr(
            self, 'privateLinearGetPositionList')

と修正したところ、simple_bot.pyがエラーなく動きました。

bybitのprivate_get_position_listがccxt 1.40.50で動かない

sample/simple_bot.pyをbybitでBTC/USDで動かしてみたところ、

File "/Users/usr/.local/lib/python3.8/site-packages/botfw/bybit/api.py", line 14, in init
self.private_get_position_list = getattr(
AttributeError: 'BybitApi' object has no attribute 'private_get_position_list'

のエラーが発生しました。調べてみたところ、
ccxt/ccxt#6827
のページがあり、ccxtの1.26.66?の以降のバージョンで変更があったみたいです。

botfw/bybit/api.py:14~15 の部分の

self.private_get_position_list = getattr(
            self, 'private_get_position_list')

self.privateLinearGetPositionList = getattr(
            self, 'privateLinearGetPositionList')

と修正したところ、simple_bot.pyがエラーなく動きました。

ポジション自動修復機能のバグ

ogm.set_position_sync_config(SYMBOL, MIN_SIZE, MIN_SIZE * 100)

として設定しても、

[09:53:04.651 W BitflyerOrderGroupManager] detect position mismatch between server(0.02) and client(0.0).

のメッセージが出力されるのみで、実際に修復が行われませんでした。

該当メッセージ出力部分のコードを見ると、detectのメッセージ出力の部分と実際に修復する部分でif-else分岐が行われておりどちらかしか呼ばれていないように思います。

また、そのif-else文から数行上の

if server == client:
    self.position_diff = 0
    continue

この部分を下のif-else文に統合してしまえると思います。
(揚げ足取るようであれなのですがself.position_diffはconf.position_diffのミスかなとも思います)

見当違いのこと言ってたらすみません!
よろしくお願いしますm(_ _)m

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.