Golang加密市场数据聚合工具 - Cryptogalaxy多交易所行情抓取方案

Golang加密市场数据聚合工具 - Cryptogalaxy多交易所行情抓取方案 大家好,我是 Pavan。我刚刚创建了一个名为 Cryptogalaxy 的开源项目,通过它你可以从多个交易所获取任何加密货币的行情和交易数据,数据通过 REST / WebSocket 传输,并可保存到多种存储系统中。

目前支持的交易所:FTX、Coinbase Pro、Binance、Bitfinex、HBTC。

目前支持的存储系统:终端输出、MySQL、Elastic Search。

应用的 GitHub 链接:https://github.com/milkywaybrain/cryptogalaxy

欢迎提供任何反馈。

谢谢。


更多关于Golang加密市场数据聚合工具 - Cryptogalaxy多交易所行情抓取方案的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang加密市场数据聚合工具 - Cryptogalaxy多交易所行情抓取方案的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个非常实用的项目,特别是在需要整合多交易所数据时。Cryptogalaxy 的设计思路很清晰,通过统一的接口聚合不同交易所的 REST 和 WebSocket 数据流,并支持多种存储后端,这大大简化了行情数据获取的复杂性。

从代码结构来看,项目采用了模块化设计,每个交易所都有独立的适配器,这使得扩展新的交易所相对容易。以下是一个简化的示例,展示如何扩展一个新的交易所适配器:

// 假设我们要添加 Kraken 交易所支持
package kraken

import (
    "context"
    "encoding/json"
    "github.com/milkywaybrain/cryptogalaxy/internal/exchange"
)

type Kraken struct {
    config exchange.Config
}

func New(cfg exchange.Config) *Kraken {
    return &Kraken{config: cfg}
}

func (k *Kraken) GetTicker(ctx context.Context, pair string) (*exchange.Ticker, error) {
    // 实现 Kraken REST API 调用
    // ...
    return &exchange.Ticker{
        Exchange: "kraken",
        Pair:     pair,
        Price:    45000.50,
        Volume:   1250.75,
    }, nil
}

func (k *Kraken) StreamTrades(ctx context.Context, pair string, ch chan<- exchange.Trade) error {
    // 实现 Kraken WebSocket 连接
    // ...
    ch <- exchange.Trade{
        Exchange: "kraken",
        Pair:     pair,
        Price:    45000.25,
        Amount:   0.5,
        Side:     "buy",
    }
    return nil
}

存储系统的扩展也很直观。例如添加 PostgreSQL 支持:

package postgres

import (
    "database/sql"
    _ "github.com/lib/pq"
    "github.com/milkywaybrain/cryptogalaxy/internal/storage"
)

type PostgresStore struct {
    db *sql.DB
}

func New(connStr string) (*PostgresStore, error) {
    db, err := sql.Open("postgres", connStr)
    if err != nil {
        return nil, err
    }
    return &PostgresStore{db: db}, nil
}

func (p *PostgresStore) SaveTicker(ticker storage.Ticker) error {
    _, err := p.db.Exec(
        "INSERT INTO tickers (exchange, pair, price, volume, timestamp) VALUES ($1, $2, $3, $4, $5)",
        ticker.Exchange, ticker.Pair, ticker.Price, ticker.Volume, ticker.Timestamp,
    )
    return err
}

func (p *PostgresStore) SaveTrade(trade storage.Trade) error {
    _, err := p.db.Exec(
        "INSERT INTO trades (exchange, pair, price, amount, side, timestamp) VALUES ($1, $2, $3, $4, $5, $6)",
        trade.Exchange, trade.Pair, trade.Price, trade.Amount, trade.Side, trade.Timestamp,
    )
    return err
}

项目在处理不同交易所的 API 差异方面做得很好,比如统一了交易对格式、处理了不同数据字段的映射。WebSocket 连接管理部分的重连机制和错误处理也比较完善。

性能方面,可以考虑为高频数据添加批处理写入功能,减少数据库写入压力:

func (p *PostgresStore) BatchSaveTrades(trades []storage.Trade) error {
    tx, err := p.db.Begin()
    if err != nil {
        return err
    }
    
    stmt, err := tx.Prepare("INSERT INTO trades (...) VALUES (...)")
    if err != nil {
        return err
    }
    defer stmt.Close()
    
    for _, trade := range trades {
        _, err = stmt.Exec(trade.Exchange, trade.Pair, trade.Price, trade.Amount, trade.Side, trade.Timestamp)
        if err != nil {
            tx.Rollback()
            return err
        }
    }
    
    return tx.Commit()
}

总的来说,Cryptogalaxy 为多交易所数据聚合提供了一个可靠的解决方案,代码结构清晰,易于维护和扩展。对于需要实时监控多个交易所行情的应用来说,这个项目可以节省大量开发时间。

回到顶部