@neabyte/candlestick-cli
Version:
Beautiful terminal candlestick charts with real-time trading data. Create stunning ASCII art charts directly in your terminal with support for live market data, custom colors, and professional trading visualization.
423 lines (309 loc) • 9.93 kB
Markdown
# 📊 Market Data Integration
Complete guide for integrating real-time market data using CCXT library.
## 🚀 Overview
Candlestick-CLI provides seamless integration with cryptocurrency exchanges through the CCXT library. The `CCXTProvider` class handles all market data fetching, validation, and processing with comprehensive error handling.
## 📦 Installation
CCXT is included as a dependency:
```bash
npm install @neabyte/candlestick-cli
```
## 💻 Basic Usage
### Import CCXTProvider
```typescript
import { CCXTProvider } from '@neabyte/candlestick-cli'
```
### Create Provider Instance
```typescript
const provider = new CCXTProvider()
```
The provider is automatically configured for Binance futures trading with rate limiting enabled.
## 📊 Data Fetching Methods
### `fetchOHLCV(symbol, timeframe, limit)`
Fetch OHLCV data from the exchange.
**Parameters:**
- `symbol?: string` - Trading pair (default: 'BTC/USDT')
- `timeframe?: string` - Time interval (default: '1h')
- `limit?: number` - Number of candles (default: 1000)
**Returns:** `Promise<Candles>`
**Example:**
```typescript
const provider = new CCXTProvider()
// Basic usage
const data = await provider.fetchOHLCV('BTC/USDT', '4h', 200)
// With defaults
const data = await provider.fetchOHLCV() // BTC/USDT, 1h, 1000 candles
```
### `fetch4H(symbol, limit)`
Convenience method for 4-hour timeframe data.
**Parameters:**
- `symbol?: string` - Trading pair (default: 'BTC/USDT')
- `limit?: number` - Number of candles (default: 500)
**Returns:** `Promise<Candles>`
**Example:**
```typescript
const provider = new CCXTProvider()
// Fetch 4-hour data
const data = await provider.fetch4H('BTC/USDT', 100)
const ethData = await provider.fetch4H('ETH/USDT', 200)
```
### `fetch1D(symbol, limit)`
Convenience method for 1-day timeframe data.
**Parameters:**
- `symbol?: string` - Trading pair (default: 'BTC/USDT')
- `limit?: number` - Number of candles (default: 200)
**Returns:** `Promise<Candles>`
**Example:**
```typescript
const provider = new CCXTProvider()
// Fetch daily data
const data = await provider.fetch1D('BTC/USDT', 50)
const ethData = await provider.fetch1D('ETH/USDT', 100)
```
## 💰 Market Information
### `getLatestPrice(symbol)`
Get the latest price for a trading pair.
**Parameters:**
- `symbol?: string` - Trading pair (default: 'BTC/USDT')
**Returns:** `Promise<number>`
**Example:**
```typescript
const provider = new CCXTProvider()
const price = await provider.getLatestPrice('BTC/USDT')
console.log(`Current BTC price: $${price}`)
const ethPrice = await provider.getLatestPrice('ETH/USDT')
console.log(`Current ETH price: $${ethPrice}`)
```
### `getMarketInfo(symbol)`
Get detailed market information for a trading pair.
**Parameters:**
- `symbol?: string` - Trading pair (default: 'BTC/USDT')
**Returns:** `Promise<MarketInfo>`
**MarketInfo Interface:**
```typescript
interface MarketInfo {
symbol: string
base: string
quote: string
precision: Record<string, unknown>
limits: Record<string, unknown>
}
```
**Example:**
```typescript
const provider = new CCXTProvider()
const info = await provider.getMarketInfo('BTC/USDT')
console.log(`Symbol: ${info.symbol}`)
console.log(`Base: ${info.base}`)
console.log(`Quote: ${info.quote}`)
```
## 🕒 Supported Timeframes
| Timeframe | Description | Use Case |
|-----------|-------------|----------|
| `1m` | 1 minute | High-frequency trading |
| `3m` | 3 minutes | Short-term analysis |
| `5m` | 5 minutes | Intraday trading |
| `15m` | 15 minutes | Swing trading |
| `30m` | 30 minutes | Medium-term analysis |
| `1h` | 1 hour | Day trading |
| `2h` | 2 hours | Short-term trends |
| `4h` | 4 hours | Medium-term trends |
| `6h` | 6 hours | Position trading |
| `8h` | 8 hours | Extended analysis |
| `12h` | 12 hours | Long-term analysis |
| `1d` | 1 day | Daily analysis |
| `3d` | 3 days | Weekly analysis |
| `1w` | 1 week | Monthly analysis |
| `1M` | 1 month | Long-term analysis |
## 🏭 Perpetual Futures
The provider supports perpetual futures trading pairs with the `:USDT` suffix:
```typescript
const provider = new CCXTProvider()
// Perpetual futures
const btcFutures = await provider.fetch4H('BTC/USDT:USDT', 100)
const ethFutures = await provider.fetch1D('ETH/USDT:USDT', 50)
// Spot trading
const btcSpot = await provider.fetch4H('BTC/USDT', 100)
```
## 🔄 Error Handling
The provider includes comprehensive error handling for various scenarios:
### MarketDataError
Thrown when market data fetching fails:
```typescript
import { MarketDataError } from '@neabyte/candlestick-cli'
try {
const data = await provider.fetchOHLCV('BTC/USDT', '4h', 100)
} catch (error) {
if (error instanceof MarketDataError) {
console.error('Market data error:', error.message)
console.error('Symbol:', error.symbol)
console.error('Timeframe:', error.timeframe)
}
}
```
### Common Error Scenarios
- **Network errors**: Connection issues or timeouts
- **Rate limiting**: Exchange API rate limits exceeded
- **Invalid symbols**: Unsupported trading pairs
- **Invalid timeframes**: Unsupported time intervals
- **Data validation**: Malformed OHLCV data
## 📈 Data Validation
The provider automatically validates all fetched data:
### OHLC Validation
- Ensures high ≥ low for each candle
- Validates open and close prices
- Checks for reasonable price ranges
### Volume Validation
- Validates volume data is present
- Ensures volume values are positive
- Checks for reasonable volume ranges
### Timestamp Validation
- Ensures timestamps are in milliseconds
- Validates chronological order
- Checks for reasonable time ranges
## 🚀 Advanced Usage
### Custom Error Handling
```typescript
const provider = new CCXTProvider()
async function fetchWithRetry(symbol: string, attempts = 3) {
for (let i = 0; i < attempts; i++) {
try {
return await provider.fetch4H(symbol, 100)
} catch (error) {
if (i === attempts - 1) throw error
console.log(`Attempt ${i + 1} failed, retrying...`)
await new Promise(resolve => setTimeout(resolve, 1000))
}
}
}
const data = await fetchWithRetry('BTC/USDT')
```
### Multiple Symbols
```typescript
const provider = new CCXTProvider()
async function fetchMultipleSymbols(symbols: string[]) {
const results = await Promise.allSettled(
symbols.map(symbol => provider.fetch4H(symbol, 50))
)
return results.map((result, index) => ({
symbol: symbols[index],
data: result.status === 'fulfilled' ? result.value : null,
error: result.status === 'rejected' ? result.reason : null
}))
}
const results = await fetchMultipleSymbols(['BTC/USDT', 'ETH/USDT', 'ADA/USDT'])
```
### Real-time Price Monitoring
```typescript
const provider = new CCXTProvider()
async function monitorPrice(symbol: string, interval: number = 5000) {
while (true) {
try {
const price = await provider.getLatestPrice(symbol)
console.log(`${symbol}: $${price}`)
await new Promise(resolve => setTimeout(resolve, interval))
} catch (error) {
console.error(`Error fetching ${symbol} price:`, error.message)
await new Promise(resolve => setTimeout(resolve, interval))
}
}
}
// Monitor BTC price every 5 seconds
monitorPrice('BTC/USDT', 5000)
```
## 📊 Data Structure
### Candle Format
Each candle contains:
```typescript
interface Candle {
open: number // Opening price
high: number // Highest price
low: number // Lowest price
close: number // Closing price
volume: number // Trading volume
timestamp: number // Unix timestamp in milliseconds
type: CandleType // 1 for bullish, -1 for bearish
}
```
### Market Data Format
Raw market data from exchange:
```typescript
interface MarketData {
open: number
high: number
low: number
close: number
volume: number
timestamp: number
}
```
## 🔧 Configuration
### Exchange Settings
The provider is pre-configured for Binance futures:
```typescript
// Default configuration
{
enableRateLimit: true,
options: {
defaultType: 'future'
}
}
```
### Rate Limiting
Rate limiting is enabled by default to prevent API abuse. The provider automatically handles:
- Request throttling
- Rate limit headers
- Exponential backoff
- Retry logic
## 📝 Examples
### Complete Chart with Live Data
```typescript
import { Chart, CCXTProvider } from '@neabyte/candlestick-cli'
async function createLiveChart() {
const provider = new CCXTProvider()
const data = await provider.fetch4H('BTC/USDT', 100)
const chart = new Chart(data, {
title: 'BTC/USDT 4H Live Chart',
width: 120,
height: 30
})
await chart.draw()
}
createLiveChart().catch(console.error)
```
### Watch Mode with Real-time Updates
```typescript
import { Chart, CCXTProvider } from '@neabyte/candlestick-cli'
async function watchChart(symbol: string, interval: number = 30000) {
const provider = new CCXTProvider()
const chart = new Chart([], { title: `${symbol} Live` })
while (true) {
try {
const data = await provider.fetch4H(symbol, 50)
chart.updateCandles(data, true)
await chart.draw()
await new Promise(resolve => setTimeout(resolve, interval))
} catch (error) {
console.error('Error updating chart:', error.message)
await new Promise(resolve => setTimeout(resolve, interval))
}
}
}
watchChart('BTC/USDT', 30000) // Update every 30 seconds
```
### Export Live Data
```typescript
import { Chart, CCXTProvider, exportToImage } from '@neabyte/candlestick-cli'
async function exportLiveChart() {
const provider = new CCXTProvider()
const data = await provider.fetch1D('ETH/USDT', 30)
const chart = new Chart(data, {
title: 'ETH/USDT Daily Chart'
})
await exportToImage(chart, {
outputPath: 'eth-chart.png',
background: 'dark',
scale: 2
})
}
exportLiveChart().catch(console.error)
```