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()
,被用来访问那些CurrencyPair
。exchange.getExchangeMetaData()
可以被调用来获取所有元数据。
由于不同的exchange可以通过API调用不同数量的(从零到全部个)元数据(可以全部位于一个 API 终结点或多个 API 终结点的组合中),因此XChange以以下方式处理此数据:
-
在
Exchange
创建期间,从类路径加载JSON文件,该文件是包含Exchange元数据的硬编码JSON结构。这通常针对不能通过API Endpoint提供元数据或仅提供有限数据的Exchange
。 -
在创建
Exchange
期间,可以指定 JSON 文件的路径以覆盖XChange附带的默认JSON文件。关于提供自己的元数据文件,您可能有以下几个原因:a) 默认的JSON文件已过时
b) 您想要出于各种原因调整数据
c) 默认的JSON文件不完整
-
在创建
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
。这需要两个步骤:
- 在交易所的
BaseExchange
实现中(例如ANXExchange
,请参阅)应实现getNonceFactory()
,并应返回一个具体的SynchronizedValueFactory<T>
实例。在org.knowm.xchange.utils.nonce
中,有许多SynchronizedValueFactory<T>
实现可供选择。 - 在REST接口类中(例如
ANXV2
,请参阅),SynchronizedValueFactory<T>
的实现应作为参数传递。
每个BaseExchange
实现对SynchronizedValueFactory<T>
实例进行硬编码。如果要更改使用的SynchronizedValueFactory
实例,则需要创建自己的BaseExchange
子类,并通过重写getNonceFactory()方法得到你想要的SynchronizedValueFactory<T>
,使用一个在com.xeiam.xchange.utils.nonce中提供的 nonce factory或您自己的实现之一来提供首选实例。