文章 "开发回放系统(第32部分):订单系统(一)"

 

在我们迄今为止开发的所有东西中,正如你可能会注意到并最终同意的那样,这个系统是最复杂的。现在我们需要做一些非常简单的事情:让我们的系统模拟交易服务器的操作。准确实现交易服务器操作方式似乎是一件轻而易举的事情。至少说起来是这样。但我们需要这样做,以便对回放/模拟系统的用户来说,一切都是无缝和透明的。

在我们迄今为止开发的所有东西中,正如你可能会注意到并最终同意的那样,这个系统是最复杂的。现在我们需要做一些非常简单的事情:让我们的系统模拟交易服务器的操作。准确实现交易服务器操作方式似乎是一件轻而易举的事情。至少说起来是这样。但我们需要这样做,以便对回放/模拟系统的用户来说,一切都是无缝和透明的。在使用该系统时,用户无法区分真实系统和模拟系统。但这并不是最难的部分。最困难的部分是允许EA在任何情况下都是相同的。

说EA必须是相同的意味着不要编译它以供测试人员使用,然后再编译它以用于实际市场。从编程的角度来看,这将更简单、更容易,但会给用户带来问题,需要不断重新编译EA。因此,为了确保最佳的用户体验,我们需要创建一个只需要一次编译的EA。一旦完成,它就可以在实际市场和测试器中使用。

在真实市场中使用EA的关键部分,即使是在演示帐户上,也是最容易实现的。所以,我们从那里开始。请注意,我们将从一个非常基本的模型开始。我们将逐步增加EA的复杂性,并增强其功能,最终创建可用于回放/模拟以及演示或实时帐户的EA。我们要做的第一件事是借用之前在社区中发布的其他文章中解释的大部分代码。这些文章属于我,所以我认为使用这些信息没有问题。我们将进行一些更改,使系统变得灵活、模块化、可靠和强健。否则,我们可能会在某个时候陷入死胡同,这将使该系统在各个方面无法进一步发展。

这仅仅是一个开始,因为任务非常复杂。首先,我们需要了解类继承系统目前是如何在EA中实现的。我们之前在本系列的其他文章中看到过这一点。当前的继承图如图01所示:

图01

图01:当前EA类继承图

尽管这张图对迄今为止所做的工作非常有效,但它仍然远远不是我们真正需要的。这并不是因为很难将 C_Orders 类添加到此继承方案中。实际上,这可以通过从 C_Study 类派生 C_Orders 类来实现。但我不想这么做。原因在于一个非常实际的问题,而大多数使用面向对象编程的程序员有时会忽略这个问题。这个问题被称为封装,也就是说,只知道你需要做什么来完成你的工作。当我们创建类的层次结构时,我们不应该让一些类知道比他们真正需要知道的更多的信息。我们应该始终支持这样的编程,即每个类只知道执行任务真正需要知道什么。因此,在将 C_Orders 类添加到图01所示的图中的同时维护封装实际上是不可能的。因此,这个问题的最佳解决方案是从继承块中删除 C_Terminal 类,如图01所示,并将其作为参数或参数传递到同一块中,这可以用更合适的方式使用。因此,EA代码将对谁接收哪些信息进行控制,这将有助于维护信息封装。

作者:Daniel Jose

原因: