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.javaBinanceMarketDataServiceRaw.java。*raw类应获取JSON并将其反序列化为特定exchange的DTOs。非raw类应使用 *raw类获取特定exchange的DTO,并使用在前面的步骤中创建的*Adapter类将它们转换为特定于 XChange 的标准DTO。

至于异常处理,您应该捕获非Raw类中特定exchange的异常,并在使用*ErrorAdapter类适配ExchangeException类或子类后,重新抛出这些异常。不应将特定于Exchange的异常从泛型接口方法中泄露出来。创建特定于exchange的异常的示例可以在xchange-binance模块中找到,其中有:

步骤 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,则可能需要考虑实现部分或全部StreamingExchangeAPI。

强烈建议您在创建核心轮询实现后执行此操作。流式处理实现完全依赖于正常运行的轮询实现,并且通常可以共享大量代码(尤其是在exchanges在其轮询和 Websocket API 上使用相同的数据结构时)。

为此,请遵循类似的过程,创建一个新的xchange-stream-XYZ模块并引用现有示例。BinanceBitfinex的实现特别完整且测试良好。

需要注意的一些重要事项:

  • 流式代码和轮询代码示例之间的标准可能有所不同。这是因为它们是两个不同的合并项目的结果。流式代码正在缓慢更改,以匹配轮询代码的标准。如果有疑问,请使用轮询代码中的方法。
  • 流式处理 API 旨在高度并发。你应该对并发性有很好的了解;特别是使用非线程安全对象(如 HashMap)来保持多个线程可能查看的状态的风险。
  • 花些时间熟悉ReactiveX 文档。一般来说,在Java中阅读非阻塞代码也会有所帮助:CompletableFuture。而 promise chaining 的原则借用了Javascript等语言。

有关错误处理的说明

XChange 使用的 REST 客户端 (ResCU) 提供了处理返回的 JSON 的漂亮机制,该机制的格式与预期的有效 JSON 不同。有关详细信息,请参阅此 Wiki 页面

一致性应遵循的一些"规则”

  1. 切勿将 DTO 中的Date字段设置为new Date() 。时间戳字段表示"服务器"时间戳,而不是客户端计算机的系统时间。
  2. 如果提交消息不常见,请在提交消息中包含exchange name(或 specific component name)。就像这个:[btce] Removed unnecessary code