不会使用这样的架构。
试想一下,如果 MQ 在语言中内置了虚拟商务。那么你就不会有在其中嵌入其他实体的想法,因为这根本无法通过 OOP 继承来实现--源是不可用的。你将创建一个不同的架构。
虚拟化中的图形对象也是如此。
架构变得如此笨重,以至于让人感觉不舒服。您决定创建通用砖块,而不是用简单的砖块进行组装。
我们又回到了不太喜欢这种实现方式的状态,但更不喜欢其他的实现方式(虽然还没有完成,但已经考虑过了)。也许在进一步开发的过程中,我们可以采用不同的方法,但现在还不行。
关于无法访问源代码的情况:在这次实施中,我决定只利用源代码可用这一事实,您可以在其中添加一些没有必要立即添加的内容。我尽量减少这种添加。另一种方法是为 CVirtual* 类族创建几个新的继承类。在我看来,这种方法更加麻烦。不过,我们很可能会遇到这样的情况,届时会有更多的类,而将它们存储在一个文件夹中会变得很难看。
我需要图形对象来控制交易策略的开发,因此实现了图形对象。CVirtualOrder 类完全没有改动。但我必须在 CVirtualReceiver 类中添加四行新代码。在各种可能的方案中,我选择了这个方案。
如果不需要虚拟位置的图形显示,可以不使用它,或者返回上一篇文章中的库变量。
遗憾的是,我没有足够的时间来展示我对部分重构示例的看法。
首次启动后,"智能交易系统 "会打开虚拟和真实仓位,计算价格数据,或许还有一些指标。正是这些信息构成了 EA 的整体状态。如果现在重新加载终端,EA 不仅会将未结头寸识别为自己的头寸,还会恢复所有虚拟头寸和必要的计算值。如果未结头寸的信息可以从终端获取,那么虚拟头寸和计算值的信息必须由智能交易系统自己保存。
假设 Expert Advisor 在一个经纪商的两个交易账户上运行。其中一个终端关闭。在此期间,运行中的虚拟仓位发生了变化。如何使 Expert Advisor 的行为与未停止工作的终端一致?
我是这样做的。我完全不保存虚拟仓位。启动 Expert Advisor 时,所有内部 TS 都会在当前 TimeCurrent 之前在虚拟测试器中启动。因此,在重新加载的 EA 中,当前时刻的所有数据都与未重新加载的版本一致。
我们所说的 "重新加载 "也指智能交易系统工作暂停的情况。例如,长时间的订单发送或重复。因此,有必要从最后一次请求时开始请求价格数据。并在虚拟机中运行。
您已经非常注重审核他人的代码,对此我深表感谢。
想象一下,一个 Expert Advisor 在同一个经纪商的两个交易账户上运行。其中一个终端出现故障。在此期间,运行中的虚拟仓位发生了变化。我们如何使 Expert Advisor 的行为与未停止工作的终端相匹配?
我遇到过这种情况,但这只是影响交易结果的一个微不足道的因素。此外,有时 "睡过 "平仓的终端会以更有利的价格平仓。因此,确保完全一致本身并不是目的。
而且,如果有不同的经纪商,即使是同步运行的智能交易系统,也会因为报价的细微差别而显示出略有不同的结果。尽管我们应该努力做到完全一致。
我是怎么做的我根本不保存虚拟账户。启动智能交易系统时,所有内部 TS 都会在当前 TimeCurrent 之前在虚拟测试器中启动。这样,在重新加载的 "智能交易系统 "中,当前时刻的所有数据都与未重新加载的版本一致。
这是一种有趣的方法,我以前从未考虑过这种方案。如果我理解正确的话,在使用它时,我们必须有一个固定的虚拟交易开始日期,而且在不同终端上的不同智能交易系统实例必须是相同的。这并不难。此外,还必须实施虚拟测试器或使用您的现成测试器。这一点比较复杂。
新文章 开发多币种 EA 交易(第 4 部分):虚拟挂单和保存状态已发布:
在开始开发多币种 EA 后,我们已经取得了一些成果,并成功地进行了多次代码改进迭代。但是,我们的 EA 无法处理挂单,也无法在终端重启后恢复运行。让我们添加这些功能。
在上一篇文章中,我们对代码架构进行了大幅修改,以构建一个具有多种并行工作策略的多币种 EA。为了做到简单明了,我们迄今为止只考虑了一些最基本的功能。即使考虑到我们任务的局限性,我们也对前几篇文章的代码做了很大改动。
现在,希望我们已经有了足够的基础,可以在不对已编写的代码进行彻底修改的情况下增加功能。只有在确有必要的情况下,我们才会进行尽量少的改动。
在进一步的开发中,我们将努力做到以下几点:
让我们从最简单的事情开始 - 处理虚拟挂单。
作者:Yuriy Bykov