Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bybitの型問題の抜本的な解決方法について #82

Closed
3 tasks done
MtkN1 opened this issue Aug 30, 2021 · 1 comment
Closed
3 tasks done

Bybitの型問題の抜本的な解決方法について #82

MtkN1 opened this issue Aug 30, 2021 · 1 comment
Assignees
Labels
enhancement New feature or request

Comments

@MtkN1
Copy link
Member

MtkN1 commented Aug 30, 2021

課題

Bybitのレスポンスデータは、REST・WebSocket・エンドポイント・契約取引、によって異なる型のデータが配信される。
例: RESTはfloatたが、WebSocketはstrなど

こちらのPR #81 (comment) でまとめて頂いたコメントにてそれが顕著にみられる。
pybottersは各データをデータストアといったモデルにしデータを格納しているが、これを解決するのに全てのデータモデルに対して型の一致を図るのはかなりの作業量を要するし、Bybit APIが変更が多いのでそれに追従することも難しい。
そこで何か現実的で抜本的な解決方法を検討する。

これを解決することによって、ユーザー側の型に関する変換作業などの負担を軽減することができる。

解決策

フィールド名単位で変換を掛ける

フィールド名単位で変換を定義する。
例としては「このデータのこのフィールド」に変換を定義するのではなく、「このフィールド名だったら」変換を掛けるように定義する。
"price"や"size"などのフィールド名は法則上数値であるはずなので、元がintであろうかfloatであろうがstrでもDecimal型に変換すればよい。
メリットとしてはデータモデル(エンドポイント)関係なしにフィールド名で変換をかけるので、定義の数がするなくなるし新しエンドポイントにも対応し易い。
デメリットとしては法則に則っていないフィールドがあった場合、対応ができない。

無粋に変換を掛ける

上記案は定義作業は少ないにしても、デメリットの点について結局は全てのデータモデルの型を確認して作業しなければならない。
それならば最初から無粋に全てのデータモデルに対して変換型を定義してあげた方がいいかもしれない。

✅ 自動で変換する

str型のフィールドにはint()を試みて、ValueErrorだったらfloat()を試みる。
処理負荷が上がるのでインスタンス生成時の引数でこの機能を有効にできるようにする(デフォルトは無効)。

チェックリスト

  • 実装
  • テスト
  • Wiki
@MtkN1 MtkN1 self-assigned this Aug 30, 2021
@MtkN1
Copy link
Member Author

MtkN1 commented Sep 24, 2021

追記検討

BybitのAPIドキュメントのFAQに色々少し書いてあった。

https://bybit-exchange.github.io/docs/inverse/#t-faq_float_precision

値が小数点以下の桁数が多すぎるのはなぜですか? (浮動小数点精度の問題)

たとえば、11.969999を受け取りましたが、11.97を期待していました。 浮動小数点の精度の問題により、一部の値が小数点以下の桁数が多すぎたり、小数部が高すぎたり低すぎたりします。 今のところ、受け取った値を正しい小数点以下の桁数に丸めることをお勧めします。これは、クエリシンボルエンドポイントを参照して実行できます。 この問題は、APIの次のメジャーバージョンで修正される予定です。残念ながら、短期的には修正できません。

Bybitの開発側がうまく設計できてなくて、この問題の為か文字列の数値で送っている模様。

実装

暫定でfloat, int変換するBybitDataStoreを実装した。

Dicimalではなくてfloat, intで実装した。
理由としては、Decimal型にするなら文字列でない浮動小数や整数で来てる値もDecimalにする必要がでてくるから。
それなら文字列の数値をfloat, intに変換するだけの方がシンプルになる。
そもそも、サーバー側は正確な値を保存する必要があるが、クライアント側は値を丸めてリクエストするだけである。

@MtkN1 MtkN1 added the enhancement New feature or request label Sep 24, 2021
MtkN1 added a commit that referenced this issue Sep 24, 2021
MtkN1 added a commit that referenced this issue Sep 24, 2021
MtkN1 added a commit that referenced this issue Sep 24, 2021
✨v0.7.0リリース

## Issues
✅ Bybitの型問題の抜本的な解決方法について #82
✅ BybitのLiquidationトピックを追加する #83
## Pull requests
✅ BybitのKlineのinitializeを追加する #81
MtkN1 added a commit that referenced this issue Nov 10, 2021
MtkN1 added a commit that referenced this issue Nov 11, 2021
✨v0.8.0リリース

## Issues
✅ Bybitの型問題の抜本的な解決方法について #82
✅ バイナリのWebSocketデータのハンドリングに対応する #87
✅ GMOコインのデータストアにタイムスタンプを追加する #88
## Pull requests
✅ Remove default empty list #92
✅ add API Reference #93
@MtkN1 MtkN1 closed this as completed Jan 3, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

1 participant