XChange-设计说明

概述

​ 目的是让客户连接到提供交易机会的各种交易所。这并不限于比特币,尽管由于市场需求,第一个交易所实施恰好使用BTC货币。

体系结构的高级概述

​ 考虑了两种方法:完全自成一体,或可扩展。解决类似问题的现有 API(如 JDBC对于关系数据库的支持)表明可扩展的方法是更好的选择。这意味着XChange应提供某人需要为其交换实现的接口集合。显然,XChange最初将创建这些提供程序的早期版本,但最终希望交换所有者自己会贡献它们。这是积极鼓励的。

组件的高级概述

​ 以下是开发人员将与之交互的主要组件,通常按下面显示的顺序排列。这些类都在xchange-core包中。

ExchangeSpecification

​ 提供了Exchange的所有配置,包括实现者类名称、身份验证凭据、API 密钥等。将此传递给ExchangeFactory将导致使用匹配的交易所(Exchange)来工作。

ExchangeFactory

​ 负责根据ExchangeSpecification中提供的详细信息创建Exchange实现。

Exchange接口

​ 交互的要点。此接口提供给使用的应用程序,应用程序通过接口访问交易所支持的各种服务。各个交易所类可以通过继承BaseExchange来实现此接口。

Exchange Metadata

​ Exchange Metadata包括交易对、最大轮询速率、缩放系数、费用、最低金额等。其加载并存储在Exchange层,而不是Service层。信息在创建Exchange时加载,并存储在ExchangeMetaData对象中。一种方便方法List<CurrencyPair> getExchangeSymbols(),被用来访问那些CurrencyPairexchange.getExchangeMetaData()可以被调用来获取所有元数据。

​ 由于不同的exchange可以通过API调用不同数量的(从零到全部个)元数据(可以全部位于一个 API 终结点或多个 API 终结点的组合中),因此XChange以以下方式处理此数据:

  1. Exchange创建期间,从类路径加载JSON文件,该文件是包含Exchange元数据的硬编码JSON结构。这通常针对不能通过API Endpoint提供元数据或仅提供有限数据的Exchange

  2. 在创建Exchange期间,可以指定 JSON 文件的路径以覆盖XChange附带的默认JSON文件。关于提供自己的元数据文件,您可能有以下几个原因:

    a) 默认的JSON文件已过时

    b) 您想要出于各种原因调整数据

    c) 默认的JSON文件不完整

  3. 在创建Exchange期间,remoteInit()被调用 。此方法的实现可能因交易所而异,但主要想法是通过远程API调用加载元数据,以生成ExchangeMetaData。鼓励实现加载通过硬编码的JSON文件来覆盖数据,特别是当API Endpoint调用中缺少JSON文件时。

需要元数据的代码应调用Exchange对象上的访问方法。

ExchangeServices

  • BaseService
    
    • MarketDataService
    • TradeService
    • AccountService
  • StreamingExchangeService

    ​ 作为exchange服务入口点的接口(例如,根据特定符号等列出市场价格),可以是同步(阻塞)或异步(非阻塞)。

    ​ 这些实现的服务扩展了核心基类:

  • BaseExchangeService
    
    • BaseExchangeService

    鼓励一个服务具有两个实现,一个实现服务接口,提供来自exchange的原始数据,另一个实现第一个service类,把原始数据强制转换成标准DTO。

DTOs(数据传输对象)

​ 用于exchange信息到标准DTOs的交换。请注意,空时间戳很常见,而不是Bug。DTOs中的时间戳表示从服务器的JSON响应中给出的时间戳,如果未给出,DTO包含一个空时间戳。

SynchronizedValueFactory

XChange 使用的 REST 客户端是ResCU,它最初直接集成到 XChange 中,但后来拆分为独立库。后来集成到ResCU的一个不错的功能是nonce处理,这被许多exchange依赖。nonce factory用于创建nonce值。允许服务层接受在消息序列化并发送之前替换为生成值的占位符。如果REST方法接受 ValueFactory 作为参数,则计算该消息将序列化并在单个同步块中发送。

如果Exchange需要,XChange实现最好使用SynchronizedValueFactory 。这需要两个步骤:

  1. 在交易所的BaseExchange实现中(例如ANXExchange,请参阅)应实现getNonceFactory(),并应返回一个具体的SynchronizedValueFactory<T>实例。在org.knowm.xchange.utils.nonce中,有许多SynchronizedValueFactory<T>实现可供选择。
  2. 在REST接口类中(例如ANXV2,请参阅),SynchronizedValueFactory<T>的实现应作为参数传递。

​ 每个BaseExchange实现对SynchronizedValueFactory<T>实例进行硬编码。如果要更改使用的SynchronizedValueFactory实例,则需要创建自己的BaseExchange子类,并通过重写getNonceFactory()方法得到你想要的SynchronizedValueFactory<T>,使用一个在com.xeiam.xchange.utils.nonce中提供的 nonce factory或您自己的实现之一来提供首选实例。