#exchange #cryptocurrency #kraken #websocket-client #api-client #api #rust

squalo

🦈 最小化、优雅、快速、异步 Kraken 交易所 WebSockets API 客户端 | 使用 Rust 编写

7 个版本

0.1.6 2021 年 3 月 5 日
0.1.5 2021 年 3 月 1 日
0.1.4 2021 年 2 月 28 日

#16#kraken

32 每月下载量
gambero 中使用

MIT 许可证

62KB
101

squalo

🦈 最小化、优雅、快速、异步 Kraken 交易所 WebSockets API 客户端 | 使用 Rust 编写

描述

squalo 库旨在迅速将您的软件与 Kraken 交易所 WebSockets API 接口。

先决条件

Kraken 交易所 允许使用 WebSockets APIpublicprivate 数据交互。

对于 private,您需要向 squalo 库提供 API-KeyAPI-Secret,以便从 WebSockets 端点生成签名订阅的认证令牌。

如果您不熟悉,请参阅 WebSockets API - 常见问题解答 获取一般概述,或查阅 WebSockets API 文档。

实现

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

[dependencies]
squalo = {version = 0.1.6}

然后将其添加到您的 code

use squalo;

方法

squalo::print_crate_info();

描述:打印 crate 信息(名称、描述、版本、作者和存储库)。

squalo::set_kraken_api_credentials(api_key: String, api_secret: String);

描述:设置 Kraken API 凭据以访问 private 数据。

必需:

  • api_keyString
  • api_secretString
squalo::get_websockets_token().await;

描述:使用 Kraken REST API 端点从 WebSockets API 获取一个 signed 请求的 WebSockets API 令牌。

输出:以字符串格式返回一个 WebSockets API 令牌

squalo::create_communication_channel();

描述:返回一个对象对,一个 UnboundedSender (tx) 和一个 UnboundedReceiver (rx),这两个都用于与 WebSocket 客户端 的双向交互。

squalo::attach_websockets_stream(callback: fn(&str), stream_type: String, receiver: UnboundedReceiver<Message>);

描述:创建一个 thread,该线程初始化一个 WebSocket 客户端(相应地与 stream_type)。receiver 通过 incoming data streamcallback 来架起桥梁。

必需:

  • 回调fn (例如:fn callback(data: &str) { println("data: {}", data); }
  • stream_typeString (例如 "public""private"
  • receiverUnboundedReceiver<Message>(从 squalo::create_communication_channel() 方法获取)

输出:从 WebSockets 流 转发的任何消息都以前缀为 JSON 格式(根据结果形状相应解析)。

squalo::send_message(transmitter: UnboundedSender<Message>, payload: String);

描述:将 message 转发到处理 WebSocket 客户端thread,该线程将 payload 写入流。

示例

下面的示例展示了从零开始实现 squalo 是多么简单。

use squalo;

fn callback(data: &str) {
    println!("data: {}", data);
}

#[tokio::main]
async fn main() {
    
    // printing crate information
    squalo::print_crate_info();

    // enveloping payload pointing at public endpoint
    let payload1 =
        r#"{"event":"subscribe", "subscription":{"name":"trade"}, "pair":["XRP/EUR", "ETH/USD"]}"#
            .to_string();

    // creating communication channel for the websockets client
    let (tx1, rx1) = squalo::create_communication_channel();

    // attaching websockets to the public data stream
    squalo::attach_websockets_stream(callback, "public".to_string(), rx1);

    // transmitting payload to the websockets client
    squalo::send_message(tx1.to_owned(), payload1);

    // issuing credentials that enables private data interaction
    squalo::set_kraken_api_credentials(
        "YOUR_KRAKEN_API_KEY_HERE".to_string(),
        "YOUR_KRAKEN_API_SECRET".to_string(),
    );

    // requesting a websockets token
    let token = squalo::get_websockets_token().await;

    // enveloping message pointing at a private endpoint
    let payload2 = format!(
        r#"{{"event":"subscribe", "subscription":{{"name":"ownTrades", "token":"{}"}}}}"#,
        token
    );

    // creating communication channel for the websockets client
    let (tx2, rx2) = squalo::create_communication_channel();

    // attaching websockets to private data stream
    squalo::attach_websockets_stream(callback, "private".to_string(), rx2);

    // transmitting payload to the websockets client
    squalo::send_message(tx2.to_owned(), payload2);

    // enveloping the "ping" payload
    let ping = r#"{"event":"ping"}"#.to_string();

    // holding the main thread execution
    loop {
        // sleeping thread for 1 second
        std::thread::sleep(std::time::Duration::from_millis(1000));
        // transmitting ping payload to the first client (public)
        squalo::send_message(tx1.to_owned(), ping.to_owned());
        // transmitting ping payload to the second client (private)
        squalo::send_message(tx2.to_owned(), ping.to_owned());
    }
}

免责声明

此软件没有任何形式的保证。

我不会对与此软件的使用或误用相关的任何损害负责。

您是唯一的责任人。

依赖项

~19–34MB
~660K SLoC