好库网 好库网首页 | 我的好库
blockchain的专栏

文章分类

Ta4j实时交易Live Trading

发布者:blockchain
发布日期:2021/7/17 21:15:00   更新日期:2021/7/17 21:21:00
阅读次数:60
评分:4.80
介绍:Ta4j还可以用于构建自动交易系统。 关于自动交易: 维基百科有关自动交易系统和Investopedia定义的文章 维基百科有关算法交易和Investopedia定义的文章 为了构建一个自动交易系统(又名交易机器人),您必须考虑程序的两个状态:初始化阶段和交易阶段。 初始化阶段 以同样的方式比回溯测试,你必须运行之前对系统进行初始化。它涉及[[创建您的时间序列 时间序列和滴答]]和[[建立您的交易策略 交易策略]]之前。 即使您将使用新的报价持续更新您的系列,也应该使用交易所可以给您的最新报价来对其进行初始化。因此,在交易阶段的第一步中,您的策略将具有更可预测/更相关的行为。例如,假设: 我们有3个5, 10, 30报价:(收盘价) 您的策略计算出 SMA(3) 如果您在第三个勾号开始交易阶段: 没有初始化: SMA(3) --> 30 / 1 = 30 用最后一个滴答声初始化系列后: SMA(3) --> (5 + 10 + 30) / 3 = 15 最大条数 由于您将在交易阶段连续用新的报价来填充柱系列,因此它将无限增长并且很快就会遇到存储问题。为避免这种情况,您必须为系列设置最大条数。它代表您的交易策略需要运行的最大报价数量。 例如:如果您的策略依赖于SMA(200)和RSI(2),则最大柱线数应为200。您可能希望将其设置为400(这比严格值高一个数量级,但是它必须大于您需要的最大刻度数);它将确保您的系列不会超过400个ticks(即添加新的tick之前会删除最早的tick)。 您只需要调用该BarSeries#setMaximumTickCount(int)方法。 交易阶段 交易阶段本身可以设计成一个简单的无限循环,在此循环中,您在等待策略之前等待经纪人/交易所的新价格。 Bar newBar = // Get the exchange new tick here...; series.addBar(newBar); 从版本0.12开始,您还可以使用addBar(data ...)函数将条形数据直接添加到TimeSeries中。这是推荐的方式: series.addBar(ZonedDate
正文:

Ta4j还可以用于构建自动交易系统。

关于自动交易:

为了构建一个自动交易系统(又名交易机器人),您必须考虑程序的两个状态:初始化阶段和交易阶段。

初始化阶段

以同样的方式比回溯测试,你必须运行之前对系统进行初始化。它涉及[[创建您的时间序列 时间序列和滴答]]和[[建立您的交易策略 交易策略]]之前。

即使您将使用新的报价持续更新您的系列,也应该使用交易所可以给您的最新报价来对其进行初始化。因此,在交易阶段的第一步中,您的策略将具有更可预测/更相关的行为。例如,假设:

  • 我们有3个5, 10, 30报价:(收盘价)
  • 您的策略计算出 SMA(3)

如果您在第三个勾号开始交易阶段:

  • 没有初始化: SMA(3) --> 30 / 1 = 30
  • 用最后一个滴答声初始化系列后: SMA(3) --> (5 + 10 + 30) / 3 = 15
最大条数

由于您将在交易阶段连续用新的报价来填充柱系列,因此它将无限增长并且很快就会遇到存储问题。为避免这种情况,您必须为系列设置最大条数。它代表您的交易策略需要运行的最大报价数量。

例如:如果您的策略依赖于SMA(200)和RSI(2),则最大柱线数应为200。您可能希望将其设置为400(这比严格值高一个数量级,但是它必须大于您需要的最大刻度数);它将确保您的系列不会超过400个ticks(即添加新的tick之前会删除最早的tick)。

您只需要调用该BarSeries#setMaximumTickCount(int)方法。

交易阶段

交易阶段本身可以设计成一个简单的无限循环,在此循环中,您在等待策略之前等待经纪人/交易所的新价格。

Bar newBar = // Get the exchange new tick here...;
series.addBar(newBar);

从版本0.12开始,您还可以使用addBar(data ...)函数将条形数据直接添加到TimeSeries中。这是推荐的方式:

series.addBar(ZonedDateTime.now(),5,10,1,9); // add data directly to the series

如果您正在接收跨期价格和/或交易信息,则还可以更新该系列的最后一个柱:

series.addPrice(5) // updates the close price of the last bar (and min/max price if necessary)
series.addTrade(7, 10) // updates amount and price of the last bar

由于您使用的是移动时间序列(请参见上文),因此您需要在此新柱上运行策略:柱索引始终为series.getEndIndex()(查看Num文章以了解为什么DoubleNum::valueOf需要功能)

int endIndex = series.getEndIndex();
if (strategy.shouldEnter(endIndex)) {
    // Entering...
    tradingRecord.enter(endIndex, newTick.getClosePrice(), DoubleNum.valueOf(10));
} else if (strategy.shouldExit(endIndex)) {
    // Exiting...
    tradingRecord.exit(endIndex, newTick.getClosePrice(), DoubleNum.valueOf(10));
}

请注意,该策略为您提供了您应该输入的信息,然后由您以实际花费的价格调用TradingRecord#enter()/TradingRecord#exit()方法。您可能不遵循任何信号的策略就可以证明这一点。这样,您可以考虑外部事件。

本文档还提供实时交易引擎示例


评论 [发表评论]
账号 密码 还没帐号呢,现在注册一个?

免责声明:好库网所展示的信息由买卖双方自行提供,其真实性、准确性和合法性由信息发布人负责。好库网不提供任何保证,并不承担任何法律责任。