mirror of
https://github.com/discountry/ritmex-bot.git
synced 2026-09-09 16:28:06 +00:00
516 lines
14 KiB
Markdown
516 lines
14 KiB
Markdown
# EdgeX Python SDK
|
|
|
|
A Python SDK for interacting with the EdgeX Exchange API. This SDK provides a comprehensive interface to the EdgeX API, allowing you to easily integrate EdgeX functionality into your Python applications.
|
|
|
|
## Features
|
|
|
|
- **Complete API Coverage**: Access all EdgeX API endpoints
|
|
- **WebSocket Support**: Real-time data streaming
|
|
- **Async/Await**: Modern Python async interface
|
|
- **Type Hints**: Comprehensive type annotations for better IDE support
|
|
- **Error Handling**: Proper error handling and validation
|
|
- **Pagination**: Support for paginated API endpoints
|
|
- **Authentication**: Automatic request signing
|
|
|
|
## Installation
|
|
|
|
### From PyPI
|
|
|
|
```bash
|
|
pip install edgex-python-sdk
|
|
```
|
|
|
|
### From Source
|
|
|
|
```bash
|
|
git clone https://github.com/edgex-Tech/edgex-python-sdk.git
|
|
cd edgex-python-sdk
|
|
pip install -e .
|
|
```
|
|
|
|
### Using Requirements Files
|
|
|
|
For production use:
|
|
```bash
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
For development (includes testing and linting tools):
|
|
```bash
|
|
pip install -r requirements-dev.txt
|
|
```
|
|
|
|
### Virtual Environment (Recommended)
|
|
|
|
It's recommended to use a virtual environment:
|
|
|
|
```bash
|
|
# Create virtual environment
|
|
python3 -m venv venv
|
|
|
|
# Activate virtual environment
|
|
source venv/bin/activate # On Windows: venv\Scripts\activate
|
|
|
|
# Install dependencies
|
|
pip install -r requirements.txt
|
|
|
|
# Or install in development mode
|
|
pip install -e .
|
|
```
|
|
|
|
## Quick Start
|
|
|
|
```python
|
|
import asyncio
|
|
import os
|
|
from edgex_sdk import Client, OrderSide
|
|
|
|
async def main():
|
|
# Create a new client
|
|
client = Client(
|
|
base_url="https://pro.edgex.exchange", # Use https://testnet.edgex.exchange for testnet
|
|
account_id=12345, # Your account ID
|
|
stark_private_key="your-stark-private-key" # Your private key
|
|
)
|
|
|
|
# Get server time
|
|
server_time = await client.get_server_time()
|
|
print(f"Server Time: {server_time}")
|
|
|
|
# Get exchange metadata
|
|
metadata = await client.get_metadata()
|
|
print(f"Available contracts: {len(metadata.get('data', {}).get('contractList', []))}")
|
|
|
|
# Get account assets
|
|
assets = await client.get_account_asset()
|
|
print(f"Account Assets: {assets}")
|
|
|
|
# Get account positions
|
|
positions = await client.get_account_positions()
|
|
print(f"Account Positions: {positions}")
|
|
|
|
# Get 24-hour market data for BNB2USDT (contract ID: 10000004)
|
|
quote = await client.get_24_hour_quote("10000004")
|
|
print(f"BNB2USDT Price: {quote}")
|
|
|
|
# Create a limit order (uncomment to place real order)
|
|
# order = await client.create_limit_order(
|
|
# contract_id="10000004", # BNB2USDT
|
|
# size="0.01",
|
|
# price="600.00",
|
|
# side=OrderSide.BUY
|
|
# )
|
|
# print(f"Order created: {order}")
|
|
|
|
# Run the async function
|
|
asyncio.run(main())
|
|
```
|
|
|
|
## Architecture
|
|
|
|
The SDK is organized into modules that correspond to the EdgeX API structure:
|
|
|
|
```
|
|
edgex_sdk/
|
|
├── __init__.py
|
|
├── client.py # Main client
|
|
├── account/ # Account API
|
|
├── asset/ # Asset API
|
|
├── funding/ # Funding API
|
|
├── internal/ # Internal utilities
|
|
├── metadata/ # Metadata API
|
|
├── order/ # Order API
|
|
├── quote/ # Quote API
|
|
├── transfer/ # Transfer API
|
|
└── ws/ # WebSocket API
|
|
```
|
|
|
|
## Available APIs
|
|
|
|
The SDK currently supports the following API modules:
|
|
|
|
- **Account API**: Manage account positions, retrieve position transactions, and handle collateral transactions
|
|
- Get account positions
|
|
- Get position by contract ID
|
|
- Get position transaction history
|
|
- Get collateral transaction details
|
|
- Update leverage settings
|
|
|
|
- **Asset API**: Handle asset management and withdrawals
|
|
- Get asset orders with pagination
|
|
- Get coin rates
|
|
- Manage withdrawals (normal, cross-chain, and fast)
|
|
- Get withdrawal records and sign information
|
|
- Check withdrawable amounts
|
|
|
|
- **Funding API**: Manage funding operations and account balance
|
|
- Handle funding transactions
|
|
- Manage funding accounts
|
|
- Get funding transaction history
|
|
|
|
- **Metadata API**: Access exchange system information
|
|
- Get server time
|
|
- Get exchange metadata (trading pairs, contracts, etc.)
|
|
|
|
- **Order API**: Comprehensive order management
|
|
- Create and cancel orders
|
|
- Get active orders
|
|
- Get order fill transactions
|
|
- Calculate maximum order sizes
|
|
- Manage order history
|
|
|
|
- **Quote API**: Access market data and pricing
|
|
- Get multi-contract K-line data
|
|
- Get order book depth
|
|
- Access real-time market quotes
|
|
- Get 24-hour ticker data
|
|
|
|
- **Transfer API**: Handle asset transfers
|
|
- Create transfer out orders
|
|
- Get transfer records (in/out)
|
|
- Check available withdrawal amounts
|
|
- Manage transfer history
|
|
|
|
- **WebSocket API**: Real-time data streaming
|
|
- Market data (tickers, K-lines, order book, trades)
|
|
- Account updates
|
|
- Order updates
|
|
- Position updates
|
|
|
|
## WebSocket Support
|
|
|
|
The SDK provides a WebSocket manager for handling real-time data:
|
|
|
|
```python
|
|
import asyncio
|
|
from edgex_sdk import WebSocketManager
|
|
|
|
async def main():
|
|
# Create a WebSocket manager
|
|
ws_manager = WebSocketManager(
|
|
base_url="wss://quote.edgex.exchange", # Use wss://quote-testnet.edgex.exchange for testnet
|
|
account_id=12345,
|
|
stark_pri_key="your-stark-private-key"
|
|
)
|
|
|
|
# Define message handlers
|
|
def ticker_handler(message):
|
|
print(f"Ticker Update: {message}")
|
|
|
|
def kline_handler(message):
|
|
print(f"K-line Update: {message}")
|
|
|
|
# Connect to public WebSocket for market data
|
|
ws_manager.connect_public()
|
|
|
|
# Subscribe to real-time updates for BNB2USDT (contract ID: 10000004)
|
|
ws_manager.subscribe_ticker("10000004", ticker_handler)
|
|
ws_manager.subscribe_kline("10000004", "1m", kline_handler)
|
|
|
|
# Connect to private WebSocket for account updates
|
|
ws_manager.connect_private()
|
|
|
|
# Wait for updates
|
|
await asyncio.sleep(30)
|
|
|
|
# Disconnect all connections
|
|
ws_manager.disconnect_all()
|
|
|
|
asyncio.run(main())
|
|
```
|
|
|
|
## Signing Adapters
|
|
|
|
The SDK provides a flexible signing mechanism through signing adapters. **StarkExSigningAdapter is used by default**, so you don't need to explicitly create one:
|
|
|
|
```python
|
|
from edgex_sdk import Client
|
|
|
|
# Create a client (uses StarkExSigningAdapter by default)
|
|
client = Client(
|
|
base_url="https://pro.edgex.exchange", # Use https://testnet.edgex.exchange for testnet
|
|
account_id=12345,
|
|
stark_private_key="your-stark-private-key"
|
|
)
|
|
```
|
|
|
|
If you need to use a custom signing adapter, you can still provide one:
|
|
|
|
```python
|
|
from edgex_sdk import Client, StarkExSigningAdapter
|
|
|
|
# Create a custom signing adapter (optional)
|
|
signing_adapter = StarkExSigningAdapter()
|
|
|
|
# Create a client with a custom signing adapter
|
|
client = Client(
|
|
base_url="https://pro.edgex.exchange", # Use https://testnet.edgex.exchange for testnet
|
|
account_id=12345,
|
|
stark_private_key="your-stark-private-key",
|
|
signing_adapter=signing_adapter
|
|
)
|
|
```
|
|
|
|
The SDK includes the following signing adapters:
|
|
|
|
- **StarkExSigningAdapter** (default): Full implementation using StarkWare cryptographic operations for production use
|
|
|
|
You can also create your own signing adapter by implementing the `SigningAdapter` interface if you need custom cryptographic operations.
|
|
|
|
## Error Handling
|
|
|
|
The SDK provides proper error handling for API requests:
|
|
|
|
```python
|
|
import asyncio
|
|
from edgex_sdk import Client, OrderSide
|
|
|
|
async def main():
|
|
client = Client(
|
|
base_url="https://pro.edgex.exchange", # Use https://testnet.edgex.exchange for testnet
|
|
account_id=12345,
|
|
stark_private_key="your-stark-private-key"
|
|
)
|
|
|
|
try:
|
|
# Create a limit order for BNB2USDT
|
|
order = await client.create_limit_order(
|
|
contract_id="10000004", # BNB2USDT
|
|
size="0.01",
|
|
price="600.00",
|
|
side=OrderSide.BUY
|
|
)
|
|
print(f"Order created: {order}")
|
|
|
|
# Cancel the order
|
|
from edgex_sdk import CancelOrderParams
|
|
cancel_params = CancelOrderParams(
|
|
order_id=order.get("data", {}).get("orderId")
|
|
)
|
|
cancel_result = await client.cancel_order(cancel_params)
|
|
print(f"Order cancelled: {cancel_result}")
|
|
|
|
except ValueError as e:
|
|
print(f"Failed to create/cancel order: {str(e)}")
|
|
except Exception as e:
|
|
print(f"Unexpected error: {str(e)}")
|
|
|
|
asyncio.run(main())
|
|
```
|
|
|
|
## Pagination
|
|
|
|
Many API endpoints support pagination:
|
|
|
|
```python
|
|
import asyncio
|
|
from edgex_sdk import Client, GetActiveOrderParams
|
|
|
|
async def main():
|
|
client = Client(
|
|
base_url="https://pro.edgex.exchange", # Use https://testnet.edgex.exchange for testnet
|
|
account_id=12345,
|
|
stark_private_key="your-stark-private-key"
|
|
)
|
|
|
|
# Create pagination parameters
|
|
params = GetActiveOrderParams(
|
|
size="10",
|
|
offset_data=""
|
|
)
|
|
|
|
# Get active orders
|
|
orders = await client.get_active_orders(params)
|
|
print(f"Active orders: {orders}")
|
|
|
|
# Get next page if available
|
|
if orders.get("data", {}).get("hasNext"):
|
|
params.offset_data = orders.get("data", {}).get("offsetData")
|
|
next_page = await client.get_active_orders(params)
|
|
print(f"Next page: {next_page}")
|
|
|
|
asyncio.run(main())
|
|
```
|
|
|
|
## API Examples
|
|
|
|
### Market Data
|
|
|
|
```python
|
|
from edgex_sdk import Client, GetKLineParams, GetOrderBookDepthParams
|
|
|
|
# Get 24-hour market quotes for BNB2USDT (contract ID: 10000004)
|
|
quote = await client.get_24_hour_quote("10000004")
|
|
print(f"Current price: {quote}")
|
|
|
|
# Get K-line data for BTCUSDT (contract ID: 10000001)
|
|
kline_params = GetKLineParams(
|
|
contract_id="10000001", # BTCUSDT
|
|
interval="1m",
|
|
size="10"
|
|
)
|
|
klines = await client.quote.get_k_line(kline_params)
|
|
print(f"K-lines: {klines}")
|
|
|
|
# Get order book depth for ETHUSDT (contract ID: 10000002)
|
|
depth_params = GetOrderBookDepthParams(
|
|
contract_id="10000002", # ETHUSDT
|
|
limit=10
|
|
)
|
|
depth = await client.quote.get_order_book_depth(depth_params)
|
|
print(f"Order book: {depth}")
|
|
```
|
|
|
|
### Account Management
|
|
|
|
```python
|
|
# Get account assets
|
|
assets = await client.get_account_asset()
|
|
print(f"Account assets: {assets}")
|
|
|
|
# Get account positions
|
|
positions = await client.get_account_positions()
|
|
print(f"Positions: {positions}")
|
|
|
|
# Get position transactions
|
|
from edgex_sdk import GetPositionTransactionPageParams
|
|
tx_params = GetPositionTransactionPageParams(
|
|
size="10",
|
|
offset_data=""
|
|
)
|
|
transactions = await client.account.get_position_transaction_page(tx_params)
|
|
print(f"Transactions: {transactions}")
|
|
```
|
|
|
|
### Order Management
|
|
|
|
```python
|
|
from edgex_sdk import OrderSide, CreateOrderParams, CancelOrderParams
|
|
|
|
# Create a limit order for BNBUSDT
|
|
order = await client.create_limit_order(
|
|
contract_id="10000004", # BNBUSDT
|
|
size="0.01",
|
|
price="600.00",
|
|
side=OrderSide.BUY
|
|
)
|
|
print(f"Order created: {order}")
|
|
|
|
# Get maximum order size for BNBUSDT
|
|
max_size = await client.get_max_order_size("10000004", 600.00)
|
|
print(f"Max order size: {max_size}")
|
|
|
|
# Cancel an order
|
|
cancel_params = CancelOrderParams(
|
|
order_id=order.get("data", {}).get("orderId")
|
|
)
|
|
cancel_result = await client.cancel_order(cancel_params)
|
|
print(f"Order cancelled: {cancel_result}")
|
|
```
|
|
|
|
### Contract IDs
|
|
|
|
EdgeX uses numeric contract IDs instead of symbol-based identifiers. Here are some common contract mappings:
|
|
|
|
| Contract ID | Symbol | Tick Size |
|
|
|-------------|---------------|-----------|
|
|
| 10000001 | BTCUSDT | 0.1 |
|
|
| 10000002 | ETHUSDT | 0.01 |
|
|
| 10000003 | SOLUSDT | 0.01 |
|
|
|
|
To get the complete list of available contracts:
|
|
|
|
```python
|
|
metadata = await client.get_metadata()
|
|
contracts = metadata.get("data", {}).get("contractList", [])
|
|
for contract in contracts:
|
|
print(f"ID: {contract['contractId']} - {contract['contractName']}")
|
|
```
|
|
|
|
For more detailed examples, please refer to the [examples](examples) directory.
|
|
|
|
## Testing
|
|
|
|
The SDK includes comprehensive test coverage with multiple test suites:
|
|
|
|
### Unit Tests
|
|
```bash
|
|
# Run unit tests (no API credentials required)
|
|
python -m pytest tests/test_client.py tests/test_starkex_signing_adapter.py -v
|
|
```
|
|
|
|
### Public API Tests
|
|
```bash
|
|
# Run public endpoint tests (no authentication required)
|
|
python run_public_tests.py
|
|
```
|
|
|
|
### Mock Integration Tests
|
|
```bash
|
|
# Run mock tests (test structure without real API calls)
|
|
python run_mock_tests.py
|
|
```
|
|
|
|
### Full Integration Tests
|
|
```bash
|
|
# Run full integration tests (requires real API credentials)
|
|
python run_integration_tests.py
|
|
```
|
|
|
|
### All Tests
|
|
```bash
|
|
# Run all available tests
|
|
python run_tests.py
|
|
```
|
|
|
|
For more testing information, see [TESTING.md](TESTING.md).
|
|
|
|
## Environment Variables
|
|
|
|
For testing and development, you can set the following environment variables or create a `.env` file:
|
|
|
|
```bash
|
|
# API Configuration
|
|
EDGEX_BASE_URL=https://pro.edgex.exchange # Use https://testnet.edgex.exchange for testnet
|
|
EDGEX_WS_URL=wss://quote.edgex.exchange # Use wss://quote-testnet.edgex.exchange for testnet
|
|
|
|
# Account Credentials
|
|
EDGEX_ACCOUNT_ID=12345
|
|
EDGEX_STARK_PRIVATE_KEY=your-stark-private-key
|
|
|
|
# Signing Configuration
|
|
EDGEX_SIGNING_ADAPTER=starkex
|
|
```
|
|
|
|
Then load them in your code:
|
|
|
|
```python
|
|
import os
|
|
from dotenv import load_dotenv
|
|
from edgex_sdk import Client
|
|
|
|
# Load environment variables from .env file
|
|
load_dotenv()
|
|
|
|
client = Client(
|
|
base_url=os.getenv("EDGEX_BASE_URL"),
|
|
account_id=int(os.getenv("EDGEX_ACCOUNT_ID")),
|
|
stark_private_key=os.getenv("EDGEX_STARK_PRIVATE_KEY")
|
|
)
|
|
```
|
|
|
|
## Documentation
|
|
|
|
For detailed API documentation, please refer to the [EdgeX API documentation](https://docs.edgex.exchange).
|
|
|
|
## Contributing
|
|
|
|
1. Fork the repository
|
|
2. Create your feature branch (`git checkout -b feature/my-new-feature`)
|
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
4. Push to the branch (`git push origin feature/my-new-feature`)
|
|
5. Create a new Pull Request
|
|
|
|
## License
|
|
|
|
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. |