关于自动交易:
为了构建一个自动交易系统(又名交易机器人),您必须考虑程序的两个状态:初始化阶段和交易阶段。
以同样的方式比回溯测试,你必须运行之前对系统进行初始化。它涉及[[创建您的时间序列 | 时间序列和滴答]]和[[建立您的交易策略 | 交易策略]]之前。 |
即使您将使用新的报价持续更新您的系列,也应该使用交易所可以给您的最新报价来对其进行初始化。因此,在交易阶段的第一步中,您的策略将具有更可预测/更相关的行为。例如,假设:
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()
方法。您可能不遵循任何信号的策略就可以证明这一点。这样,您可以考虑外部事件。
本文档还提供实时交易引擎示例。
免责声明:好库网所展示的信息由买卖双方自行提供,其真实性、准确性和合法性由信息发布人负责。好库网不提供任何保证,并不承担任何法律责任。