文章 "开发多币种 EA 交易(第 4 部分):虚拟挂单和保存状态"

 

新文章 开发多币种 EA 交易(第 4 部分):虚拟挂单和保存状态已发布:

在开始开发多币种 EA 后,我们已经取得了一些成果,并成功地进行了多次代码改进迭代。但是,我们的 EA 无法处理挂单,也无法在终端重启后恢复运行。让我们添加这些功能。

在上一篇文章中,我们对代码架构进行了大幅修改,以构建一个具有多种并行工作策略的多币种 EA。为了做到简单明了,我们迄今为止只考虑了一些最基本的功能。即使考虑到我们任务的局限性,我们也对前几篇文章的代码做了很大改动。

现在,希望我们已经有了足够的基础,可以在不对已编写的代码进行彻底修改的情况下增加功能。只有在确有必要的情况下,我们才会进行尽量少的改动。

在进一步的开发中,我们将努力做到以下几点:

  • 增加打开虚拟挂单(买入止损、卖出止损、买入限价、卖出限价)的功能,而不仅仅是虚拟仓位(买入、卖出);
  • 添加一种可视化已下虚拟订单和仓位的简单方法,以便我们在测试所用交易策略中开仓/下单规则的正确执行情况时可以进行可视化控制;
  • 实现由 EA 保存当前状态数据,这样当终端重新启动或 EA 转移到另一个终端时,它可以从工作中断时的状态继续工作。

让我们从最简单的事情开始 - 处理虚拟挂单。

作者:Yuriy Bykov

 

不会使用这样的架构。


试想一下,如果 MQ 在语言中内置了虚拟商务。那么你就不会有在其中嵌入其他实体的想法,因为这根本无法通过 OOP 继承来实现--源是不可用的。你将创建一个不同的架构。

虚拟化中的图形对象也是如此。

架构变得如此笨重,以至于让人感觉不舒服。您决定创建通用砖块,而不是用简单的砖块进行组装。

 

我们又回到了不太喜欢这种实现方式的状态,但更不喜欢其他的实现方式(虽然还没有完成,但已经考虑过了)。也许在进一步开发的过程中,我们可以采用不同的方法,但现在还不行。

关于无法访问源代码的情况:在这次实施中,我决定只利用源代码可用这一事实,您可以在其中添加一些没有必要立即添加的内容。我尽量减少这种添加。另一种方法是为 CVirtual* 类族创建几个新的继承类。在我看来,这种方法更加麻烦。不过,我们很可能会遇到这样的情况,届时会有更多的类,而将它们存储在一个文件夹中会变得很难看。

我需要图形对象来控制交易策略的开发,因此实现了图形对象。CVirtualOrder 类完全没有改动。但我必须在 CVirtualReceiver 类中添加四行新代码。在各种可能的方案中,我选择了这个方案。

如果不需要虚拟位置的图形显示,可以不使用它,或者返回上一篇文章中的库变量。

 
Yuriy Bykov #:

我们又回到了不太喜欢这种实现方式,但更不喜欢其他实现方式(虽然还没有完成,但已经考虑过了)的状态。也许在进一步的开发中,我们有可能采用不同的方法,但目前情况就是这样。

遗憾的是,我没有足够的时间来展示我对部分重构示例的看法。


首次启动后,"智能交易系统 "会打开虚拟和真实仓位,计算价格数据,或许还有一些指标。正是这些信息构成了 EA 的整体状态。如果现在重新加载终端,EA 不仅会将未结头寸识别为自己的头寸,还会恢复所有虚拟头寸和必要的计算值。如果未结头寸的信息可以从终端获取,那么虚拟头寸和计算值的信息必须由智能交易系统自己保存。

假设 Expert Advisor 在一个经纪商的两个交易账户上运行。其中一个终端关闭。在此期间,运行中的虚拟仓位发生了变化。如何使 Expert Advisor 的行为与未停止工作的终端一致?


我是这样做的。我完全不保存虚拟仓位。启动 Expert Advisor 时,所有内部 TS 都会在当前 TimeCurrent 之前在虚拟测试器中启动。因此,在重新加载的 EA 中,当前时刻的所有数据都与未重新加载的版本一致。


我们所说的 "重新加载 "也指智能交易系统工作暂停的情况。例如,长时间的订单发送或重复。因此,有必要从最后一次请求时开始请求价格数据。并在虚拟机中运行。

 
fxsaber #:

遗憾的是,我的时间很紧,无法通过一个部分重构的例子来展示我的愿景。

您已经非常注重审核他人的代码,对此我深表感谢。

想象一下,一个 Expert Advisor 在同一个经纪商的两个交易账户上运行。其中一个终端出现故障。在此期间,运行中的虚拟仓位发生了变化。我们如何使 Expert Advisor 的行为与未停止工作的终端相匹配?

我遇到过这种情况,但这只是影响交易结果的一个微不足道的因素。此外,有时 "睡过 "平仓的终端会以更有利的价格平仓。因此,确保完全一致本身并不是目的。

而且,如果有不同的经纪商,即使是同步运行的智能交易系统,也会因为报价的细微差别而显示出略有不同的结果。尽管我们应该努力做到完全一致。

我是怎么做的我根本不保存虚拟账户。启动智能交易系统时,所有内部 TS 都会在当前 TimeCurrent 之前在虚拟测试器中启动。这样,在重新加载的 "智能交易系统 "中,当前时刻的所有数据都与未重新加载的版本一致。

这是一种有趣的方法,我以前从未考虑过这种方案。如果我理解正确的话,在使用它时,我们必须有一个固定的虚拟交易开始日期,而且在不同终端上的不同智能交易系统实例必须是相同的。这并不难。此外,还必须实施虚拟测试器或使用您的现成测试器。这一点比较复杂。

 

Yuriy Bykov #:

必须实施虚拟测试器

您几乎已经拥有了它:将 "Tester"(测试器)剔除到已经实现的虚拟交易中。