#cryptocurrency #async #binance #trading

binance-async

Binance API 的 Rust 库(异步)

4 个版本 (2 个重大变更)

0.3.0 2023年3月26日
0.2.0 2018年10月28日
0.1.1 2018年8月13日
0.1.0 2018年8月13日

#4#binance

每月 33 次下载

MIT 许可证

77KB
2K SLoC

binance-async

异步/Await 和易用设计的 Binance API 的非官方 Rust 库。

Crates.io Build Status MIT licensed Apache-2.0 licensed

文档

此库借鉴了 Flavio Oliveira (wisespace-io) 的 作品。感谢他的优秀库!

此仓库处于早期阶段,并非所有请求/网络套接字都已实现。然而,相关机制已经存在:添加对新请求/网络套接字事件的支持只需 几行代码。PR 非常受欢迎!

风险提示

这是一个个人项目,使用风险自负。我不会对您的投资损失负责。加密货币投资存在很高的市场风险。

MSRV

Rust 1.60

用法

此库刚刚恢复。请现在使用 git 版本。

将以下内容添加到您的 Cargo.toml

[dependencies]
binance-async = 0.2

示例位于示例文件夹中。

  • examples/websocket.rs:订阅市场数据和用户数据的网络套接字。
  • examples/new_order_and_cancel.rs:创建一个新订单然后取消它。

易用设计

此库的设计遵循基于 struct-的请求/响应 模式。这使得 API 请求易于使用和理解。

例如,要创建新订单,您需要填写 OrderRequest 结构体,它定义为

#[derive(Debug, Clone, Default, Deserialize, Serialize)]
pub struct OrderRequest {
    pub symbol: String,
    pub qty: Decimal,
    pub price: Decimal,
    pub stop_price: Option<Decimal>,
    pub order_side: OrderSide,
    pub order_type: OrderType,
    pub time_in_force: TimeInForce,
    pub new_client_order_id: Option<String>,
}

您只需填写要填写的字段,其余的留给 Default。例如。

let req = OrderRequest {
    symbol: "btcusd".into(),
    qty: 3.try_into().unwrap(),
    price: 20000.try_into().unwrap(),
    ..Default::default()
};

let client = Binance::new();
client.request(req).await?;

这避免了库中有大量用于不同参数组合的方法。

方便背后的魔力在于 Request 特性。例如,OrderRequestRequest 实现,如下所示。

impl Request for OrderRequest {
    const API: APIUrl = APIUrl::Spot;
    const ENDPOINT: &'static str = "/api/v3/order";
    const METHOD: Method = Method::POST;
    const SIGNED: bool = true;
    type Response = OrderInfo;
}

这为每个请求结构体关联必要的信息。

缺少端点?您可以轻松添加!

由于 Binance 提供的 API 数量众多,因此很难覆盖此库的所有内容。

然而,由于这个库使用了基于struct-based Request/Response模式的模式,添加新的请求非常简单。你只需要在源代码中添加一个新的Request结构和一个新的Response结构,并将Request特质实现到新添加的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;
    Endpoint => "/fapi/v1/positionSide/dual";
    Method => Method::GET;
    Signed => true;
    Request => {};
    Response => {
        pub dual_side_position: bool,
    };
}

依赖项

~8–22MB
~359K SLoC