您的位置 首页 外汇EA指标

外汇EA编写教程:如何使用UML工具开发EA事务

科学家探索已经存在的东西;工程师创造出以前从未见过的东西。 阿尔伯特·爱因斯坦 简介 在我的文章Simulink:EA事务开发者指南中,我建议使用动态系统来建模EA事务。然而,这种…

科学家探索已经存在的东西;工程师创造出以前从未见过的东西。

阿尔伯特·爱因斯坦

简介

在我的文章Simulink:EA事务开发者指南中,我建议使用动态系统来建模EA事务。然而,这种方法只将交易系统的一个方面表达给设计者——系统的动态行为。专业人员有专门的工具来扩展事务系统开发人员的方法。在本文中,我们将讨论如何使用通用工具UML图形语言开发EA事务。

一般来说,作为一种图形语言,UML用于面向对象软件系统的可视化建模。然而,正如我所看到的,我们可以使用它的工具来开发一个交易系统。此外,MQL5属于面向对象语言的家族,这使得我们的任务更容易。

为了建模的目的,我选择了一个免费的非商业软件软件理念建模器。

1。统一建模语言基金会

UML如何帮助创建EA事务?首先,图形问题可以通过使用可以用于语言来解决多维建模的图像来解决。第二,可读性。即使EA大而复杂,UML的通用性也可以使用图表来表示其模块。

正如UML开发人员所说,人类感知的特定功能取决于这样一个事实,即带有图像的文本比纯文本更容易理解。

让我们简单地讨论UML的基础。如果您对这个主题感兴趣,您可以从网络上大量的免费出版物中学习UML工具。

您可以在图中显示UML结构(图1)。

图 1. UML 结构

图1。UML结构

它包括以下构建块:实体(模型元素)、关系(绑定)和图表(表示UML模型)。

UML图可以从不同的角度直观地表示设计系统。

常见的机制包括:规范(语义描述)、修改(标记模型的重要特征)、通用分区(抽象及其实例、接口和实现)、扩展机制(约束、构造和标记值)。

体系结构负责系统在其环境中的高层表示。4 + 1体系结构视图(图2)最能描述UML体系结构:

  • 逻辑视图
  • 过程视图
  • 发展观
  • 物理视图
  • 场景

图 2. 4+1 架构视图

图2。4 + 1建筑视图

还应该注意的是,UML具有自己的标准图形层次结构(图3)。2.2版使用了14种类型的UML图。

图 3. 规范 UML 图

图3。规范UML图

此外,我建议我们在UML图的应用中考虑一些特殊的情况。因此,对于EA开发的目的,我们可以使用任何图表从抽象到特定的情况。再次,指出UML图的层次结构所提供的事务系统的多方面设计原则有助于以系统和全面的方式创建事务系统。

2。UML图

2.1。用例图

俗话说,好的开始是成功的一半。通常,虽然不是必需的,但是从用例图开始分析。从用户的角度对系统进行了描述。

当我们创造的时候,我们可以:

  • 指定使用交易系统的情况。
  • 指定交易系统的边界
  • 识别交易系统中的参与者(参与者)
  • 定义参与者和事务系统版本之间的关系。

用例是一系列步骤,通常定义为角色(在UML中称为“参与者”)和系统之间的交互以实现目标。

参与者指定用户或参与者的任何其他系统角色。参与者可以代表人类用户、外部硬件或其他主题所扮演的角色。

关系是一个模型的各个元素之间的语义联系。

您可能会注意到,这些图表非常广泛,反映了交易系统的概念性质,而不是其实现。但这是从一般到具体,从抽象到有形的观点。谁说我们不是艺术家?我们开始从一般的想法和草图。首先,我们在画布上画线。然后添加颜色。绘图细节…

因此,让我们尝试为交易系统创建用例图。

作为输入参与者,我选择了以下角色:开发人员、系统分析员、风险管理者和管理员。应该指出的是,这些角色可以由一个或多个人来承担。我们的交易系统采取什么行动?哪些行为与它有关?

因此,开发者可以创建和实施一个交易系统。此外,开发商可以参与交易系统的优化。系统分析员优化交易系统。风险经理负责风险管理。管理员监视事务系统的总体操作。在输出端,我们看到用户(用户)受益于使用交易系统。这个角色是交易者和投资者等角色的组合。管理员(管理员)和管理员(管理员)监控交易系统的运行。

该图表包含交易系统的方框图。它代表着交易系统的边界,并将其与外部世界分隔开来。

现在,简要描述演员和用例之间的关系,以及演员和用例之间的关系。大多数关系是由关联表示的,并用实线表示。这意味着参与者发起了一个用例。因此,风险管理者开始风险管理过程等。发起用例的参与者是初级的,使用动作结果的参与者是次要的。例如,输出端的管理器是次要参与者。

关联(关联)可以指示参与者启动相应的用例。

泛化(泛化)模拟了相应的角色共性。

扩展(扩展)是基本用例与其特殊用例之间的依赖关系。

包括定义关系基本用例和用例之间,以及这些用例的功能行为并不总是由底层使用的情况下使用,但是用在附加条件。

但是,请注意,与用例相关联的次要角色并不意味着角色是次要的。此外,在图中,我们可以看到,该交易系统的用户包括交易员和投资者通过广义的关系,呈现出“空心化”的三角箭头线。

图 4. 交易系统的用例图

图4。交易系统用例图

用例“开放位置”和“紧密位置”通过泛化与“交易”关联。后者是另外两个基本用例。因此,它包含了“管理风险”(管理风险)的使用案例。它的行为与用例“利润”(利润)是相辅相成的。

这些用例,我使用扩展关系,因为交易系统的收益只发生在该资产的出售价格高于买入价格。该图还显示了扩展点,一个使用“利润”用例满足条件的特定条件。依赖关系用虚线显示,箭头对应于构造“包含”和“扩展”。

对于每个用例,你需要创建一个场景来描述一系列的步骤来达到预定的目标。您可以用几种方式描述用例。最常见的形式有:文本描述、伪代码、活动图、交互图。

应该指出的是,严格地说,交易者在交易系统感兴趣,而不是如图4所示。因此,我将进一步建议将用例“交易”与“利润”的延伸相结合。

2.2类图

我们使用类图来描述交易系统的结构。也就是说,我们将使用面向对象的编程类来表示事务系统的静态结构模型。因此,我们将反映交易系统的编程逻辑。

在UML中,类图是静态结构图。通过显示系统的类、属性和操作符以及类之间的关系,描述了系统的结构。

这些图的优点是什么?熟悉面向对象编程语言的人会立即注意到类似“类”的概念。类在UML类图中的作用相当于基本构建块。例如,在生成C++代码时,UML类块是以类模板的形式自动创建的。您只需要完成每个方法和属性的实现。

现在让我们来设计一个例子。但首先,我想提醒大家注意交易机器人的原型。在本文中,作者描述了使用直接逻辑的优点。在我看来,嵌套原理宏功能事务模块是非常有效和有用的。

例如,我们需要一个可以在标准库中使用事务类的EA事务。

使用类块在类关系图中创建类模型。我叫它CTradeExpert。我们将一些属性添加到新类中(在MQL5中,它们是类的数据成员)。如下:MAGICICNO,EHORT,EYACT,EYAL协议,EY-符号,EY-PNT。我们还插入类C交易专家的构造函数方法。图形化的操作如图5所示。

图 5. 类 CTradeExpert 的 UML 模型

5的UML模型。CTradeExpert类

属性前面的字符“-”表示该属性的访问权限是私有的,#表示受保护的,+表示公共的。因此,对于属性Magic_No,访问描述符被设置为.,对于e_pnt,访问描述符被设置为公共的,而对于其他属性,访问描述符被设置为.。属性名称后面的冒号指出该方法返回的属性和数据类型的数据类型。例如,属性MAGICHONO的类型是int,EHAL的类型是CTART,等等。

现在,我们不再添加任何方法和属性,而是简单地展示类CTradeExpert如何连接到标准库中的类。为此,在图中添加了6个类块,分别称为CTrade、CAccountInfo、CDealInfo、CSymbolInfo和Cobject。现在,我们通过依赖项将CTradeExpert类的模型与四个事务类块与“use”(带箭头的虚线)构造相关联。

依赖性是两个实体之间的语义关系,其中一个实体独立性的变化会影响另一个实体的语义。

UML中的构造函数是对象行为的描述。

接下来,我们使用“空心”三角形箭头的线条,通过通用化将这些块连接到块块。将注释添加到标准库类中。现在,我们的UML图如图6所示。

图 6. UML 类图

图6。UML类图

现在,我们只需要在侧栏中的“生成”选项卡上使用生成函数来生成代码(图7)。

图 7. 生成代码

图7。生成代码

最适合的是++语言。我们使用C++生成EA事务类的代码,然后很容易地将其转换为MQL5。

对于该图,生成的代码如下:

//
class CTradeExpert
{

private:
        int Magic_No;

protected:
        CTrade e_trade;

protected:
        CAccountInfo e_account;

protected:
        CDealInfo e_deal;

protected:
        CSymbolInfo e_symbol;

public:
        double e_pnt;

public:
        void CTradeExpert () 
    {

    }

};


//
class CObject
{
};

//
class CTrade : public CObject
{
};

//
class CDealInfo : public CObject
{
};

//
class CSymbolInfo : public CObject
{
};

//
class CAccountInfo : public CObject
{
};

非常熟悉的语法,不是吗?我们只需要填写班级的主体。要做到这一点,在Meta编辑器中,我们为新类创建一个文件TraseExt.MQH。将先前生成的代码复制到文件中。为了便于阅读,我们删除了对CARTeAdExtor类成员保护的重复访问说明符。

删除与标准库类声明相关的行。然后,添加一个包含指令#Include的文件,用于每个标准库类,因为开发人员已经定义了这些类。添加我们自己的笔记。通过这种方式,我们得到以下代码:

//includes
#include <Trade/Trade.mqh>
#include <Trade/AccountInfo.mqh>
#include <Trade/DealInfo.mqh>
#include <Trade/SymbolInfo.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CTradeExpert
  {
private:
   int               Magic_No;   // Expert Advisor magic

protected:
   CTrade            e_trade;    // An object for executing trade orders
   CAccountInfo      e_account;  // An object for receiving account properties
   CDealInfo         e_deal;     // An object for receiving deal properties
   CSymbolInfo       e_symbol;   // An object for receiving symbol properties

public:
   double            e_pnt;      // Value in points

public:
                     CTradeExpert()
     {
     }
  };
//+------------------------------------------------------------------+

现在,让我们将更多的事务模块添加到EA事务类中。

这些功能可以包括:检查信号、打开位置、检查位置、关闭位置等。我希望你已经知道了“有条件服务”的原则。在这种情况下,我们的测试类cTeaTead对您来说似乎并不困难。我特别关注一些已经为公众所熟知的EA事务示例,这使您更容易理解UML的机制。

现在,类的模型如图8所示。

图 8. 类 CTradeExpert 的 UML 模型

图8。CTradeExpert的UML模型

对于类更新模型,我们还可以使用已描述的代码来生成代码。

2.3活动图

使用这种UML图,我们可以使用数据流和控制流模型来研究系统的行为。活动图是STEP活动和动作工作流的图形表示。

活动图不同于流程图,流程图只描述算法步骤。活动图的概念更为广泛。例如,可以在其中指定对象的状态。

开发人员使用活动图来描述:

  • 业务规则
  • 一次性使用案例
  • 一系列复杂的多用途案例
  • 具有解和替代流的过程
  • 并联运行
  • 程序流程与逻辑控制结构

假设创建的EA类CTradeExpert将用于EA事务文件TestOpTraveExt.MQ5。我们记得在MetaEditor 5中用于创建EA的默认模板提供了三个默认事件处理程序:OnInit、OnDeinit和OnTick。让我们在这里取得一些进步。

让我们尝试用EA操作帐户来显示文件TestOpTraveExt.MQ5图。这里需要指出的是,EA事务或其结构非常简单。现在我们正在训练。因此,一个简单的EA结构就可以了。

让我们设计一个图表来使用我们的EA事务。文件TestTuffExtExt.MQ5包含程序的算法。

所以,一切都从初始节点开始(图9)。从这个节点控制令牌到调用动作的节点“创建EA事务实例”。此操作启动对象流(蓝色箭头),该对象流更改对象节点的状态(myTE=create),并生成节点的控制流,该控制流调用动作“初始化EA事务”。

控制流表示为连接两个活动节点的活动链,并且只有控制令牌通过活动链。

对象流以活动链的形式来表示,只将对象或数据令牌传递给它。

活动节点是由链链接的活动流中的单个点的抽象类。

决策节点是在输出流之间进行选择的控制节点。

对象节点表示活动中使用的对象。

活动链是两个活动节点之间有向连接的抽象类。

初始节点显示活动开始的位置。

终止节点是完成所有活动流的活动。

它还改变对象MyTE(MyTe=初始化)的状态,并将控制令牌传递给决策节点。如果EA事务成功初始化,则控制流前进到处理事务事件NeXTICK的节点。如果初始化失败,则控制令牌首先进入泛化节点,然后进入动作节点“初始化EA事务”。

令牌是引入的抽象结构,以便于描述静态定义的活动图的动态执行过程。令牌不能包含任何附加信息(空令牌),在这种情况下,它被称为控制流令牌;或者它可以包含对对象或数据结构的引用,在这种情况下,它被称为数据流令牌。

让我们看一下来自决策节点的第一个控制流。它指向具有中断作用的区域,如用红色虚线绘制的圆形矩形和构造的“可中断”所示。当控制流在这个区域时,它可能会突然停止。如果激活接收事件“卸载EA事务”的动作节点(橙色标志),它将中断所有进程。控制令牌被移动到中断链(橙色锯齿形箭头),然后移动到连接节点。之后,EA被初始化。然后,控制令牌进入节点以“删除全局变量”,进程在活动完成节点内结束。

动作节点“取消初始化EA事务”还通过对象流更改对象myTE(myTE=deinits..)的状态。节点“删除全局变量”,然后删除对象MyTE(MyTe=已删除)。

图 9. Test_TradeExpert.mq5 的活动图

图9。Test-TraceExcel的活动图MQ5

假设控制流是稳定的:EA不会被卸载。控制流从“处理事务事件NewTick”节点移动到另一个扩展区域,其构造被定义为“迭代”(绿色虚线矩形)。

我把这个区域称为“事务块”,以反映基本特征并提高对图表的理解。块的一个特征是对输入对象执行操作。我们只需要2个周期来处理长仓和短仓。在块的入口和出口处,存在分别包含事务方向对象的扩展节点(长仓库或短仓库)。

扩展节点是一组对象,它们进入或离开扩展区域,为每个对象运行一次。

发送信号的动作节点(发送信号动作)表示信号的传输。

接收事件(接收事件动作)的动作节点等待接收相应类型的事件。

因此,这些节点按照以下类型处理每个方向:“检查信号”(信号发送节点)、“接收信号”(信号接收节点)、“建立仓库”(信号发送节点)、“检查仓库”(信号发送节点)、“关闭仓库”(信号发送节点)。应该指出,定向对象可以在对象流中的动作节点之间传递,如紫色箭头所示。只要EA被卸载,块中的操作将继续。

2.4序列图

我们使用序列图来描述对象交互序列。这种图的一个非常重要的方面是时间。

因此,该图具有两个隐式刻度。水平尺度表示对象交互序列。垂直刻度表示时间轴。时间间隔的起点是图的上部。

图的顶部包含交互式图形对象。对象有自己的生命线,并用垂直虚线表示。对象来交换消息。慈姑。当对象处于活动状态时,它接收控制焦点。这个焦点被表示为生命线上的一个窄矩形。

对象是一个矩形,包含由冒号分隔的下划线对象名称和类名(可选)。

对象生命线是一条线,它显示一个对象在一定时间段内的存在;线越长,对象存在的时间就越长。

控制焦点表示为一个窄矩形。矩形的上端表示对象接收控制焦点的起点(活动的开始),下端表示控制焦点的结束(活动的结束)。

在UML中,一组消息被用来表示每个交互,而对象参与消息的交换。

让我们做一些练习。

客户端是参与者。它启动了EA事务的操作。标记为“事件”(事件)定型的其他对象是客户端事件:init、Deinit、NewTick。当然,如果您愿意,可以扩大事件的范围。当启动EA事务时,在全局级别创建MyTE对象。它是C交易专家类的一个例子。类对象略低于图表中的其他对象,指示它是在构造函数之后创建的。

马克是一个带有虚线的虚线的创建命令,包含一个消息1.1 CTradeExpert()。带箭头的虚线表示默认构造函数CTradeExpert()的“创建类型”。在创建CTradeExpert实例之后,将步骤1.2激活控制焦点返回给客户端。为了便于阅读,我使用了用于表示同步消息,如1.1,以及表示异步消息的y*的形式。然后,在步骤2.1中,客户端使用OnInit()函数来处理init事件,并且焦点返回到步骤2.2。“调用”类型消息在结尾显示一条带有实心三角形箭头的线。

如果Init事件向客户端返回非零值,则初始化失败:执行步骤3.1来生成和处理Deinit事件。在步骤3中。2,将控制焦点返回给客户端。然后删除cTuffExtExtClass对象(步骤4.1)。顺便说一下,在创建类关系图时,我没有在类CtAdExchange中包含析构函数。这是可以在将来完成的。这是图形构造的优点之一,几个图表的构造过程是迭代的。你可以先完成一张图表的操作,然后再操作另一张图表,然后你可以修改第一张图表。

应该注意的是,标准EA模板的MQL5代码不包含处理失败初始化的块。我列出了它们以节省逻辑顺序。UML序列图使用OPT块,其中包含警报条件OnInit()!= 0,相当于MQL5结构IF(OnInit())!= 0){}。

在步骤4中。2,控制转移到客户端。

现在,客户端已经准备好处理事件NeXTICK了。

此事件的处理是在表示无限循环的块循环(循环)中执行的。也就是说,EA将处理这个事件直到我们禁用它。客户端使用OnTICK函数来处理NeXiTK事件(步骤5)。在步骤6中,控制焦点转移到EA MyTE。使用四个自返回消息,它实现了以下功能:Check.、Open.、Check.、Close.。它被称为自返回,因为EA对象向自身发送消息。

此外,CARTIED专家类的这些功能也包含在循环(2)块中。2表示循环由两个遍历组成。为什么是2?因为它处理两个方向的交易——长仓库和短仓库(从第7步到第10步)。在步骤11中,焦点转移到客户端。

步骤12和13分别负责初始化和删除EA对象。

图 1. UML 结构0

图 1. UML 结构1

图10。Test-Talk Excel M.5的SD图

通过这种方式,我们获得了主要的设计技巧。借助创建的图形,开发者的工作被优化了。现在,我们可以开始编写文件TestTyTraveExt.MQ5的代码。当然,你也可以不用地图。然而,当您拥有复杂的EA时,图表的使用减少了错误的可能性,并允许您有效地管理交易系统的开发。

现在,我们使用EA模板来创建TestTuffExalExt.MQ5。

我们在全局级别上创建了一个CATTICE专家类MyTE实例。

现在让我们填写OnTik()函数的主体。

我们编写的类函数如下:

for(long dir=0;dir<2;dir++)

     {

      myTE.CheckSignal(dir);

      myTE.OpenPosition(dir);

      myTE.CheckPosition (dir);

      myTE.ClosePosition(dir);

     }

事件NejTik的处理类似于此。当然,我们还需要指定每个类的数据成员要使用的函数,以及其他的东西。但是让我们把这些任务留给以后的处理。现在,我们的目标是将UML图的逻辑转换成MQL5代码。

三。基于UML图开发和表达EA事务

作为一个例子,让我们为复杂的EA事务创建图表。在MQL5中,我们需要实现指定的策略,这样我们就可以在这个环境中定义它的功能。一般来说,我们的EA交易将执行交易操作;具体来说,它将产生交易信号,维持空头头寸和管理资金。这相当于一个模板交易策略。然而,为了培训的目的,我们将尝试处理这个EA。

首先,我们为我们的EA创建用例图。这与我们之前讨论的略有不同。我关注交易系统的内部环境,而忽略外部环境(图11),因为在代码中,我们只执行交易任务。

图 1. UML 结构2

图11。交易系统用例图

现在我们来定义EA的结构。假设我们将使用标准库进行开发,因为它符合交易系统的既定目标。最近,它已经大大扩展。更重要的是,它涉及到交易策略。因此,我们的目标是创建类图。这不是很简单,所以你需要耐心。

我想指出,我们认为标准库有几个原因。首先,我们尝试建立一个基于它的交易机器人。接下来,也是非常重要的,我们在使用UML图方面有一些实践。第三,也许图书馆本身也是有价值的。因此,我们可以从图书馆学到很多东西,同时试图理解它们不是非常简单的结构。

UML图结构的代码转换称为逆向工程。事实上,我们是手动完成的。专业软件可以自动执行这项工作(IBM Rational Rose,UML的可视化范例等)。但出于实用目的,我认为我们需要手动工作。

让我们使用类块创建一个基类模型,用于实现CExpert的交易策略。让我们看看CCAID类中使用的类和结构。首先,应当注意,CExpert类派生自基类CExpertBase,而基类CExpertBase又派生自基类CObject。

在图中,我们创建这些类的块,并使用带有“空心”三角箭头的线(概括)定义类之间的关系。在CCAT类模型中添加一个注释(黄色折叠矩形)。现在,中产阶级结构看起来像图12。我们称之为图形专家。

图 1. UML 结构3

图12。专家视图,初始视图

让我们看看文件Excel MQH中的代码。与其他对象一样,CExpert包括枚举ENUM_TRADE_EVENTS和ENUM_TIMEFRAMES,这是八个预定义结构MqlDateTime之一。这个类还使用其他类实例,如CExpert.、CExpert.、CExpertMoney、CExpertTrailing、CIndicators、CPositiontInfo、COrderInfo。

现在,我们需要对图表做一些修改。首先,我们指定类CExpert.、CExpertMoney、CExpertTrailing是从基类CExpertBase派生的,类CPositiontInfo、COrderInfo是从CObject派生的(我已经将其原型设置为“元类”)。

让我们用“use”构造标记CExpert类块和其他类块之间的依赖关系,并且不要忘记MqlDateTime结构和枚举。我们改变了块的颜色样式,得到下面的结构-图13。

图 1. UML 结构4

图13。专家视图,初始视图

但是,这种结构并不反映整个情况,因为已经提到了许多用于间接使用的类。他们是什么样的班级?首先,CfExtTrand类来自cTrac。后者是CobEdg的子类。

类CExpTrExchange使用枚举OrthyType Type枚举,CyMealEngor和AcQueNope也是CbEdpe的子类。类cTrad还使用CySimulink类的实例。让我们对图表做些修改。现在,我们的图表显示在下面的图14中。

图 1. UML 结构5

图14。专家视图,初始视图

再一次,图表是不完整的。例如,如果你看标准的库文件交易。MQH,您将看到cTrad使用几种不同的结构、枚举和符号信息类。如果它们被显示在图片中,则有太多的负载。这会让人难以理解。

为了解决这个难题,我在图表上使用了一个包。它封装了相关的类、枚举和其他包。我将包与接口中的所有图表元素链接起来。例如,包装CTRACE的类图可以被表示为下面的图15。

图 1. UML 结构6

图15。包装行业的类图

包C交易的类图显示了CtRead类与枚举和结构之间的依赖关系。

CObDebug基类与使用的CyStimeNoFor类之间的关系是通过接口实现的。

在接口的附近是一个图标,它与一个类图关联,其中包括一个单独的元素。单击任何界面将自动显示原始类图(图16)。

图 1. UML 结构7

图16。接口专家图

接口连接是橙色的。包CTrade旁边的类图图标指出了移动这个图表的可能性。因此,通过封装,我们可以显著提高类图的可读性。

好吧,让我们继续。类CObDUP使用指向其主体中同一类的实例的指针。因此,我们可以设置COBCEDE块相对于我们自己构造的“使用”的依赖性。

让我们来看看CcExtBasic类模型的块。基于头文件的头文件ExtrutBASE。MQH,我们可以说,这个类使用多个实例和各种类的枚举。因此,建立类模型的封装CcExtBasic及其关系是合理的。

首先,我们在包图中定义CeExtBaseC类模型。通过接口,我们显示了与基类COBEKET的关系,并与类CySimulink和ActualFipe进行了联系。接下来,使用类块和依赖项,我们指定CExpertBase类以使用下列类:CiOpen、Ci.、Ci.、CiSpread、CiTime、CiTickVolume、CiRealVolume。

前四个类是从cPRICESIES中导出的,后四个类是从CSCONE派生的。此外,CsCon类具有子类CPRICESE,后者具有子类CArrayObj。我们记得这些继承的关系是以前使用过的。在图中,它们被表示为泛化关系。

不要忘记CExpertBase类在其主体中使用枚举,比如ENUM_TYPE_TREND、ENUM_USED_SERIES、ENUM_INIT_PHASE、ENUM_TIMEFRAMES。最后枚举也由类cPrExeSeCes和C类Cype的子类使用。为了不失去关系,使图形更清晰,让我们调整图形的每个元素的样式。这样,我们得到下面的图(图17)。

图 1. UML 结构8

图17。软件包基础类图

这仍然是不完整的,我们必须做更多的工作。它生成了四个类,继承了cPrice类并使用cDouelBuffor类。此外,这四个类中的每一个都使用来自CDoubleBuffer的自己的缓存类。因此,COpen uses COpenBuffer等。CDoubleBuffer具有基类(CARRAYBULL),并使用枚举时间帧。

CARRAYBUL.NBSP继承CARRY,使用指针指向同一类的实例和枚举数据类型枚举。Classes COpenBuffer和Price Buffer(CHighBuffer,CLowBuffer,CCloseBuffer)枚举枚举时间帧。

四类继承的类C系列只使用自己的缓存类(CSpreadBuffer,CTimeBuffer,CTickVolumeBuffer,CRealVolumeBuffer)。第一个缓存类CSPRead缓冲区继承CARRAIN,另一个Cache类继承CARRayLUN。最后两类使用指向自己的班级和enum_datatype枚举从CArray的实例,这是CObject类。

类cPrimeSeCes及其子类使用类CDoubleBuffer和枚举枚举时间帧。

CSONT使用枚举序列SysIfIfOy整数和枚举时间帧的枚举。它继承了CARRAYOBJ。后者继承CAREY,使用枚举POTENTION类型,指针指向它自己类的实例和COBCUTE类。这样,我们得到了图18所示的图表。

图 1. UML 结构9

图18。软件包扩展类图

与类和包CExpert、CExpertBase、CSymbolInfo的接口原专家图,caccountinfo和对象是在下面的图19所示。

图 2. 4+1 架构视图0

图19。接口专家图

我还添加了CeExtTraseType使用的枚举枚举OrthyType。为了便于阅读,我用不同的颜色标记了不同的关系组。

让我们继续。我希望你能理解逻辑。类的模型可能与其他类和其他实体有很大关系。因此,我用一个包替换了基本图中的一些组件。

好吧,让我们来学习CSymbolInfo。如果你看符号符号的代码。MQH,您将看到基类CyScript信息使用MQL5枚举和结构。对于这个类和它的关系使用包是个好主意(图20)。

图 2. 4+1 架构视图1

图20。软件包符号信息类图

图表中的一些空白区域可以用来添加注释。我还标记了与父类CObDIKE的关系接口。包和类的原始专家图将稍作修改。稍后我将提供一个更新的版本,它将反映图表中的所有类和包。

好吧,让我们继续。让我们来看看AccountInfo.mqh中的MQL5代码。如本代码所示,CAccountInfo也使用了一些枚举。我们将在这一类与其他实体的关系之间造成的包图反映出来(图21)。

图 2. 4+1 架构视图2

图21。CAMLILNFO包装图

现在我们来讨论CcHead课程。对于这个类,我们还创建了一个包C专家,如图22所示。我们继续提高主地图的可读性。类cAcess链接到几个其他类,例如带有箭头的橙色接口线。

图 2. 4+1 架构视图3

图22。专家包图

让我们看看剩下的其他类。我们将为他们创造更多的包裹。

信号来自CExpertBase。这种关系在原始图形专家中已经显示出来了。此外,CeExtTrand信号使用CARRAYOBJ、CordReFipe、Cc指标和它们自己的类(图23)的例子。具体而言,与全班carrayobj关系的接口,把我们带到cexpertbase包图,显示出类carrayobj和其他实体之间的关系。

图 2. 4+1 架构视图4

图23。信号包图

现在我不显示所有的图表-我可以找到他们在附录专家SIMP。现在,让我们看一下包和类的更新的专家关系图(图24)。

正如您所看到的,图表中的所有关键类都封装在包中,以便使图表更易于理解。我将泛化线的颜色改为棕色,以区别于依赖线。

图 2. 4+1 架构视图5

图24。包装与类专家图

这样,我们就可以从标准库中的代码中反映出我们所能得到的一切。我们只需要为指定EA事务的事务添加块。

第一个块是CMY-Buffic块,它继承了CCAID类的事务技能。这就是我们进行这样一个漫长的逆向工程的障碍。它实现了特定的交易策略。我们还需要指定EA的基类的虚函数。

为此,我们创建了块像cmyexpertsignal,cmyexpertmoney和cmyexperttrailing,指出他们从相应的父类派生(图25)。

图 2. 4+1 架构视图6

图25。包和类的扩展专家图

每个类应该包含哪些函数和数据取决于开发人员。这里,我试图展示更广义的解决方案,而不是派生类的具体实现。因此,每个派生类,我们可以用一个清单的方法和属性包含有一个单独的图,如图8所示,它已完成。

现在让我们来看看如何在工作中使用序列图。让我提醒您,它将显示我们的EA如何在时间线上运行。

因此,我按时间顺序写EA工作的细节(图26)。

图 2. 4+1 架构视图7

图26。EA序列图

客户端是参与者。它在全局级别创建MyTalk对象CmyExpert实例(步骤1.1)。Green表示客户端的预定义事件(init、Deinit、NexTik、Trand)。序列图的逻辑在前面已经解释过了。这里,我想指出一些具体的问题。随着EA交易主体的不断增加,越来越多的代码在图形中变得越来越难以显示。

我们使用分块方法来解决这个问题。一组共同的功能是可视化的块形式。作为一个原理,它是另一个序列图。据说它是一种交互式用途。

因此,在这种情况下,我创建了一个序列图onInit反映在一个单独的图形处理客户端事件初始化逻辑。在语法上,它被定义为与关键字REF边界(参考)和用于控制令牌传递从OnInit(步骤2.1)的初始化对象的生命线。

另外,我设置了一个接口来移动到这个ONIIT序列图。也就是说,如果双击边框,就可以打开详细的OnIIT序列图(图27)。

图 2. 4+1 架构视图8

图27。ONITIT序列图

某些动作可以容易地移动到其他序列图。

例如,OnInit图包含EA去初始化相关的行动,这是mytrader_deinit处理(图28)。

图 2. 4+1 架构视图9

图28。MyTraceReDeNIT序列图

总的来说,在EA设计阶段,我有四个序列图。当然,在更正式的开发中,您可能需要其他图表。例如,我没有处理客户机上的其他事件(NeXTICK,贸易)。

总结

在本文中,我建议使用UML考虑EA事务开发过程的多维特性,用于面向对象软件系统的可视化建模。该方法的主要优点是实现了设计程序的可视化。

正如任何复杂的现象一样,UML也有其自身的缺点。开发人员应注意的缺点(冗余,语义不准确等)。

我希望EA开发方法会引起您的兴趣。如果您有任何意见或建设性的批评,我将不胜感激。

文件位置:

nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&
(nbsp;nbsp;
);
解释
1; 贸易专家MQH %METATRAIDER %/MQL5/包括 专家顾问班
2; Testl贸易专家MQ5 %METATRAIDER %/MQL5/专家 电子商务交易
3; 专家SIMP %文档%/UML项目 UML项目图
4; 软件开发 %程序文件%/SuffelIDEAsMaseDeal 软件思想建模器分布文件

参考文献:

  1. 免费的UML课程。信息技术互联网大学
  2. Jim Arlow,ILANESTATAD.UML2与统一过程实践:面向对象的分析与设计
  3. 基于UML和IBM Rational IBM的Leonenkov A.面向对象分析与设计
  4. Martin Foeler-UML蒸馏:标准对象建模建模的简要指南192简介。
  5. Paul Kimmel.UML神秘化了- 272
  6. F. A. Novikov,D. Y. Ivanov。UML
    中的建模
  7. Mark Priestly。实用的面向对象设计与UML,麦格劳希尔高等教育;第二版,2007。

本文是由Meta卫星软件公司在HTTPSE//www. MQL5.COM/RU/TorsLe/304中从俄语原文
中翻译而来的。

附加文件|下载ZIP..zip(82.35KB)软件eideasmodeler 048103.zip(1935.68KB)trade..mqh(3.5KB)test_trade..mq5(1.73KB)

 

 


MyFxtop迈投(www.myfxtop.com)-靠谱的外汇跟单社区,免费跟随高手做交易!

 

免责声明:本文系转载自网络,如有侵犯,请联系我们立即删除,另:本文仅代表作者个人观点,与迈投财经无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自网络,不代表迈投财经立场,转载请注明出处:https://www.myfxtop.cn/ea/4292.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: myfxtop@hotmail.com

9:30 - 18:00/Mon-Fri
返回顶部