#cryptocurrency #async #bybit #trading

bybit-async

Rust版本的Bybit API(异步)库

1 个不稳定版本

0.1.0 2024年4月22日

#4 in #bybit

MIT 许可协议

71KB
2K SLoC

bybit-async

一个非官方的Bybit API Rust库,支持异步/等待和易于使用的界面设计。

Crates.io Build Status MIT licensed Apache-2.0 licensed

文档

此库借鉴了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