XChange开发新交易所最佳实践
如果要向 XChange 添加新的交易所、经纪商或市场数据提供商,您已经找到正确的页面。在这里,我们概述了从开始创建新实现的步骤。它实际上不是太难,已经有很多的例子可以让你来复制和粘贴。
请分叉,在"develop"分支上开发!
步骤 1
熟悉数据提供程序的API。提供了哪些数据?它们拥有哪些API?以哪种格式返回数据?您是否需要登录名或密钥?查询数据的频率是否有限制?创建名为api-specification.txt 的文件并做一些笔记。
步骤 2
为数据提供程序创建新的Maven模块。更新pom.xml
文件,使用现有的pom.xml
文件作为模板。
步骤 3
获取实际数据并将其存储在一个文件中,存放在项目的test/resources中。例如,请参阅example-ticker-data.json。您可以使用JSON Formatter 来设置良好的格式。
要通过XChange从API endpoint返回原始JSON,首先需要在类路径上有logback.xml
文件。你可以在这里的xchange 示例
模块中找到示例文件。确保以下行为"未注释”:
<logger name="si.mazi.rescu" level="TRACE" />
这样,您就可以在控制台找到以行方式显示的返回的原始JSON记录,如下所示:
si.mazi.rescu.HttpTemplate - Response body:
步骤 4
对于每个数据文件,创建一个相应的Java对象(DTO),该对象将包含文件中的所有数据。您可以使用 JSON Schema 2 Pojo 工具加快该过程。数据设置成不可变(参见BitstampTicker.java
示例)。有一些示例,说明如何创建 DTO,Jackson可以将JSON解封到整个 XChange 项目中的复杂性各不相同,因此只需四处查找示例即可。
步骤 5
创建JUnit测试以验证从原始JSON到解组成DTO是否正常工作。请参阅TickerJSONTest.java
。该项目使用AssertJ,所以你也最好使用这些。这是一个链接,它显示了大量的 AssertJ 断言示例。
使用以下模式命名所有测试类:“DTO 类名称”Test.java,例如CoinfloorOrderbookTest.java。
步骤 6
然后创建一个适配器类以获取特定于提供程序的DTO(原始DTO),并将其转换为 XChange的标准DTO。请参阅BitstampAdapters.java
步骤 7
放好两个exchange service类中,如BinanceMarketDataService.java
和BinanceMarketDataServiceRaw.java
。*raw类应获取JSON并将其反序列化为特定exchange的DTOs。非raw类应使用 *raw类获取特定exchange的DTO,并使用在前面的步骤中创建的*Adapter
类将它们转换为特定于 XChange 的标准DTO。
至于异常处理,您应该捕获非Raw类中特定exchange的异常,并在使用*ErrorAdapter
类适配ExchangeException类或子类后,重新抛出这些异常。不应将特定于Exchange的异常从泛型接口方法中泄露出来。创建特定于exchange的异常的示例可以在xchange-binance
模块中找到,其中有:
- 接受 JSON 属性的
BinanceException(
您也可以通过使用HttpStatusExceptionSupport
来了解HTTP状态。) Binance
和BinanceAuthenticated
客户端接口,用于抛出它BinanceMarketDataServiceRaw
原始service不应该尝试捕获这些BinanceException
异常BinanceMarketDataService,
它实现MarketDataService
接口的通用方法,捕获BinanceException
异常,并使用BinanceErrorAdapter
类来适配到ExchangeException
类。在我们的HTTP客户端如何处理例外的工作,有一个完整的解释可以在Rescu的Wiki上找到。
步骤 8
在模块 xchange-examples
中,添加示例类来演示新的交换 API 功能。请参阅TickerDemo.java。
步骤 9
创建一个集成测试类,其中至少有一个测试方法在交易所轮询一个ticker 。这充当exchange的集成测试,并捕获交易所本身的任何问题。创建测试类时,放Integration
在类名称的末尾(i.e. AccountInfoFetchIntegration.java
)。这是如何将其指定为集成测试类。在不运行集成测试的情况下,使用mvn clean test
运行所有单元测试。 集成测试用mvn clean verify -DskipIntegrationTests=false
运行所有单元测试。
使用以下模式命名所有集成测试类:“DTO 类名称"Integration.java,例如:CoinfloorOrderbookIntegration.java。
步骤 10
使用提供的XChange代码样式配置文件格式化代码。
步骤 11
提交针对develop 分支的拉取(pull )请求。
步骤 12
更新Exchange 支持页面。
步骤 13
现在,您已经完成了并记录了轮询API实现,如果这个exchange具有Websocket或其他类似的"推送"数据API,则可能需要考虑实现部分或全部StreamingExchange
API。
强烈建议您在创建核心轮询实现后执行此操作。流式处理实现完全依赖于正常运行的轮询实现,并且通常可以共享大量代码(尤其是在exchanges在其轮询和 Websocket API 上使用相同的数据结构时)。
为此,请遵循类似的过程,创建一个新的xchange-stream-XYZ
模块并引用现有示例。Binance和Bitfinex的实现特别完整且测试良好。
需要注意的一些重要事项:
- 流式代码和轮询代码示例之间的标准可能有所不同。这是因为它们是两个不同的合并项目的结果。流式代码正在缓慢更改,以匹配轮询代码的标准。如果有疑问,请使用轮询代码中的方法。
- 流式处理 API 旨在高度并发。你应该对并发性有很好的了解;特别是使用非线程安全对象(如
HashMap
)来保持多个线程可能查看的状态的风险。 - 花些时间熟悉ReactiveX 文档。一般来说,在Java中阅读非阻塞代码也会有所帮助:
CompletableFuture
。而 promise chaining 的原则借用了Javascript等语言。
有关错误处理的说明
XChange 使用的 REST 客户端 (ResCU) 提供了处理返回的 JSON 的漂亮机制,该机制的格式与预期的有效 JSON 不同。有关详细信息,请参阅此 Wiki 页面。
一致性应遵循的一些"规则”
- 切勿将 DTO 中的
Date
字段设置为new Date()
。时间戳字段表示"服务器"时间戳,而不是客户端计算机的系统时间。 - 如果提交消息不常见,请在提交消息中包含exchange name(或 specific component name)。就像这个:
[btce] Removed unnecessary code