Crates.io | obmrs |
lib.rs | obmrs |
version | 0.1.2 |
source | src |
created_at | 2024-10-06 20:47:44.059701 |
updated_at | 2024-10-07 06:05:27.191937 |
description | As a participant, you will create a structure to receive and hold the exchange-distributed order book. This structure will be called the OrderBoard, and will hold the order book's bids and asks as a price-sorted map, input and output. It will store aggregates against prices, not individual orders against prices. |
homepage | |
repository | https://github.com/go-numb/obmrs |
max_upload_size | |
id | 1399401 |
size | 22,585 |
[This is a project under review. Since: 2024/10/07]
obmrs
は、Rustで記述された仮想通貨や株式市場向けのOrderBook Management Systemです。参加者は取引所から送られるOrderbook(注文板)を受信し、効率的かつ整理された方法で保持するための構造体を活用できます。
このライブラリは、OrderBoard
という構造体を提供し、Orderbookの買い注文(bids)と売り注文(asks)を価格でソートされたマップとして保存し、効率的な入出力およびデータ保持を行います。
OrderBoard
は、価格ごとにまとめたBooks
構造体のデータを保存します。これは、各価格に紐づく複数の注文ではなく、各価格に対する総量を記録します。
converter()
関数を用いることで、さまざまな型(i64
, f64
, String
, Decimal
など)からBook
(注文量と価格のペア)構造体への変換をシンプルに行うことができます。
BTreeMap
を使用しています。これにより、データの検索・挿入・削除が高速に行えます。converter
機能により、複数の異なるデータ型(整数や小数、文字列など)を簡単にBook
構造体に変換可能です。wall(size)
により、指定したサイズ以上の注文をフィルタリングすることができます。trim_inside_best_book
メソッドで、注文板の内側にある注文をトリムし、最適化された状態に維持できます。これにより、不要なデータが削除され、メモリ効率を向上させます。Cargo.toml
に以下の依存関係を追加してください:
$ cargo add obmrs
[dependencies]
obmrs = "0.1.0"
以下のシンプルなコードサンプルを通じて、基本的な操作の流れを確認できます。
OrderBoard
構造体を生成し、初期化を行います。bids
は買い注文、asks
は売り注文です。
use obmrs::{OrderBoard, Book};
use rust_decimal::Decimal;
fn main() {
let max_length = 100; // 最大100件
let digits = 6; // 価格の精度は小数点以下6桁
let mut orderboard = OrderBoard::new(max_length, digits);
}
異なるデータ型をサポートするconverter()
を使って、Book
構造体に変換し、OrderBoard
に追加します。
use obmrs::{converter, Books, Book};
use rust_decimal::Decimal;
fn main() {
let mut ob = OrderBoard::new(100, 6);
// 様々な型からBookへ変換
let book1 = converter(100i64, 50i64).unwrap(); // price: 100, size: 50のBook
let book2 = converter(100.5f64, 200f64).unwrap(); // price: 100.5, size: 200のBook
// OrderBoardへ追加
ob.asks.push(book1);
ob.bids.push(book2);
}
OrderBoard
から現在の最良の売り注文(ask)と最良の買い注文(bid)を取得します。
fn main() {
let mut orderbook = OrderBoard::new(100, 6);
// 追加した後、最良のaskとbidを取得
let (bestask, bestbid) = orderbook.best();
if let Some(ask) = bestask {
println!("Best Ask: {}, Size: {}", ask.price, ask.size);
}
if let Some(bid) = bestbid {
println!("Best Bid: {}, Size: {}", bid.price, bid.size);
}
}
指定されたサイズ以上の注文を取得したい場合は、Books::wall(size)
メソッドを使用します。
fn main() {
let mut ob = OrderBoard::new(100, 6);
// 例えば、サイズ50以上の注文を取得する
if let Some(wall) = ob.bids.wall(Decimal::new(50, 0)) {
println!("Wall Bid: Price: {}, Size: {}", wall.price, wall.size);
}
}
trim_inside_best_book
メソッドを使って、現在のベストASKとベストBIDより内側にある注文を削除します。この機能により不要な注文が削除され、効率化が図れます。
size:0が返ってくる取引所情報では不要です。size:0がpushされた場合、当クレートはその価格情報を削除します。
fn main() {
let mut ob = OrderBoard::new(100, 6);
// 各ベストの内側(スプレッド内)にある注文を削除
let bestbid = 99.9;
let bestask = 100.1;
ob.trim_inside_best_book(bestask, bestbid);
}
new
: 新しいOrderBoard
を作成します。最大保持数と精度を引数に取ります。converter
: 様々な型のデータ(i64
, f64
, String
, Decimal
など)をBook
に変換します。push
: 単一のBook
をBooks
に追加します。extend
: 複数のBook
を一度にBooks
構造に追加します。best
: 最良の売り・買い注文(best_ask, best_bid)を取得します。wall(size)
: 指定したサイズ以上の注文(壁)を取得します。trim_inside_best_book(best_ask, best_bid)
: ベストASKとベストBIDの内側にある注文を削除します。Go言語でこのライブラリを扱いたい場合は、以下にあるクライアントライブラリを参考にしてください。
MIT License
このプロジェクトはMITライセンスに基づいて提供されており、自由に使用・改変・再配布が可能です。