diff --git a/Cargo.toml b/Cargo.toml index e0a126b..942d756 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ccxt-rust" -version = "0.1.2" +version = "0.1.3" edition = "2024" rust-version = "1.91" authors = ["Praying"] @@ -96,8 +96,8 @@ envy = "0.4" [dependencies] # Workspace members -ccxt-core = { path = "ccxt-core" , version = "0.1.2"} -ccxt-exchanges = { path = "ccxt-exchanges" , version = "0.1.2"} +ccxt-core = { path = "ccxt-core", version = "0.1.3" } +ccxt-exchanges = { path = "ccxt-exchanges", version = "0.1.3" } # Async runtime tokio = { workspace = true } diff --git a/README.md b/README.md index 72bc59d..33cffd6 100644 --- a/README.md +++ b/README.md @@ -4,524 +4,122 @@ ___ [![Rust](https://img.shields.io/badge/rust-1.91%2B-orange.svg)](https://www.rust-lang.org/) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Rust CI](https://github.com/Praying/ccxt-rust/actions/workflows/rust.yml/badge.svg)](https://github.com/Praying/ccxt-rust/actions/workflows/rust.yml) -[![Security Audit](https://github.com/Praying/ccxt-rust/actions/workflows/rust.yml/badge.svg)](https://github.com/Praying/ccxt-rust/actions/workflows/rust.yml) [![Documentation](https://img.shields.io/badge/docs-latest-blue.svg)](https://docs.rs/ccxt-rust) -A professional-grade Rust implementation of the CCXT (CryptoCurrency eXchange Trading) library, providing unified, type-safe access to Major cryptocurrency exchanges with high-performance async operations. +A professional-grade, type-safe Rust implementation of the CCXT library for cryptocurrency trading, providing unified +access to major exchanges. [English](README.md) | [็ฎ€ไฝ“ไธญๆ–‡](README_CN.md) ## ๐ŸŽฏ Supported Exchanges -| Exchange | Public API (Market Data) | Private API (Trading) | WebSocket | -|----------|--------------------------|-----------------------|-----------| -| **Binance** | โœ… | โœ… | โœ… | -| **Bitget** | โœ… | โœ… | โœ… | -| **Hyperliquid** | โœ… | โœ… | โœ… | -| **OKX** | โœ… | โœ… | โœ… | -| **Bybit** | โœ… | โœ… | โœ… | - -> **Legend**: โœ… Supported, ๐Ÿšง In Progress, ๐Ÿ”„ Planned - -## ๐ŸŒŸ Features - -### Core Capabilities -- **โœ… Type-Safe Trading Operations** - Leverage Rust's strong type system for compile-time safety -- **โœ… Async/Await Architecture** - Built on Tokio for efficient, non-blocking I/O operations -- **โœ… Precise Financial Calculations** - Using `rust_decimal` for accurate monetary computations -- **โœ… Comprehensive Error Handling** - Structured error types with full context propagation -- **โœ… REST API Support** - Complete REST API implementation for exchange operations -- **โœ… WebSocket Real-Time Data** - Live market data streaming with automatic reconnection -- **โœ… Multi-Exchange Support** - Unified interface across multiple cryptocurrency exchanges - -### Advanced Features -- **Market Data Operations** - - Fetch tickers, order books, and OHLCV data - - Real-time market data streaming via WebSocket - - Advanced market data with depth and aggregation - -- **Order Management** - - Create, cancel, and modify orders - - Support for market, limit, and conditional orders - - OCO (One-Cancels-Other) order support - - Batch order operations - -- **Account Management** - - Balance inquiries and account information - - Deposit and withdrawal operations - - Transaction history and ledger access - - Fee management and calculation - -- **Trading Features** - - Spot trading - - Margin trading (cross and isolated) - - Futures trading with position management - - Leverage and margin management - -- **WebSocket Features** - - Real-time order book updates - - Live trade streaming - - Account balance updates - - Order status updates - - Position updates for futures +| Exchange | Market Data | Trading | WebSocket | +|-----------------|-------------|---------|-----------| +| **Binance** | โœ… | โœ… | โœ… | +| **Bitget** | โœ… | โœ… | โœ… | +| **Hyperliquid** | โœ… | โœ… | โœ… | +| **OKX** | โœ… | โœ… | โœ… | +| **Bybit** | โœ… | โœ… | โœ… | -## ๐Ÿ—๏ธ Architecture - -The project follows a clean, modular workspace architecture with a unified Exchange trait: - -### Project Structure - -``` -ccxt-rust/ -โ”œโ”€โ”€ ccxt-core/ # Core types, traits, and error handling -โ”‚ โ”œโ”€โ”€ types/ # Market, Order, Trade, Ticker, etc. -โ”‚ โ”œโ”€โ”€ exchange.rs # Unified Exchange trait -โ”‚ โ”œโ”€โ”€ ws_exchange.rs # WebSocket Exchange trait -โ”‚ โ”œโ”€โ”€ error/ # Comprehensive error types -โ”‚ โ”œโ”€โ”€ base_exchange/ # Base exchange functionality -โ”‚ โ”œโ”€โ”€ http_client/ # HTTP client with retry and circuit breaker -โ”‚ โ”œโ”€โ”€ ws_client/ # WebSocket client with auto-reconnect -โ”‚ โ”œโ”€โ”€ auth/ # Authentication and signing -โ”‚ โ””โ”€โ”€ ... -โ”œโ”€โ”€ ccxt-exchanges/ # Exchange-specific implementations -โ”‚ โ”œโ”€โ”€ binance/ # Binance exchange implementation -โ”‚ โ”œโ”€โ”€ okx/ # OKX exchange implementation -โ”‚ โ”œโ”€โ”€ bybit/ # Bybit exchange implementation -โ”‚ โ”œโ”€โ”€ bitget/ # Bitget exchange implementation -โ”‚ โ””โ”€โ”€ hyperliquid/ # Hyperliquid exchange implementation -โ”œโ”€โ”€ examples/ # Comprehensive usage examples -โ”œโ”€โ”€ tests/ # Integration tests -โ””โ”€โ”€ docs/ # Detailed documentation -``` - -### Module Relationships - -``` -โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -โ”‚ Application Code โ”‚ -โ”‚ (uses exchanges through unified Exchange trait interface) โ”‚ -โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - โ”‚ - โ–ผ -โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -โ”‚ Unified Exchange Trait โ”‚ -โ”‚ (ccxt-core::exchange::Exchange) โ”‚ -โ”‚ - Provides polymorphic interface for all exchanges โ”‚ -โ”‚ - Capability-based feature discovery โ”‚ -โ”‚ - Market data, trading, account management methods โ”‚ -โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - โ”‚ - โ–ผ -โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -โ”‚ Base Exchange Layer โ”‚ -โ”‚ (ccxt-core::base_exchange::BaseExchange) โ”‚ -โ”‚ - Common functionality shared across exchanges โ”‚ -โ”‚ - Market caching, precision handling, symbol parsing โ”‚ -โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - โ”‚ - โ–ผ -โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -โ”‚ Exchange Implementations โ”‚ -โ”‚ (ccxt-exchanges::binance, okx, bybit, ...) โ”‚ -โ”‚ - Exchange-specific API clients โ”‚ -โ”‚ - REST and WebSocket implementations โ”‚ -โ”‚ - Custom request parsing and authentication โ”‚ -โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ -``` - -### Key Design Principles - -1. **Trait-Based Abstraction**: Unified `Exchange` trait allows polymorphic usage -2. **Capability Discovery**: Runtime feature detection via `ExchangeCapabilities` -3. **Type Safety**: Strong typing with `rust_decimal` for financial calculations -4. **Error Handling**: Comprehensive error types with context preservation -5. **Async First**: Built on Tokio for efficient async operations - -### Unified Exchange Trait - -The `Exchange` trait in `ccxt-core` provides a unified interface for all exchanges: - -```rust -use ccxt_core::exchange::{Exchange, ExchangeCapabilities, BoxedExchange}; +> **Legend**: โœ… Supported, ๐Ÿšง In Progress -// Use any exchange through the unified interface -async fn fetch_price(exchange: &dyn Exchange, symbol: &str) -> Result { - // Check capability before calling - if !exchange.capabilities().fetch_ticker() { - return Err(Error::not_implemented("fetch_ticker")); - } - - let ticker = exchange.fetch_ticker(symbol).await?; - ticker.last.ok_or_else(|| Error::invalid_response("No last price")) -} - -// Use multiple exchanges polymorphically -async fn compare_prices(exchanges: &[BoxedExchange], symbol: &str) { - for exchange in exchanges { - println!("{}: {:?}", exchange.name(), fetch_price(exchange.as_ref(), symbol).await); - } -} -``` - -### WebSocket Streaming - -The `WsExchange` trait provides real-time data streaming: +## ๐ŸŒŸ Key Features -```rust -use ccxt_core::ws_exchange::{WsExchange, FullExchange}; -use futures::StreamExt; - -async fn watch_market(exchange: &dyn WsExchange, symbol: &str) { - exchange.ws_connect().await.unwrap(); - - let mut stream = exchange.watch_ticker(symbol).await.unwrap(); - while let Some(Ok(ticker)) = stream.next().await { - println!("Price: {:?}", ticker.last); - } -} -``` +- **๐Ÿ›ก๏ธ Type-Safe & Async**: Built on `Tokio` and `rust_decimal` for safe, high-performance financial operations. +- **๐Ÿ”„ Unified Interface**: Consistent `Exchange` trait across all supported exchanges. +- **โšก Real-Time**: Robust WebSocket support with automatic reconnection. +- **๐Ÿ“ฆ Comprehensive Capability**: + - **Market Data**: Tickers, Order Books, OHLCV, Trades. + - **Trading**: Spot, Margin, Futures, Batched Orders, OCO. + - **Account**: Balances, Transactions, Leverage management. ## ๐Ÿš€ Quick Start -**New to ccxt-rust?** Start with our [5-minute Quick Start Guide](QUICKSTART.md) ๐Ÿ“– - -### Prerequisites - -- Rust 1.91+ or later -- Cargo (latest stable) - ### Installation -Add via command line: - ```bash cargo add ccxt-rust ``` -Or add to your `Cargo.toml`: - -```toml -[dependencies] -ccxt-core = { path = "ccxt-core" } -ccxt-exchanges = { path = "ccxt-exchanges" } -tokio = { version = "1.35", features = ["full"] } -rust_decimal = "1.39" -futures = "0.3" -``` - -### Basic Usage with Builder Pattern +### Basic Usage ```rust use ccxt_exchanges::binance::Binance; use ccxt_core::exchange::Exchange; +use rust_decimal_macros::dec; +use ccxt_core::types::{OrderType, OrderSide}; #[tokio::main] async fn main() -> Result<(), Box> { - // Initialize exchange using the builder pattern (recommended) + // 1. Initialize (using env vars recommended) let exchange = Binance::builder() - .api_key("your_api_key") - .secret("your_secret") - .sandbox(false) // Use production API + .api_key(std::env::var("BINANCE_API_KEY").ok()) + .secret(std::env::var("BINANCE_SECRET").ok()) .build()?; - // Fetch ticker through the unified Exchange trait + // 2. Fetch Market Data let ticker = exchange.fetch_ticker("BTC/USDT").await?; println!("BTC/USDT Price: {:?}", ticker.last); - // Fetch order book - let orderbook = exchange.fetch_order_book("BTC/USDT", Some(10)).await?; - if let Some(best_bid) = orderbook.bids.first() { - println!("Best bid: {}", best_bid.price); - } - if let Some(best_ask) = orderbook.asks.first() { - println!("Best ask: {}", best_ask.price); - } - - // Place an order (requires API credentials) - use ccxt_core::types::{OrderType, OrderSide}; - use rust_decimal_macros::dec; - + // 3. Place Order (if credentials provided) + if exchange.has_private_api() { let order = exchange.create_order( - "BTC/USDT", - OrderType::Limit, - OrderSide::Buy, - dec!(0.001), - Some(dec!(40000)), + "BTC/USDT", + OrderType::Limit, + OrderSide::Buy, + dec!(0.001), + Some(dec!(50000)), ).await?; println!("Order placed: {}", order.id); - - Ok(()) -} -``` - -### Using Exchanges Polymorphically - -```rust -use ccxt_core::exchange::{Exchange, BoxedExchange}; -use std::sync::Arc; - -#[tokio::main] -async fn main() -> Result<(), Box> { - // Create exchange as a trait object - let exchange: BoxedExchange = Box::new( - ccxt_exchanges::binance::Binance::builder().build()? - ); - - // Use through the unified interface - println!("Exchange: {} ({})", exchange.name(), exchange.id()); - println!("Capabilities: {:?}", exchange.capabilities()); - - // Check capabilities before calling methods - if exchange.capabilities().fetch_ticker() { - let ticker = exchange.fetch_ticker("BTC/USDT").await?; - println!("Price: {:?}", ticker.last); - } - - Ok(()) -} -``` - -### WebSocket Streaming - -```rust -use ccxt_exchanges::binance::Binance; -use ccxt_core::ws_exchange::WsExchange; -use futures::StreamExt; - -#[tokio::main] -async fn main() -> Result<(), Box> { - // Initialize exchange - let exchange = Binance::builder().build()?; - - // Watch real-time ticker updates using the WsExchange trait - let mut stream = exchange.watch_ticker("BTC/USDT").await?; - - while let Some(result) = stream.next().await { - match result { - Ok(ticker) => println!("Price: {:?}", ticker.last), - Err(e) => eprintln!("Error: {}", e), - } } Ok(()) } ``` -**More examples**: See the [QUICKSTART.md](QUICKSTART.md) guide for detailed tutorials! - -## ๐Ÿ“š Examples +For WebSocket examples and advanced usage (polymorphism), see the [`examples/`](examples/) directory. -The project includes comprehensive examples covering all major features: - -- **`basic_usage.rs`** - Getting started with the library -- **`binance_market_data_example.rs`** - Market data operations -- **`binance_order_management_example.rs`** - Order creation and management -- **`binance_account_example.rs`** - Account operations -- **`binance_margin_example.rs`** - Margin trading -- **`binance_futures_example.rs`** - Futures trading -- **`binance_ws_example.rs`** - WebSocket streaming -- **`binance_conditional_orders_example.rs`** - Conditional orders -- **`binance_deposit_withdrawal_example.rs`** - Deposit/withdrawal operations - -Run any example: - -```bash -cargo run --example basic_usage -cargo run --example binance_ws_example -``` +## ๐Ÿ—๏ธ Architecture +The project is structured as a workspace: +- **`ccxt-core`**: Defines the unified `Exchange` and `WsExchange` traits, standard types, and error handling logic. +- **`ccxt-exchanges`**: Contains specific implementations (Binance, OKX, etc.). ## ๐Ÿšฉ Feature Flags -Optimize your build by selecting only the features you need in `Cargo.toml`: - -- **`default`**: Enables `rest`, `websocket`, and `rustls-tls`. -- **`rest`**: Enables REST API support. -- **`websocket`**: Enables WebSocket support. -- **`rustls-tls`**: Uses `rustls` for TLS (default, recommended). -- **`native-tls`**: Uses platform-native TLS (OpenSSL/Schannel/Secure Transport). -- **`compression`**: Enables GZIP compression for HTTP requests. -- **`full`**: Enables all features. - -## ๐Ÿ”ง Configuration - -### Environment Variables - -Create a `.env` file from the template: - -```bash -cp .env.example .env -``` - -Key configuration options: - -```bash -# API Credentials -BINANCE_API_KEY=your_api_key_here -BINANCE_API_SECRET=your_secret_here - -# Testing -ENABLE_PRIVATE_TESTS=false -ENABLE_INTEGRATION_TESTS=false -USE_MOCK_DATA=true -TEST_SYMBOL=BTC/USDT - -# Logging -RUST_LOG=info -``` +| Flag | Description | Default | +|--------------|--------------------------|---------| +| `rest` | REST API support | โœ… | +| `websocket` | WebSocket support | โœ… | +| `rustls-tls` | Use RustLS (recommended) | โœ… | +| `native-tls` | Use OpenSSL/Native TLS | โŒ | -## ๐Ÿงช Testing +## ๐Ÿ› ๏ธ Development ```bash -# Run all tests +# Run tests cargo test -# Run tests with output -cargo test -- --nocapture - -# Run specific test suite -cargo test -p ccxt-core -cargo test -p ccxt-exchanges - -# Run integration tests -cargo test --test binance_integration_test - -# Run with live API (requires credentials) -ENABLE_INTEGRATION_TESTS=true cargo test -``` - -## ๐Ÿ“– Documentation - -- **[API Documentation](docs/)** - Detailed API reference -- **[Testing Guide](docs/TESTING.md)** - Comprehensive testing documentation -- **[Implementation Plans](docs/)** - Feature implementation roadmaps -- **[Comparison Analysis](docs/GO_RUST_COMPARISON_ANALYSIS.md)** - Go vs Rust implementation +# Check code quality +cargo clippy --all-targets -- -D warnings -Generate local documentation: - -```bash +# Build documentation cargo doc --open ``` +## ๐Ÿ“ License & Support -## ๐Ÿ› ๏ธ Development - -### Building - -```bash -# Debug build -cargo build - -# Release build (optimized) -cargo build --release - -# Build specific package -cargo build -p ccxt-core -cargo build -p ccxt-exchanges -``` - -### Code Quality - -```bash -# Format code -cargo fmt - -# Run linter -cargo clippy --all-targets --all-features - -# Strict linting (no warnings) -cargo clippy --all-targets --all-features -- -D warnings - -# Check compilation -cargo check --all-features -``` - -## ๐Ÿ” Security - -- **Never commit API keys or secrets** - Always use environment variables -- **Secure credential storage** - Use system keychains or encrypted vaults -- **Rate limiting** - Built-in rate limiting to prevent API bans -- **Input validation** - All inputs are validated before API calls -- **HTTPS only** - All communications use TLS encryption - -## ๐Ÿค Contributing - -Contributions are welcome! Please follow these guidelines: - -1. Fork the repository -2. Create a feature branch (`git checkout -b feature/amazing-feature`) -3. Follow Rust best practices and project conventions -4. Add tests for new features -5. Ensure all tests pass (`cargo test`) -6. Run formatting and linting (`cargo fmt && cargo clippy`) -7. Commit your changes (`git commit -m 'Add amazing feature'`) -8. Push to the branch (`git push origin feature/amazing-feature`) -9. Open a Pull Request - -### Development Conventions - -- **Code Style**: Rust 2024 edition, 100-character line width -- **Testing**: Minimum 80% test coverage -- **Documentation**: All public APIs must have documentation -- **Error Handling**: Use `thiserror` for custom errors, `anyhow` for context - -## ๐Ÿ“Š Performance - -Built for high performance: -- **Async I/O**: Non-blocking operations using Tokio -- **Zero-copy parsing**: Efficient JSON deserialization -- **Connection pooling**: Reused HTTP connections -- **Optimized builds**: LTO and single codegen unit for releases -- **Benchmarks**: Criterion-based performance benchmarks - -## ๐Ÿ› Troubleshooting - -### Common Issues - -1. **Compilation errors** - - Ensure Rust 1.91+ is installed: `rustc --version` - - Update dependencies: `cargo update` - - Clean build: `cargo clean && cargo build` - -2. **API authentication failures** - - Verify API keys in `.env` file - - Check API key permissions on exchange - - Ensure system clock is synchronized - -3. **Rate limiting** - - Reduce request frequency - - Use WebSocket for real-time data - - Check exchange-specific rate limits - -For more help, see [documentation](docs/) or open an issue. - -## ๐Ÿ“ License - -This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. - -## ๐Ÿ™ Acknowledgments - -- Inspired by the original [CCXT](https://github.com/ccxt/ccxt) library -- Built with amazing Rust ecosystem libraries -- Community contributors and testers - -## ๐Ÿ“ž Contact & Support +MIT License. See [LICENSE](LICENSE). - **Issues**: [GitHub Issues](https://github.com/Praying/ccxt-rust/issues) -- **Discussions**: [GitHub Discussions](https://github.com/Praying/ccxt-rust/discussions) -- **Documentation**: [Project Docs](docs/) +- **Docs**: [docs.rs](https://docs.rs/ccxt-rust) -## โค๏ธ Donations +## โš ๏ธ Disclaimer -If the project is profitable, consider donating as showing gratitude for its development: - -**USDT or USDC Binance Smart Chain BEP20**: - -`0x8e5d858f92938b028065d39450421d0e080d15f7` +This project is for educational and research purposes only. The authors and contributors are not responsible for any +financial losses or damages arising from the use of this software. Cryptocurrency trading involves high risk; please +trade responsibly. --- - -**Status**: ๐Ÿšง Active Development | **Version**: 0.1.2 | **Updated**: 2026-01 - -โš ๏ธ **Note**: This library is under active development. APIs may change before v1.0. Not recommended for production use yet. +**Status**: ๐Ÿšง Active Development (v0.1.3) | **Donations (BSC)**: `0x8e5d858f92938b028065d39450421d0e080d15f7` diff --git a/README_CN.md b/README_CN.md index c0c15fc..9342698 100644 --- a/README_CN.md +++ b/README_CN.md @@ -1,394 +1,123 @@ #
CCXT-Rust
+___ + [![Rust](https://img.shields.io/badge/rust-1.91%2B-orange.svg)](https://www.rust-lang.org/) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Rust CI](https://github.com/Praying/ccxt-rust/actions/workflows/rust.yml/badge.svg)](https://github.com/Praying/ccxt-rust/actions/workflows/rust.yml) [![Documentation](https://img.shields.io/badge/docs-latest-blue.svg)](https://docs.rs/ccxt-rust) -CCXT (CryptoCurrency eXchange Trading) ๅบ“็š„ไธ“ไธš็บง Rust ๅฎž็Žฐ๏ผŒๆไพ›็ปŸไธ€ใ€็ฑปๅž‹ๅฎ‰ๅ…จ็š„ๆŽฅๅฃ่ฎฟ้—ฎไธปๆต็š„ๅŠ ๅฏ†่ดงๅธไบคๆ˜“ๆ‰€๏ผŒๅ…ทๆœ‰้ซ˜ๆ€ง่ƒฝๅผ‚ๆญฅๆ“ไฝœ็‰นๆ€งใ€‚ - -[English](README.md) | ็ฎ€ไฝ“ไธญๆ–‡ +CCXT ๅบ“็š„ไธ“ไธš็บง Rust ๅฎž็Žฐ๏ผŒๆไพ›็ปŸไธ€ใ€็ฑปๅž‹ๅฎ‰ๅ…จ็š„ๆŽฅๅฃ่ฎฟ้—ฎไธปๆตๅŠ ๅฏ†่ดงๅธไบคๆ˜“ๆ‰€ใ€‚ - +[English](README.md) | [็ฎ€ไฝ“ไธญๆ–‡](README_CN.md) ## ๐ŸŽฏ ๆ”ฏๆŒ็š„ไบคๆ˜“ๆ‰€ -| ไบคๆ˜“ๆ‰€ | ๅ…ฌๅ…ฑ API (่กŒๆƒ…ๆ•ฐๆฎ) | ็งๆœ‰ API (ไบคๆ˜“) | WebSocket | -|----------|--------------------------|-----------------------|-----------| -| **Binance** | โœ… | โœ… | โœ… | -| **Bitget** | โœ… | โœ… | โœ… | -| **Hyperliquid** | โœ… | โœ… | โœ… | -| **OKX** | โœ… | โœ… | โœ… | -| **Bybit** | โœ… | โœ… | โœ… | - -> **ๅ›พไพ‹**: โœ… ๅทฒๆ”ฏๆŒ, ๐Ÿšง ๅผ€ๅ‘ไธญ, ๐Ÿ”„ ่ฎกๅˆ’ไธญ - -## ๐ŸŒŸ ็‰นๆ€ง - -### ๆ ธๅฟƒ่ƒฝๅŠ› -- **โœ… ็ฑปๅž‹ๅฎ‰ๅ…จ็š„ไบคๆ˜“ๆ“ไฝœ** - ๅˆฉ็”จ Rust ๅผบๅคง็š„็ฑปๅž‹็ณป็ปŸๅฎž็Žฐ็ผ–่ฏ‘ๆ—ถๅฎ‰ๅ…จ -- **โœ… ๅผ‚ๆญฅ/็ญ‰ๅพ…ๆžถๆž„** - ๅŸบไบŽ Tokio ๆž„ๅปบ๏ผŒๅฎž็Žฐ้ซ˜ๆ•ˆ็š„้ž้˜ปๅกž I/O ๆ“ไฝœ -- **โœ… ็ฒพ็กฎ็š„้‡‘่ž่ฎก็ฎ—** - ไฝฟ็”จ `rust_decimal` ่ฟ›่กŒ็ฒพ็กฎ็š„่ดงๅธ่ฎก็ฎ— -- **โœ… ๅ…จ้ข็š„้”™่ฏฏๅค„็†** - ็ป“ๆž„ๅŒ–้”™่ฏฏ็ฑปๅž‹๏ผŒๅฎŒๆ•ด็š„ไธŠไธ‹ๆ–‡ไผ ๆ’ญ -- **โœ… REST API ๆ”ฏๆŒ** - ๅฎŒๆ•ด็š„ REST API ๅฎž็Žฐ๏ผŒๆ”ฏๆŒๅ„็งไบคๆ˜“ๆ‰€ๆ“ไฝœ -- **โœ… WebSocket ๅฎžๆ—ถๆ•ฐๆฎ** - ๅฎžๆ—ถๅธ‚ๅœบๆ•ฐๆฎๆต๏ผŒๆ”ฏๆŒ่‡ชๅŠจ้‡่ฟž -- **โœ… ๅคšไบคๆ˜“ๆ‰€ๆ”ฏๆŒ** - ่ทจๅคšไธชๅŠ ๅฏ†่ดงๅธไบคๆ˜“ๆ‰€็š„็ปŸไธ€ๆŽฅๅฃ - -### ้ซ˜็บงๅŠŸ่ƒฝ -- **ๅธ‚ๅœบๆ•ฐๆฎๆ“ไฝœ** - - ่Žทๅ–่กŒๆƒ…ใ€่ฎขๅ•็ฐฟๅ’Œ OHLCV ๆ•ฐๆฎ - - ้€š่ฟ‡ WebSocket ๅฎžๆ—ถๅธ‚ๅœบๆ•ฐๆฎๆต - - ้ซ˜็บงๅธ‚ๅœบๆ•ฐๆฎ๏ผŒๅŒ…ๅซๆทฑๅบฆๅ’Œ่šๅˆๅŠŸ่ƒฝ - -- **่ฎขๅ•็ฎก็†** - - ๅˆ›ๅปบใ€ๅ–ๆถˆๅ’Œไฟฎๆ”น่ฎขๅ• - - ๆ”ฏๆŒๅธ‚ไปทใ€้™ไปทๅ’Œๆกไปถ่ฎขๅ• - - OCO๏ผˆไธ€ๅ•ๅ–ๆถˆๅฆไธ€ๅ•๏ผ‰่ฎขๅ•ๆ”ฏๆŒ - - ๆ‰น้‡่ฎขๅ•ๆ“ไฝœ - -- **่ดฆๆˆท็ฎก็†** - - ไฝ™้ขๆŸฅ่ฏขๅ’Œ่ดฆๆˆทไฟกๆฏ - - ๅ……ๅ€ผๅ’Œๆ็Žฐๆ“ไฝœ - - ไบคๆ˜“ๅކๅฒๅ’Œ่ดฆๆœฌ่ฎฟ้—ฎ - - ๆ‰‹็ปญ่ดน็ฎก็†ๅ’Œ่ฎก็ฎ— - -- **ไบคๆ˜“ๅŠŸ่ƒฝ** - - ็Žฐ่ดงไบคๆ˜“ - - ไฟ่ฏ้‡‘ไบคๆ˜“๏ผˆๅ…จไป“ๅ’Œ้€ไป“๏ผ‰ - - ๆœŸ่ดงไบคๆ˜“ๅŠไป“ไฝ็ฎก็† - - ๆ ๆ†ๅ’Œไฟ่ฏ้‡‘็ฎก็† - -- **WebSocket ๅŠŸ่ƒฝ** - - ๅฎžๆ—ถ่ฎขๅ•็ฐฟๆ›ดๆ–ฐ - - ๅฎžๆ—ถไบคๆ˜“ๆต - - ่ดฆๆˆทไฝ™้ขๆ›ดๆ–ฐ - - ่ฎขๅ•็Šถๆ€ๆ›ดๆ–ฐ - - ๆœŸ่ดงไป“ไฝๆ›ดๆ–ฐ - -## ๐Ÿ—๏ธ ๆžถๆž„ - -้กน็›ฎ้‡‡็”จๆธ…ๆ™ฐ็š„ๆจกๅ—ๅŒ–ๅทฅไฝœ็ฉบ้—ดๆžถๆž„๏ผŒๅนถๆไพ›็ปŸไธ€็š„ Exchange trait๏ผš +| ไบคๆ˜“ๆ‰€ | ๅธ‚ๅœบๆ•ฐๆฎ | ไบคๆ˜“ API | WebSocket | +|-----------------|------|--------|-----------| +| **Binance** | โœ… | โœ… | โœ… | +| **Bitget** | โœ… | โœ… | โœ… | +| **Hyperliquid** | โœ… | โœ… | โœ… | +| **OKX** | โœ… | โœ… | โœ… | +| **Bybit** | โœ… | โœ… | โœ… | -### ้กน็›ฎ็ป“ๆž„ +> **ๅ›พไพ‹**: โœ… ๅทฒๆ”ฏๆŒ, ๐Ÿšง ๅผ€ๅ‘ไธญ -``` -ccxt-rust/ -โ”œโ”€โ”€ ccxt-core/ # ๆ ธๅฟƒ็ฑปๅž‹ใ€trait ๅ’Œ้”™่ฏฏๅค„็† -โ”‚ โ”œโ”€โ”€ types/ # Marketใ€Orderใ€Tradeใ€Ticker ็ญ‰ -โ”‚ โ”œโ”€โ”€ exchange.rs # ็ปŸไธ€ Exchange trait -โ”‚ โ”œโ”€โ”€ ws_exchange.rs # WebSocket Exchange trait -โ”‚ โ”œโ”€โ”€ error/ # ๅ…จ้ข็š„้”™่ฏฏ็ฑปๅž‹ -โ”‚ โ”œโ”€โ”€ base_exchange/ # ๅŸบ็ก€ไบคๆ˜“ๆ‰€ๅŠŸ่ƒฝ -โ”‚ โ”œโ”€โ”€ http_client/ # HTTP ๅฎขๆˆท็ซฏ๏ผˆ้‡่ฏ•ใ€็†”ๆ–ญๅ™จ๏ผ‰ -โ”‚ โ”œโ”€โ”€ ws_client/ # WebSocket ๅฎขๆˆท็ซฏ๏ผˆ่‡ชๅŠจ้‡่ฟž๏ผ‰ -โ”‚ โ”œโ”€โ”€ auth/ # ่ฎค่ฏๅ’Œ็ญพๅ -โ”‚ โ””โ”€โ”€ ... -โ”œโ”€โ”€ ccxt-exchanges/ # ไบคๆ˜“ๆ‰€็‰นๅฎšๅฎž็Žฐ -โ”‚ โ”œโ”€โ”€ binance/ # Binance ไบคๆ˜“ๆ‰€ๅฎž็Žฐ -โ”‚ โ”œโ”€โ”€ okx/ # OKX ไบคๆ˜“ๆ‰€ๅฎž็Žฐ -โ”‚ โ”œโ”€โ”€ bybit/ # Bybit ไบคๆ˜“ๆ‰€ๅฎž็Žฐ -โ”‚ โ”œโ”€โ”€ bitget/ # Bitget ไบคๆ˜“ๆ‰€ๅฎž็Žฐ -โ”‚ โ””โ”€โ”€ hyperliquid/ # Hyperliquid ไบคๆ˜“ๆ‰€ๅฎž็Žฐ -โ”œโ”€โ”€ examples/ # ๅ…จ้ข็š„ไฝฟ็”จ็คบไพ‹ -โ”œโ”€โ”€ tests/ # ้›†ๆˆๆต‹่ฏ• -โ””โ”€โ”€ docs/ # ่ฏฆ็ป†ๆ–‡ๆกฃ -``` - -### ๆจกๅ—ๅ…ณ็ณป +## ๐ŸŒŸ ๆ ธๅฟƒ็‰นๆ€ง -``` -โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -โ”‚ ๅบ”็”จ็จ‹ๅบไปฃ็  โ”‚ -โ”‚ (้€š่ฟ‡็ปŸไธ€็š„ Exchange trait ๆŽฅๅฃไฝฟ็”จไบคๆ˜“ๆ‰€) โ”‚ -โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - โ”‚ - โ–ผ -โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -โ”‚ ็ปŸไธ€ Exchange Trait โ”‚ -โ”‚ - ๆไพ›ๆ‰€ๆœ‰ไบคๆ˜“ๆ‰€็š„ๅคšๆ€ๆŽฅๅฃ โ”‚ -โ”‚ - ๅŸบไบŽ่ƒฝๅŠ›็š„ๅŠŸ่ƒฝๅ‘็Žฐ โ”‚ -โ”‚ - ๅธ‚ๅœบๆ•ฐๆฎใ€ไบคๆ˜“ใ€่ดฆๆˆท็ฎก็†ๆ–นๆณ• โ”‚ -โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - โ”‚ - โ–ผ -โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -โ”‚ ๅŸบ็ก€ไบคๆ˜“ๆ‰€ๅฑ‚ โ”‚ -โ”‚ - ๆ‰€ๆœ‰ไบคๆ˜“ๆ‰€ๅ…ฑไบซ็š„้€š็”จๅŠŸ่ƒฝ โ”‚ -โ”‚ - ๅธ‚ๅœบ็ผ“ๅญ˜ใ€็ฒพๅบฆๅค„็†ใ€็ฌฆๅท่งฃๆž โ”‚ -โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - โ”‚ - โ–ผ -โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -โ”‚ ไบคๆ˜“ๆ‰€ๅฎž็Žฐ โ”‚ -โ”‚ - ไบคๆ˜“ๆ‰€็‰นๅฎš็š„ API ๅฎขๆˆท็ซฏ โ”‚ -โ”‚ - REST ๅ’Œ WebSocket ๅฎž็Žฐ โ”‚ -โ”‚ - ่‡ชๅฎšไน‰่ฏทๆฑ‚่งฃๆžๅ’Œ่ฎค่ฏ โ”‚ -โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ -``` - -### ๆ ธๅฟƒ่ฎพ่ฎกๅŽŸๅˆ™ - -1. **ๅŸบไบŽ Trait ็š„ๆŠฝ่ฑก**๏ผš็ปŸไธ€็š„ `Exchange` trait ๆ”ฏๆŒๅคšๆ€ไฝฟ็”จ -2. **่ƒฝๅŠ›ๅ‘็Žฐ**๏ผš้€š่ฟ‡ `ExchangeCapabilities` ่ฟ›่กŒ่ฟ่กŒๆ—ถๅŠŸ่ƒฝๆฃ€ๆต‹ -3. **็ฑปๅž‹ๅฎ‰ๅ…จ**๏ผšไฝฟ็”จ `rust_decimal` ่ฟ›่กŒ้‡‘่ž่ฎก็ฎ—็š„ๅผบ็ฑปๅž‹ไฟ่ฏ -4. **้”™่ฏฏๅค„็†**๏ผšๅ…จ้ข็š„้”™่ฏฏ็ฑปๅž‹๏ผŒไฟ็•™ไธŠไธ‹ๆ–‡ -5. **ๅผ‚ๆญฅไผ˜ๅ…ˆ**๏ผšๅŸบไบŽ Tokio ๆž„ๅปบ้ซ˜ๆ•ˆๅผ‚ๆญฅๆ“ไฝœ +- **๐Ÿ›ก๏ธ ็ฑปๅž‹ๅฎ‰ๅ…จไธŽๅผ‚ๆญฅ**: ๅŸบไบŽ `Tokio` ๅ’Œ `rust_decimal` ๆž„ๅปบ๏ผŒ็กฎไฟ้ซ˜ๆ€ง่ƒฝไธŽ้‡‘่ž่ฎก็ฎ—ๅฎ‰ๅ…จใ€‚ +- **๐Ÿ”„ ็ปŸไธ€ๆŽฅๅฃ**: ๆ‰€ๆœ‰ไบคๆ˜“ๆ‰€ๅ‡ๅฎž็Žฐ็ปŸไธ€็š„ `Exchange` traitใ€‚ +- **โšก ๅฎžๆ—ถๆ•ฐๆฎ**: ๅผบๅคง็š„ WebSocket ๆ”ฏๆŒ๏ผŒๅ…ทๅค‡่‡ชๅŠจ้‡่ฟžๅŠŸ่ƒฝใ€‚ +- **๐Ÿ“ฆ ๅŠŸ่ƒฝๅ…จ้ข**: + - **่กŒๆƒ…**: Ticker, ๆทฑๅบฆๅ›พ, K็บฟ (OHLCV), ๆˆไบค่ฎฐๅฝ•ใ€‚ + - **ไบคๆ˜“**: ็Žฐ่ดง, ๆ ๆ†, ๅˆ็บฆ, ๆ‰น้‡ไธ‹ๅ•, OCOใ€‚ + - **่ดฆๆˆท**: ไฝ™้ขๆŸฅ่ฏข, ่ต„้‡‘ๅˆ’่ฝฌ, ๆ ๆ†็ฎก็†ใ€‚ ## ๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹ -**ๅˆšๆŽฅ่งฆ ccxt-rust๏ผŸ** ไปŽๆˆ‘ไปฌ็š„ [5ๅˆ†้’Ÿๅฟซ้€Ÿๅ…ฅ้—จๆŒ‡ๅ—](QUICKSTART_CN.md) ๅผ€ๅง‹ ๐Ÿ“– - -### ๅ‰็ฝฎ่ฆๆฑ‚ - -- Rust 1.91+ ๆˆ–ๆ›ด้ซ˜็‰ˆๆœฌ -- Cargo๏ผˆๆœ€ๆ–ฐ็จณๅฎš็‰ˆ๏ผ‰ - ### ๅฎ‰่ฃ… -ไฝฟ็”จๅ‘ฝไปค่กŒๆทปๅŠ ๏ผš - ```bash cargo add ccxt-rust ``` -ๆˆ–ๅœจ `Cargo.toml` ไธญๆทปๅŠ ๏ผš - -```toml -[dependencies] -ccxt-core = { path = "ccxt-core" } -ccxt-exchanges = { path = "ccxt-exchanges" } -tokio = { version = "1.35", features = ["full"] } -rust_decimal = "1.39" -futures = "0.3" -``` - ### ๅŸบๆœฌ็”จๆณ• ```rust use ccxt_exchanges::binance::Binance; use ccxt_core::exchange::Exchange; +use rust_decimal_macros::dec; +use ccxt_core::types::{OrderType, OrderSide}; #[tokio::main] async fn main() -> Result<(), Box> { - // ไฝฟ็”จๆž„ๅปบๅ™จๆจกๅผๅˆๅง‹ๅŒ–ไบคๆ˜“ๆ‰€๏ผˆๆŽจ่๏ผ‰ + // 1. ๅˆๅง‹ๅŒ– (ๅปบ่ฎฎไฝฟ็”จ็Žฏๅขƒๅ˜้‡) let exchange = Binance::builder() - .api_key("your_api_key") - .secret("your_secret") - .sandbox(false) // ไฝฟ็”จ็”Ÿไบง็Žฏๅขƒ API + .api_key(std::env::var("BINANCE_API_KEY").ok()) + .secret(std::env::var("BINANCE_SECRET").ok()) .build()?; - // ้€š่ฟ‡็ปŸไธ€็š„ Exchange trait ่Žทๅ–่กŒๆƒ… + // 2. ่Žทๅ–่กŒๆƒ… let ticker = exchange.fetch_ticker("BTC/USDT").await?; println!("BTC/USDT ไปทๆ ผ: {:?}", ticker.last); - Ok(()) + // 3. ไธ‹ๅ• (ๅฆ‚ๆไพ›ไบ† API Key) + if exchange.has_private_api() { + let order = exchange.create_order( + "BTC/USDT", + OrderType::Limit, + OrderSide::Buy, + dec!(0.001), + Some(dec!(50000)), + ).await?; + println!("ไธ‹ๅ•ๆˆๅŠŸ: {}", order.id); + } + + Ok(()) } ``` -**ๆ›ดๅคš็คบไพ‹**๏ผšๆŸฅ็œ‹ [QUICKSTART_CN.md](QUICKSTART_CN.md) ่Žทๅ–่ฏฆ็ป†ๆ•™็จ‹๏ผ +ๆ›ดๅคš WebSocket ๅ’Œ้ซ˜็บง็”จๆณ•็คบไพ‹่ฏทๆŸฅ็œ‹ [`examples/`](examples/) ็›ฎๅฝ•ใ€‚ -## ๐Ÿ“š ็คบไพ‹ - -้กน็›ฎๅŒ…ๅซ่ฆ†็›–ๆ‰€ๆœ‰ไธป่ฆๅŠŸ่ƒฝ็š„ๅ…จ้ข็คบไพ‹๏ผš - -- **`basic_usage.rs`** - ๅบ“็š„ไฝฟ็”จๅ…ฅ้—จ -- **`binance_market_data_example.rs`** - ๅธ‚ๅœบๆ•ฐๆฎๆ“ไฝœ -- **`binance_order_management_example.rs`** - ่ฎขๅ•ๅˆ›ๅปบๅ’Œ็ฎก็† -- **`binance_account_example.rs`** - ่ดฆๆˆทๆ“ไฝœ -- **`binance_margin_example.rs`** - ไฟ่ฏ้‡‘ไบคๆ˜“ -- **`binance_futures_example.rs`** - ๆœŸ่ดงไบคๆ˜“ -- **`binance_ws_example.rs`** - WebSocket ๆต -- **`binance_conditional_orders_example.rs`** - ๆกไปถ่ฎขๅ• -- **`binance_deposit_withdrawal_example.rs`** - ๅ……ๅ€ผๆ็Žฐๆ“ไฝœ - -่ฟ่กŒไปปไฝ•็คบไพ‹๏ผš - -```bash -cargo run --example basic_usage -cargo run --example binance_ws_example -``` - -## ๐Ÿšฉ ๅŠŸ่ƒฝๆ ‡ๅฟ— - -้€š่ฟ‡ๅœจ `Cargo.toml` ไธญ้€‰ๆ‹ฉๆ‰€้œ€ๅŠŸ่ƒฝๆฅไผ˜ๅŒ–ๆž„ๅปบ๏ผš - -- **`default`**: ๅฏ็”จ `rest`ใ€`websocket` ๅ’Œ `rustls-tls` -- **`rest`**: ๅฏ็”จ REST API ๆ”ฏๆŒ -- **`websocket`**: ๅฏ็”จ WebSocket ๆ”ฏๆŒ -- **`rustls-tls`**: ไฝฟ็”จ `rustls` ่ฟ›่กŒ TLS๏ผˆ้ป˜่ฎค๏ผŒๆŽจ่๏ผ‰ -- **`native-tls`**: ไฝฟ็”จๅนณๅฐๅŽŸ็”Ÿ TLS๏ผˆOpenSSL/Schannel/Secure Transport๏ผ‰ -- **`compression`**: ๅฏ็”จ HTTP ่ฏทๆฑ‚็š„ GZIP ๅŽ‹็ผฉ -- **`full`**: ๅฏ็”จๆ‰€ๆœ‰ๅŠŸ่ƒฝ - -## ๐Ÿ”ง ้…็ฝฎ +## ๐Ÿ—๏ธ ๆžถๆž„ -### ็Žฏๅขƒๅ˜้‡ +้กน็›ฎ้‡‡็”จๆจกๅ—ๅŒ–ๅทฅไฝœ็ฉบ้—ด็ป“ๆž„๏ผš -ไปŽๆจกๆฟๅˆ›ๅปบ `.env` ๆ–‡ไปถ๏ผš +- **`ccxt-core`**: ๅฎšไน‰็ปŸไธ€็š„ `Exchange` ๅ’Œ `WsExchange` traitใ€ๆ ‡ๅ‡†็ฑปๅž‹ๅŠ้”™่ฏฏๅค„็†้€ป่พ‘ใ€‚ +- **`ccxt-exchanges`**: ๅŒ…ๅซๅ…ทไฝ“ไบคๆ˜“ๆ‰€็š„ๅฎž็Žฐ (Binance, OKX ็ญ‰)ใ€‚ -```bash -cp .env.example .env -``` +## ๐Ÿšฉ ๅŠŸ่ƒฝๆ ‡ๅฟ— (Feature Flags) -ไธป่ฆ้…็ฝฎ้€‰้กน๏ผš +| ๆ ‡ๅฟ— | ่ฏดๆ˜Ž | ้ป˜่ฎคๅผ€ๅฏ | +|--------------|---------------------|------| +| `rest` | REST API ๆ”ฏๆŒ | โœ… | +| `websocket` | WebSocket ๆ”ฏๆŒ | โœ… | +| `rustls-tls` | ไฝฟ็”จ RustLS (ๆŽจ่) | โœ… | +| `native-tls` | ไฝฟ็”จ OpenSSL/็ณป็ปŸๅŽŸ็”Ÿ TLS | โŒ | -```bash -# API ๅ‡ญ่ฏ -BINANCE_API_KEY=your_api_key_here -BINANCE_API_SECRET=your_secret_here - -# ๆต‹่ฏ• -ENABLE_PRIVATE_TESTS=false -ENABLE_INTEGRATION_TESTS=false -USE_MOCK_DATA=true -TEST_SYMBOL=BTC/USDT - -# ๆ—ฅๅฟ— -RUST_LOG=info -``` - -## ๐Ÿงช ๆต‹่ฏ• +## ๐Ÿ› ๏ธ ๅผ€ๅ‘ไธŽๆต‹่ฏ• ```bash -# ่ฟ่กŒๆ‰€ๆœ‰ๆต‹่ฏ• +# ่ฟ่กŒๆต‹่ฏ• cargo test -# ่ฟ่กŒๆต‹่ฏ•ๅนถๆ˜พ็คบ่พ“ๅ‡บ -cargo test -- --nocapture - -# ่ฟ่กŒ็‰นๅฎšๆต‹่ฏ•ๅฅ—ไปถ -cargo test -p ccxt-core -cargo test -p ccxt-exchanges +# ไปฃ็ ๆฃ€ๆŸฅ +cargo clippy --all-targets -- -D warnings -# ่ฟ่กŒ้›†ๆˆๆต‹่ฏ• -cargo test --test binance_integration_test - -# ไฝฟ็”จ็œŸๅฎž API ่ฟ่กŒ๏ผˆ้œ€่ฆๅ‡ญ่ฏ๏ผ‰ -ENABLE_INTEGRATION_TESTS=true cargo test -``` - -## ๐Ÿ“– ๆ–‡ๆกฃ - -- **[API ๆ–‡ๆกฃ](docs/)** - ่ฏฆ็ป†็š„ API ๅ‚่€ƒ -- **[ๅฟซ้€Ÿๅ…ฅ้—จ](QUICKSTART_CN.md)** - 5ๅˆ†้’ŸไธŠๆ‰‹ๆŒ‡ๅ— -- **[่ดก็ŒฎๆŒ‡ๅ—](CONTRIBUTING.md)** - ่ดก็Œฎๆต็จ‹ -- **[ๆœ€ไฝณๅฎž่ทต](docs/best-practices.md)** - ไฝฟ็”จๅปบ่ฎฎ - -็”Ÿๆˆๆœฌๅœฐๆ–‡ๆกฃ๏ผš - -```bash +# ็”Ÿๆˆๆ–‡ๆกฃ cargo doc --open ``` -## ๐Ÿ› ๏ธ ๅผ€ๅ‘ - -### ๆž„ๅปบ - -```bash -# Debug ๆž„ๅปบ -cargo build - -# Release ๆž„ๅปบ๏ผˆไผ˜ๅŒ–๏ผ‰ -cargo build --release - -# ๆž„ๅปบ็‰นๅฎšๅŒ… -cargo build -p ccxt-core -cargo build -p ccxt-exchanges -``` - -### ไปฃ็ ่ดจ้‡ - -```bash -# ๆ ผๅผๅŒ–ไปฃ็  -cargo fmt - -# ่ฟ่กŒ linter -cargo clippy --all-targets --all-features - -# ไธฅๆ ผ linting๏ผˆๆ— ่ญฆๅ‘Š๏ผ‰ -cargo clippy --all-targets --all-features -- -D warnings - -# ๆฃ€ๆŸฅ็ผ–่ฏ‘ -cargo check --all-features -``` - -## ๐Ÿ” ๅฎ‰ๅ…จ +## ๐Ÿ“ ่ฎธๅฏ่ฏไธŽๆ”ฏๆŒ -- **ๆฐธ่ฟœไธ่ฆๆไบค API ๅฏ†้’ฅๆˆ–ๅฏ†้’ฅ** - ๅง‹็ปˆไฝฟ็”จ็Žฏๅขƒๅ˜้‡ -- **ๅฎ‰ๅ…จ็š„ๅ‡ญ่ฏๅญ˜ๅ‚จ** - ไฝฟ็”จ็ณป็ปŸ้’ฅๅŒ™ไธฒๆˆ–ๅŠ ๅฏ†ไฟ้™ฉๅบ“ -- **้€Ÿ็އ้™ๅˆถ** - ๅ†…็ฝฎ้€Ÿ็އ้™ๅˆถไปฅ้˜ฒๆญข API ๅฐ็ฆ -- **่พ“ๅ…ฅ้ชŒ่ฏ** - ๆ‰€ๆœ‰่พ“ๅ…ฅๅœจ API ่ฐƒ็”จๅ‰้ƒฝไผš่ขซ้ชŒ่ฏ -- **ไป… HTTPS** - ๆ‰€ๆœ‰้€šไฟกไฝฟ็”จ TLS ๅŠ ๅฏ† +MIT License. ่ฏฆ่ง [LICENSE](LICENSE). -## ๐Ÿค ่ดก็Œฎ +- **้—ฎ้ข˜ๅ้ฆˆ**: [GitHub Issues](https://github.com/Praying/ccxt-rust/issues) +- **ๆ–‡ๆกฃ**: [docs.rs](https://docs.rs/ccxt-rust) -ๆฌข่ฟŽ่ดก็Œฎ๏ผ่ฏท้ตๅพชไปฅไธ‹ๅ‡†ๅˆ™๏ผš +## โš ๏ธ ๅ…่ดฃๅฃฐๆ˜Ž -1. Fork ไป“ๅบ“ -2. ๅˆ›ๅปบ็‰นๆ€งๅˆ†ๆ”ฏ (`git checkout -b feature/amazing-feature`) -3. ้ตๅพช Rust ๆœ€ไฝณๅฎž่ทตๅ’Œ้กน็›ฎ็บฆๅฎš -4. ไธบๆ–ฐๅŠŸ่ƒฝๆทปๅŠ ๆต‹่ฏ• -5. ็กฎไฟๆ‰€ๆœ‰ๆต‹่ฏ•้€š่ฟ‡ (`cargo test`) -6. ่ฟ่กŒๆ ผๅผๅŒ–ๅ’Œ linting (`cargo fmt && cargo clippy`) -7. ๆไบคๆ›ดๆ”น (`git commit -m 'Add amazing feature'`) -8. ๆŽจ้€ๅˆฐๅˆ†ๆ”ฏ (`git push origin feature/amazing-feature`) -9. ๅˆ›ๅปบ Pull Request - -ๆŸฅ็œ‹ [CONTRIBUTING.md](CONTRIBUTING.md) ไบ†่งฃ่ฏฆๆƒ…ใ€‚ - -## ๐Ÿ“Š ๆ€ง่ƒฝ - -ไธบ้ซ˜ๆ€ง่ƒฝ่€Œๆž„ๅปบ๏ผš - -- **ๅผ‚ๆญฅ I/O**๏ผšไฝฟ็”จ Tokio ็š„้ž้˜ปๅกžๆ“ไฝœ -- **้›ถๆ‹ท่ด่งฃๆž**๏ผš้ซ˜ๆ•ˆ็š„ JSON ๅๅบๅˆ—ๅŒ– -- **่ฟžๆŽฅๆฑ **๏ผš้‡็”จ็š„ HTTP ่ฟžๆŽฅ -- **ไผ˜ๅŒ–ๆž„ๅปบ**๏ผšRelease ็‰ˆๆœฌไฝฟ็”จ LTO ๅ’Œๅ•ไปฃ็ ็”Ÿๆˆๅ•ๅ…ƒ -- **ๅŸบๅ‡†ๆต‹่ฏ•**๏ผšๅŸบไบŽ Criterion ็š„ๆ€ง่ƒฝๅŸบๅ‡† - -## ๐Ÿ› ๆ•…้šœๆŽ’้™ค - -### ๅธธ่ง้—ฎ้ข˜ - -1. **็ผ–่ฏ‘้”™่ฏฏ** - - ็กฎไฟ Rust 1.91+ ๅทฒๅฎ‰่ฃ…๏ผš`rustc --version` - - ๆ›ดๆ–ฐไพ่ต–๏ผš`cargo update` - - ๆธ…็†ๆž„ๅปบ๏ผš`cargo clean && cargo build` - -2. **API ่ฎค่ฏๅคฑ่ดฅ** - - ้ชŒ่ฏ `.env` ๆ–‡ไปถไธญ็š„ API ๅฏ†้’ฅ - - ๆฃ€ๆŸฅไบคๆ˜“ๆ‰€ไธŠ็š„ API ๅฏ†้’ฅๆƒ้™ - - ็กฎไฟ็ณป็ปŸๆ—ถ้’ŸๅทฒๅŒๆญฅ - -3. **้€Ÿ็އ้™ๅˆถ** - - ้™ไฝŽ่ฏทๆฑ‚้ข‘็އ - - ไฝฟ็”จ WebSocket ่Žทๅ–ๅฎžๆ—ถๆ•ฐๆฎ - - ๆฃ€ๆŸฅไบคๆ˜“ๆ‰€็‰นๅฎš็š„้€Ÿ็އ้™ๅˆถ - -ๆ›ดๅคšๅธฎๅŠฉ๏ผŒ่ฏทๆŸฅ็œ‹ [ๆ–‡ๆกฃ](docs/) ๆˆ–ๆไบค issueใ€‚ - -## ๐Ÿ“ ่ฎธๅฏ่ฏ - -ๆœฌ้กน็›ฎ้‡‡็”จ MIT ่ฎธๅฏ่ฏ - ่ฏฆ่ง [LICENSE](LICENSE) ๆ–‡ไปถ - -## ๐Ÿ™ ่‡ด่ฐข - -- ๅ—ๅŽŸๅง‹ [CCXT](https://github.com/ccxt/ccxt) ๅบ“ๅฏๅ‘ -- ไฝฟ็”จไบ†ๅ‡บ่‰ฒ็š„ Rust ็”Ÿๆ€็ณป็ปŸๅบ“ -- ็คพๅŒบ่ดก็Œฎ่€…ๅ’Œๆต‹่ฏ•่€… - -## ๐Ÿ“ž ่”็ณปไธŽๆ”ฏๆŒ - -- **้—ฎ้ข˜**: [GitHub Issues](https://github.com/Praying/ccxt-rust/issues) -- **่ฎจ่ฎบ**: [GitHub Discussions](https://github.com/Praying/ccxt-rust/discussions) -- **ๆ–‡ๆกฃ**: [้กน็›ฎๆ–‡ๆกฃ](docs/) +ๆœฌ้กน็›ฎไป…ไพ›ๅญฆไน ๅ’Œ็ ”็ฉถไฝฟ็”จใ€‚ไฝœ่€…ๅ’Œ่ดก็Œฎ่€…ไธๅฏนๅ› ไฝฟ็”จๆœฌ่ฝฏไปถ่€Œไบง็”Ÿ็š„ไปปไฝ•่ดขๅŠกๆŸๅคฑๆˆ–ๆŸๅฎณ่ดŸ่ดฃใ€‚ๅŠ ๅฏ†่ดงๅธไบคๆ˜“้ฃŽ้™ฉๆž้ซ˜๏ผŒ่ฏท่ฐจๆ…Žไบคๆ˜“ใ€‚ --- - -**็Šถๆ€**: ๐Ÿšง ็งฏๆžๅผ€ๅ‘ไธญ | **็‰ˆๆœฌ**: 0.1.2 | **ๆ›ดๆ–ฐ**: 2026-01 - -โš ๏ธ **ๆณจๆ„**: ๆญคๅบ“ๆญฃๅœจ็งฏๆžๅผ€ๅ‘ไธญใ€‚ๅœจ v1.0 ไน‹ๅ‰ API ๅฏ่ƒฝไผšๅ˜ๅŒ–ใ€‚ๆš‚ไธๆŽจ่็”Ÿไบงไฝฟ็”จใ€‚ +**็Šถๆ€**: ๐Ÿšง ๅผ€ๅ‘ไธญ (v0.1.3) | **ๆ่ต  (BSC)**: `0x8e5d858f92938b028065d39450421d0e080d15f7` diff --git a/ccxt-core/Cargo.toml b/ccxt-core/Cargo.toml index efecc3d..586bfc0 100644 --- a/ccxt-core/Cargo.toml +++ b/ccxt-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ccxt-core" -version = "0.1.2" +version = "0.1.3" edition = "2024" rust-version = "1.91" authors = ["Praying"] diff --git a/ccxt-exchanges/Cargo.toml b/ccxt-exchanges/Cargo.toml index ddc47f5..3cd77d4 100644 --- a/ccxt-exchanges/Cargo.toml +++ b/ccxt-exchanges/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ccxt-exchanges" -version = "0.1.2" +version = "0.1.3" edition = "2024" rust-version = "1.91" authors = ["Praying"] @@ -8,7 +8,7 @@ license = "MIT" description = "Exchange implementations for CCXT Rust" [dependencies] -ccxt-core = { path = "../ccxt-core" , version = "0.1.2"} +ccxt-core = { path = "../ccxt-core", version = "0.1.3" } # Async runtime tokio = { workspace = true }