1 个不稳定版本
0.1.0 | 2024年4月22日 |
---|
#4 in #bybit
71KB
2K SLoC
bybit-async
一个非官方的Bybit API Rust库,支持异步/等待和易于使用的界面设计。
此库借鉴了Flavio Oliveira(wisespace-io)的作品。感谢他的优秀库!
此仓库处于早期阶段,并非所有请求/websocket都实现了。然而,相关机制已经存在:添加对新请求/websocket事件的支撑只需几行代码。PR非常欢迎!
风险提示
这是一个个人项目,使用风险自担。我不会对您的投资损失负责。加密货币投资存在较高的市场风险。
MSRV
Rust 1.60
使用
将以下内容添加到您的Cargo.toml中
[dependencies]
bybit-async = 0.3
示例位于示例文件夹中。
examples/websocket.rs
:订阅市场数据和用户数据的websocket。examples/new_order_and_cancel.rs
:创建一个新订单然后取消它。
易用设计
此库的设计遵循基于结构的请求/响应模式。这使得API请求易于使用和理解。
例如,要创建一个新订单,您需要填写OrderRequest
结构体,该结构体定义如下
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
pub struct NewOrderRequest {
pub symbol: String,
pub qty: Decimal,
pub price: Decimal,
pub stop_price: Option<Decimal>,
pub order_side: Side,
pub order_type: OrderType,
pub time_in_force: TimeInForce,
pub new_client_order_id: Option<String>,
}
您只需填写您想填写的字段,其余的留给Default
。例如。
let req = NewOrderRequest {
symbol: "btcusd".into(),
qty: 3.try_into().unwrap(),
price: 20000.try_into().unwrap(),
..Default::default()
};
let client = Bybit::new();
client.request(req).await?;
这避免了库中有许多用于不同参数组合的方法。
便利背后的魔法是Request
特质。例如,OrderRequest
实现了Request
,如下所示
impl Request for NewOrderRequest {
const API: APIUrl = APIUrl::Spot;
const ENDPOINT: &'static str = "/api/v3/order";
const METHOD: Method = Method::POST;
const SIGNED: bool = true;
type Response = OrderInfo;
}
这为每个请求结构体关联了必要的信息。
缺少端点?您可以轻松添加!
由于Bybit提供的API数量众多,很难涵盖此库的各个方面。
然而,由于这个库使用基于 struct-的 Request/Response
模式,添加一个新的请求非常简单。你只需要在源代码中添加一个新的 Request
结构体和一个新的 Response
结构体,并将 Request
trait 实现到新添加的 Request
结构体中。
例如,添加 GET /fapi/v1/positionSide/dual
就是这样
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize)]
pub struct GetCurrentPositionModeRequest {}
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetCurrentPositionModeResponse {
dual_side_position: bool,
}
impl Request for GetCurrentPositionModeRequest {
const API: APIUrl = APIUrl::UsdMFutures;
const ENDPOINT: &'static str = "/fapi/v1/positionSide/dual";
const METHOD: Method = Method::GET;
const SIGNED: bool = true;
type Response = GetCurrentPositionModeResponse;
}
或者,为了简化,可以使用宏(查看操作)
crate::define_request! {
Name => GetCurrentPositionMode;
Product => Product::UsdMFutures;
Method => Method::GET;
Endpoint => "/fapi/v1/positionSide/dual";
Signed => true;
Request => {};
Response => {
pub dual_side_position: bool,
};
}
依赖项
~9–21MB
~308K SLoC