外汇EA编写教程:使用MetaTrader 5中的对冲终端面板进行双向交易和头寸对冲,第一部分

内容目录

  • 你想在这篇文章中说什么?如何阅读本文
  • 第一章:双向交易组织原则1.1。元交易员5组织双向交易1.2的机会。匹配订单对冲的基础和统计1.3。元交易员5的净头寸与套期保值终端头寸1.4之间的关系。双向交易算法
    的要求
  • 第2章。安装对冲终端,首先启动2.1。安装对冲终端2.2。安装的三个步骤。安装图和问题2.3的解决方案。对冲终端首次启动2.4。对冲终端对冲和操作计算2.5.一键式事务2.6。在终止2.7之后设置止损和止损收益。生成报告2.8。货币互换示范2.9.底线2.10.更改对冲终端表2.11的外观。计划但未实施的功能
  • 第3章。在树篱码头的帽子下。操作规范和原则3.1.全局和局部轮廓。信息的上下文、传输和存储3.2.保存全球和本地信息3.3.止损止损。订购系统问题和OCO订单3.4。OCO订单能否解决双向仓库保护问题?3.5。链接到存储初始订单3.6。对冲终端的工作限制3.7。订单配对和行动判断机制3.8.分割和链接交易订单操作依据3.9。订单和事务虚拟化3.10。隐藏顺序机制3.11.适应机制3.12.性能和内存使用
  • 结论


介绍

在过去的18个月中,MetaQuotes为将MetaTrader 4和MetaTrader 5平台集成到统一的生态系统中做了大量扎实的工作。现在,这两个平台可以为解决方案共享一个统一的市场——元交易者市场,外部开发人员可以提供不同的产品。两个平台的编译器也已经统一。因此,两个平台都有一个基于mql5的通用编译器,而编程语言mql根据所使用的平台有不同的函数集。在代码库中发布的所有源代码也都已被修改,其中一些已被调整为与新编译器兼容。

这个平台的重要统一搁置了贸易部分的统一。元交易者4和元交易者5的交易模式仍然不兼容,尽管事实上,交易环境的主要部分是常见的。MetaTrader 4通过系统订单帮助独立管理交易头寸-特殊程序实体使终端中的双向交易非常简单和容易。元交易者5的目标是在交易所进行交易,其中交易者合同的主要表现是整体净头寸。MetaTrader 5中的订单只是买卖金融工具的简单说明。

这两个平台在交易执行上的差异导致了许多激烈的讨论和争论。然而,讨论属于讨论。不幸的是,自从MetaTrader 5发布以来,有不止一个解决方案可以展示交易员合约的双向头寸,正如MetaTrader 4所做的那样。虽然已经发表了许多文章,提出了各种方案,但对于大规模应用来说还不够灵活。此外,这些决策都不适用于交易所交易,而且涉及大量必须考虑的细节。

本文旨在解决元交易者平台第四版和第五版粉丝之间的争议。这将提供一个通用的解决方案来形成编程规范,并精确地按照规范实现过程。本文讨论了一个可视面板和一个虚拟功能库HedgetTerminal,它允许交易者像使用MetaTrader 4那样显示双向头寸。同时,套期保值终端的底层模型也考虑了交易指令执行的特点。这意味着它可以在场外外汇和集中交易所之间成功实施,例如,通过在莫斯科交易所的衍生品部门交易衍生品。

HedgetTerminal是一个功能齐全的交易终端,内置于MetaTrader 5中。通过虚拟化机制,改变当前头寸的表现,使交易员或交易机器人能够管理自己的独立交易头寸。不管仓库的数量或方向如何,都不重要。我想强调的是,我们讨论的是虚拟化——一种专门转换交易员合约绩效的机制,而不是它们的数量特征。

这与扭曲交易者金融活动的结果无关,而与重新建立此类活动有关。HedgetTerminal基于MetaTrader 5交易环境和MQL5编程语言。它不会给终端带来新的交易信息。它只是从不同的角度观察当前的贸易环境。这意味着HedgetTerminal基于MetaTrader 5,并且是其本地应用程序。尽管我们在它们之间发布了一个标识符,但包含更为合适,因为HedgetTerminal只是许多小型元交易员5应用程序中的一个。

虚拟化的可行性和对冲终端的存在基于三个范例:

  1. 从概念上讲,将完整的可转换头寸表示为独立的双向交易是可行的。这一声明表明,一些外部交易平台,包括为交易所交易设计的平台,具有管理双向头寸的手段。
  2. MetaTrader5的交易模型在用户级别创建订单之间的单向连接。计算表明,以某种方式设计的链接可以抵御冲突。此外,即使在某些情况下,如历史数据损坏或不可抗力,双向交易也可以在重现净值时追溯修订并作为会计结果计算。
  3. mql5中的高级API允许在mql5和metatrader 5终端之间放置标识符。换句话说,在metatrader5中,几乎所有内容都可以通过程序接口和MQL5编程语言访问。例如,您可以编写自己的终端版本,如MetaTrader 5终端中的HedgetTerminal。

本文讨论了底层算法以及HedgetTerminal的工作原理。该规范和算法确保了与本文详细讨论的双向事务的一致性。无论您是决定使用HedgetTerminal还是创建自己的库来管理自己的交易算法,您都会发现本文以及有关其延续的有用信息。

本文不适用于特定的程序员。如果你没有任何编程经验,你可以理解它。本文故意不包括MQL的源代码。所有源代码都被更具说明性的图表、表格和图片所取代,这些图表、表格和图片有计划地表示了操作原则和数据组织。我可以从经验中告诉您,即使有了良好的编程原则,看到代码的一般范式也比分析它容易。

在本文的第二部分中,我们将讨论EA和HedgeTerminalAPI可视化库的集成,然后涉及到编程。然而,即使在这种情况下,所有的工作都是为了简化对代码的理解,特别是对于新手程序员。例如,尽管HedgetTerminal是一个面向对象的应用程序,但程序中不使用类等面向对象的构造。

如何阅读本文

这篇论文相当长。一方面,这很好,因为几乎所有关于这个主题的问题都可以在这里找到。另一方面,许多用户更喜欢只阅读最重要的信息,并在必要时返回相关章节。本文对所有材料进行了全面、连贯的论述。与实体书类似,我们将在每一章中给出一个简短的总结,这样您就可以了解是否需要阅读它。

  • 第一章第一部分。双向贸易组织原则。本章包括对冲终端的主要思想。如果您不想了解更多关于双向交易组织的信息,本章就足以大致了解HedgetTerminal的工作原理。建议所有读者阅读本章。
  • 第2章,第1部分。首次安装对冲终端。本章介绍HedgetTerminal可视化面板的设置和启动。如果您不打算使用HedgetTerminal可视化面板,可以跳过此部分。如果要使用HedgetTerminalAPI库,则需要浏览本文的第2.1和2.2节。它们专门用于安装对冲终端。安装程序是所有对冲终端产品的通用组件。
  • 第3章,第1部分。在树篱码头的帽子下。标准化和工作原理。本章重点介绍了树篱终端的内部结构、算法和内部数据组织。对双向交易感兴趣的人可以在本章中搜索信息。通过开发我们自己的虚拟化函数库,同时使用大量专业的机器人算法交易者,我们可以发现这一章非常有用。
  • 第1章,第2部分。EA和HedgeTerminal及其面板之间的通信。这一章将受到那些探索这一领域的人,以及专业的算法交易者的赞赏。它描述了HedgetTerminal函数库与交易机器人体系结构协同工作的一般原则。
  • 第2章,第2部分。HedgetTerminal API的文档。包含HedgeTerminal API函数库的函数文档。本章为文件清单,不时提及。这里没有无用的讨论和丰富的文本。本章仅包括函数原型,以及结构和枚举的简短例程。
  • 第3章,第2部分。异步事务的操作基础。HedgetTerminal在工作时使用异步操作。本章包括使用它们的经验。在这一章中,所有的读者,无论他们是否打算在他们的工作中使用HedgetTerminal,都可以找到一些有用的信息。
  • 第4章,第2部分。Meta环境中多线程编程的基础。本章解释了多线程是什么,它是如何分配的,以及可以使用什么形式的数据组织。与第3章一样,与所有MetaTrader用户分享多线程应用程序开发的经验。

我希望这篇文章足够有趣,你可以从头到尾阅读。

第一章双向交易的组织原则

1.1。元交易员5组织双向交易的机会

本文以莫斯科证券交易所衍生品市场交易定价原则为例,详细阐述了交易价格形成的细微差异以及市场参与者财务绩效的计算方法。它概述了莫斯科证券交易所的价格计算,这在概念上与外汇交易中接受的计算方法不同。

一般来说,交易价格的形成是复杂的,包括元交易员终端外汇交易中隐藏的许多明显细节。

例如,交易者的订单执行详细信息隐藏在MetaTrader 4上,并且在MetaTrader 5上可见。另一方面,并不总是需要有关MetaTrader 5的详细交易信息。对于一个没有经验的用户或程序员来说,这可能会使他们很难和误导。例如,在MetaTrader 4中,要查找订单的执行价格,只需在“价格”列中查找相应的值。在MQL4编程语言中,调用orderOpenPrice()函数就足够了。在MetaTrader 5中,它需要找到所有订单执行的交易细节,审查它们并计算它们的加权平均价格。此可变价格是执行订单的价格。

在其他情况下,在MetaTrader 5中,交易环境的扩展再现性需要额外的努力来分析这些信息。提示逻辑问题:

是否有一种简单而清晰的方法可以将MetaTrader 5作为MetaTrader 4进行交易,并且可以轻松访问所有交易细节?有没有一种方法可以像MetaTrader 4那样使用MetaTrader 5分配双向交易?-这些问题的答案是:“是的,就是这样!”

让我们参考metatrader 4和metatrader 5终端的功能说明来了解这种可能性:

图例. 1 MetaTrader 4 和 MetaTrader 5 的能力图例

传说。1。元交易者4和元交易者5的能力传奇

如我们所见,“元交易者5”包含“元交易者4”的一个子集。这意味着元交易者4中的所有操作都可以在元交易者5上完成,反之亦然。元交易者5的能力不可避免地增加了交易信息呈现的数量和复杂性。这个困难可以委托给在MetaTrader 5环境中工作的特殊助理程序。这些程序可以处理这些复杂性,从而使终端性能处于同一级别。一个这样的程序,HedgetTerminal,是本章的重点。

HedgetTerminal是一个丰满的交易终端,可以在MetaTrader 5内部运行。它使用MetaTrader 5交易环境,使用MQL5语言进行转换,并向HedgetTerminal Ultimate面板提供方便的图形界面,以及用于独立算法(EA、脚本、指标)交互的EdgeTerminal API的特殊界面。

MetaTrader 4的特性使双向仓库或锁定订单成为可能。这种能力在MetaTrader 5中也可以使用,但并不十分清楚。这可以从一个特定的附加组件开始,基本上是对冲终端。HedgetTerminal内置于MetaTrader 5中,使用其环境收集订单和交易信息,并将其与仓库集成。它看起来类似于MetaTrader 4,具有MetaTrader 5的所有功能。

此类头寸可以完全或部分锁定(当同时存在多头和空头头寸时)。维持这种头寸的机会不是对冲终端本身的目标。其主要目的是将交易信息统一为组(岗位),便于分析、管理和访问。双向头寸只能存在于对冲终端,因为它们很方便。当一些交易者在同一个账户交易时,他们可能会使用多种策略,并且必须安排交易行为的分割。

此外,在外汇交易中,还必须考虑一些细节,如部分订单执行、头寸冲销、保证金变动计算、统计等。HedgetTerminal是为应对这些挑战而开发的。它为用户或EA提供了一个类似于MetaTrader 4的标准化、高级界面,可以同时在交换环境中正常工作。

1.2。匹配订单对冲与统计基础

为了管理事务处理技术和算法的一致性,需要知道哪个事务操作属于哪个算法。我强调“清楚”这个词,因为即使失败的概率很小,仓库管理的崩溃迟早是不可避免的。相反,结果将是统计腐败和使用不同算法管理同一账户的想法。

可靠的分割交易活动基于两种基本可能性:

  1. 合并或“配对”两个交易订单的可行性,因此可以定义为两个单独的开放(虚拟)仓库和开放仓库。
  2. 在所有的程序模块中,分析顺序配对的算法必须是完全确定和统一的。

确定性算法的第二个要求将在下面详细研究。现在,我们将集中讨论第一个问题。

订单是买卖订单。订单是一个定义良好的示例,其中包含许多“字段”信息。除了主要信息外,还有幻数和订单号、请求价格和订单条件。

在MetaTrader 5中,其中一个字段称为订单幻数。这是一个交易机器人或EAS的特殊领域,可以用自己的唯一数字来标记订单,所以它也被称为“神奇数字”。此字段不用于手动事务,但它对事务算法很重要,因为事务算法分析字段的值,可以查看每个订单是由它或任何其他算法在任何时候放置的。

让我们来看一个例子。让我们假设我们需要打开一个经典的牛市位置,然后在一段时间后,将其平放。为此,我们必须下两个订单。第一个命令打开位置,第二个命令关闭位置:

图例. 2. 所有订单形成了历史净持仓

传说。2。所有订单构成历史净头寸。

当我们将第二个订单发送到市场时,如果我们在“订单的幻数”字段中填写第一个订单的幻数,会发生什么情况?

之后,可以读取订单字段。如果这个值等于一阶的值,我们可以说二阶与第一阶有关,它是相反的,即结束阶。

在图表上,此对应关系如下:

图例. 3. 订单配对

传说。三。订单配对

名义上,这样的顺序可以称为配对,因为第二个顺序包含到第一个顺序的链接。第一个订单打开一个新仓库,称为初始订单或期初订单。第二个命令叫做清算。

这样的一对订单称为仓库位置。为了避免与元交易者5中的“仓库”概念混淆,我们称这对仓库为双向、对冲或对冲终端。元交易员5中的头寸将被称为净头寸或元交易员5中的经典头寸。

显然,与经典的对冲终端不同,对冲终端的数量和方向可以是任意的。如果已执行的订单未被任何其他订单引用,会发生什么情况?这样的顺序可以表示为一个活跃的双向位置。实际上,如果已放置的反向订单包含指向此订单的链接,那么该订单就是第一个订单的结束订单。这样的指令将配对,闭合双向位置的体积将在相反方向上相等。

那么让我们定义一个头寸在套期保值终端中的含义:

如果执行的订单未被任何其他订单引用,HedgetTerminal将此类订单处理为主动双向位置。

如果一个执行的订单被另一个订单引用,这两个订单将配对,HedgetTerminal将其视为合并的历史记录或关闭的双向位置。

实际上,对冲终端中的匹配订单更为复杂,因为每个订单生成至少一个交易,并且在外汇交易中有许多这样的交易。一般来说,交易过程可以总结如下:交易者通过MetaTrader 5终端下订单,打开一个新的头寸。当交易所执行此订单时,将有一个或多个事务。

与订单类似的事务包含具有更多附加信息的字段。其中一个字段包含基于事务执行的订单ID。此字段包含有关此事务属于哪个订单的信息。相反,这是错误的。订单本身不知道哪个交易属于它。发生这种情况是因为下订单时,不清楚订单是如何执行的,以及订单以后是否执行。

这样,就可以观察到行为的因果关系或判断。交易指的是订单,订单指的是其他订单。这种结构可以表示单向链表。

经典头寸是在执行订单后在MetaTrader 5中生成的,而交易属于结束订单,相反,是结束订单。这些对如下图所示:

图例. 4. 订单, 成交和交易之间的关系图例

传说。4。订单、交易和交易之间关系的图例A 6033

我们将回到这个例子进行详细的分析,因为方向对于建立一个严格判断交易者行为记录(即对冲终端)的系统非常重要。

1.3。元交易员5的净头寸与对冲终端头寸的关系

从对冲终端的角度来看,两个数量相同的反向订单可以是两个不同的位置。在这种情况下,他们的净头寸是零。这就是为什么对冲终端不使用元交易员5中的实际净头寸信息。因此,对冲终端中的头寸与元交易员5中的头寸不相关。当前净头寸仅在对冲终端开始时验证一次。反向活跃头寸的总量必须与实际净头寸一致。

如果不是这样的话,在HedgeTerminal上会出现一个警告感叹号。持仓不相等表示对冲终端中的头寸不等于元交易员5中的头寸。这种不对称性并不影响对冲终端的效率,但必须消除这种不对称性,才能进行进一步的正确工作。

在大多数情况下,当用户错误编辑excludeorders时会发生这种情况。XML是排除顺序文件,但它也可能是由服务器上损坏的订单和事务记录引起的。在所有情况下,这些差异都可以通过excludeorders实现的排除机制消除。XML文件。

1.4。双向交易算法要求

在实施双向交易算法时,需要施加严格的限制。在开发对冲终端时,它们必须符合。否则,对冲终端将很快成为一个随机工作程序。该程序将是“操作或故障概率等效”

以下是开发它的一些要求和规范:

  1. 交易者的双向头寸表达必须可靠。在HedgetTerminal中实现的任何想法都不会导致歧义或潜在的业务逻辑错误。如果某些属性或条件不满足这些要求,那么就不容易使用这种想法。
  2. 所有算法必须尽可能基于MetaTrader 5。当绝对必要时,允许将附加信息存储在文件中。虚拟算法必须接收来自交易环境的主要信息。由于大多数更改都是通过服务器传输的,因此该属性提高了总体可靠性水平,并且可以从世界任何地方访问。
  3. 所有改变交易环境的行动都必须在幕后进行。HedgeTerminal的API库不需要复杂的配置和初始化。用户应该能够“开箱即用”地启动应用程序并获得所需的结果。
  4. HedgetTerminal的可视化面板必须尽可能匹配正常的MetaTrader 5界面。对于熟悉MetaTrader 4和5的所有用户来说,它应该是一个简单易懂的可视化工具。换句话说,可视化面板对于所有用户都必须清晰、直观和简洁。
  5. 对冲终端可视化面板的设计必须考虑算法交易者的高要求。例如,面板必须是可配置的,用户必须能够更改其外观,甚至添加自定义模块;
  6. 它必须提供一个直观和简单的程序接口(API)来与外部EA交互。EA和HedgetTerminal交互的算法程序部分必须符合现有MetaTrader 4/5系统功能和定制的EA交互程序的标准。实际上,HedgetTerminal API是MetaTrader 4和MetaTrader 5 API的混合体。
  7. 对冲终端必须确保其在交易环境中可靠工作,同时考虑交易指令执行的所有细节。对冲终端基于莫斯科交易所衍生品市场的经典交易价格原则。最初,这篇文章是关于对冲终端的一篇长篇文章的一部分,然后由于空间原因将其分割成几个单独的文章。可以说,HedgetTerminal是一个实现本文所述思想的程序。

这里的许多想法不能清晰地相互分享。例如,交易中反馈的信息能力很难与信息表达的简单性共享。

另一个困难是为新手交易者创建一个简单的面板,同时为专业算法交易者提供广泛的移动性。然而,评估结果表明,这些明显矛盾的属性已经成功地在对冲终端实现。

第2章。安装对冲终端,首次启动

2.1。安装对冲终端

我们知道在对冲终端执行的所有订单都被视为仓库。仓库可以由两个成对的订单组成,一个是历史仓库关闭订单,另一个是未结未结订单。

如果在套期保值终端安装之前,账户中有一些动作和历史交易指令,从套期保值终端的角度来看,所有这些相互之间没有联系的指令都是未结指令。帐户历史记录中是否包含2-3个已执行订单并不重要。如果有数千支钢笔,HedgetTerminal会产生数千个头寸。我们能对他们做些什么?在对冲终端中,这些订单可以通过包括与初始订单相关的反向订单来“关闭”。不过,有一个缺点。如果同时安装对冲终端,订单太多,支付的经纪人佣金和利差会导致交易员崩溃。

为了避免这种情况,HedgetTerminal会在安装时启动一个专用的安装向导,并为这个问题提出不同的解决方案。让我们启动HedgeTerminal,调用向导,并详细描述它的工作。您可以从MetaTrader 5市场下载并安装HedgetTerminal演示。

与HedgeTerminal的最终版本类似,它以EA开始,并将其图标从导航栏拖动到可用图表。

拖动图标以在图表上弹出一个标准窗口以启动EA:

传说。5。HedgeTerminal发射前窗口

在这个步骤中,设置标签“允许自动交易”就足够让EA执行交易操作了。HedgetTerminal将跟踪您的订单,因为它们没有自己的事务逻辑,但事务执行仍然需要您的许可。

为了使EA能够开始交易,必须在MetaTrader 5的个人权利面板中授权EA交易许可证。

图例. 6. 启用自动交易

传说。6。启用自动交易

HedgetTerminal旨在避免冗长和复杂的配置。

这就是为什么所有可用的设置都包含在一个特殊的XML文件中。对于HedgeTerminal,唯一明确的参数是设置文件的文件名:

图例. 7. HedgeTerminal 面板的设置窗口

传说。7。Hedget终端面板设置窗口

稍后将讨论这些设置的性质和修改它们的方法。

按“确定”后,HedgetTerminal安装向导提示安装过程开始。安装过程在metatrader 4和metatrader 5终端的标准共享目录中创建了几个文件。

HedgeTerminal需要权限来安装这些文件:

传说。8。安装开始对话框

如果您不打算在计算机上安装某些文件,请按“取消”。在这种情况下,HedgetTerminal将完成工作。要继续安装,请单击“确定”。

以下对话框的外观将取决于您如何启动HedgetTerminal的帐户。如果交易账户中没有执行任何交易,对冲终端将完成其工作。

如果已经执行了一些交易,HedgetTerminal将显示以下对话框:

图例. 1 MetaTrader 4 和 MetaTrader 5 的能力图例0

传说。9。HedgetTerminal首次启动的检测对话

在上图中,HedgetTerminal识别五个有效订单。在您的情况下,它们的数量会有所不同(可能非常大,等于帐户生存期内执行订单的总数)。这些订单不能与仓储订单配对,因此从对冲终端的角度来看,它们是活跃的头寸。

HedgetTerminal推荐几种方案。

  1. 从HedgetTerminal中排除这些订单:“您可以将它们隐藏在HedgetTerminal中…要隐藏这些订单,请单击“是”并转到下一步。如果您选择此项目并按Yes,HedgetTerminal会将它们放入一个特殊列表,然后停止在净头寸中计算它们的贡献和财务结果。只有在目前没有净头寸的情况下,这些订单才会被列入清单。如果您有一个或多个仓库类型,HedgetTerminal将弹出一个额外的对话框,建议关闭现有仓库。
  2. 如有必要,保留订单将在稍后关闭:“您可以稍后手动关闭…………………………………………………在这种情况下,您需要执行五个反向事务。在这种情况下,如果按“否”,对冲终端将被激活并反映在“活动”列中(即,作为活动位置)。稍后,这些订单可以通过对冲终端面板中的其他订单关闭。稍后,它们将转换为仓库收据,并将其转移到“历史记录”列(历史记录仓库)。如果这些订单很大,最好隐藏它们,而不是重新打开所有正在执行的订单并支付经纪人费用。
  3. 你可以停止安装:“如果你还没有准备好再次按下取消键。”在这种情况下,HedgetTerminal完成了它的工作。如果您选择此项并按“取消”,HedgetTerminal将停止其工作。

如果在安装HedgeTerminal时没有激活位置,安装将在此阶段终止。

如果您选择第二个选项,并且您有一个或多个未平仓合约,HedgetTerminal将调用另一个对话框提示您平仓:

图例. 1 MetaTrader 4 和 MetaTrader 5 的能力图例1

传说。10。建议自动关闭对话框

对冲终端需要关闭所有执行的订单,因为所有执行的订单都放在排除列表中。如果没有净头寸,那么以下任何订单都将从新的净头寸开始。在这种情况下,对冲终端的方向和数量是相同的,并确保它们与对冲终端的总净头寸不同步。

HedgetTerminal可以自动为您清算所有净头寸:“HedgetTerminal可以自动清算所有活跃头寸。”如果您可以接受,请按“确定”。在这种情况下,它试图清算它的头寸,如果它成功了,它就完成了它的工作。如果由于某种原因无法关闭位置,则会进入手动关闭对话框。如果选择手动关闭仓库,请单击“取消”,如果要手动关闭仓库,请按“取消”。

在上一个对话框中选择手动关闭或自动关闭时,将调用手动关闭对话框。

图例. 1 MetaTrader 4 和 MetaTrader 5 的能力图例2

传说。11。建议选择手动关闭对话框

这里的所有活跃头寸必须通过MetaTrader 5手动关闭或通过按Cancel终止。所有位置都已关闭。按“重试”。

2.2。安装的三个步骤。安装图和可能问题的解决方案

如果我们尽可能简化安装过程,可以将其简化为三个步骤:

  1. 在安装对冲终端之前,所有当前活跃的净头寸都在MetaTrader 5终端中关闭。
  2. 启动图中的Hedget终端,在单独的安装窗口中按Yes开始安装。此时,HedgetTerminal将安装操作所需的所有文件。
  3. 如果出现,请在下一个窗口中选择第二个项目,然后按Yes。在这种情况下,当对冲终端启动时,不发生活跃头寸,先前执行的订单信息将自动转移到排除订单。XML文件,因为不需要关闭任何活动位置。

最简单的描述方法是在启动HedgetTerminal时关闭所有位置,并在HedgetTerminal安装向导中按两次“是”。

安装向导的完整配置如下图所示。它将有助于回答此问题并正确执行安装:

图例. 1 MetaTrader 4 和 MetaTrader 5 的能力图例3

传说。12。安装向导

如果HedgetTerminal安装无法正确执行或需要从计算机中删除,应采取什么措施?在这种情况下,您只需要删除所有已安装的文件。为此,请转到您共享数据的metatrader文件夹(通常,它位于:c:/users/<您的用户名gt;/appdata/roaming/metaquotes/terminal/common/files/)。如果您打算从所有帐户中删除有关HedgetTerminal安装的信息,请搜索此目录中的“HedgetTerminal”文件夹并将其删除。如果您只想从您的确认账户中删除有关HedgetTerminal安装的信息,请转到/HedgetTerminal/brokers目录并选择包含您的业务名称和帐号的文件夹,例如“经纪人名称-帐号”。删除此文件夹。下次HedgetTerminal启动此帐户时,安装向导将再次启动。

在安装并连接到终端上的帐户后,HedgetTerminal已经开始工作。当对冲终端打算安装在对冲终端已经工作的账户中时,可能会发生这种情况。正如您已经知道的,安装过程包括创建和配置系统文件。如果所有这些文件都是在另一台计算机上正确创建和配置的,则无需安装HedgetTerminal。通常,这些文件存储在c:/users/<您的用户名>/appdata/roaming/metaquotes/terminal/common/files/hedgetterminal中。只需将此文件夹复制到计算机上的同一位置。复制目录后,再次启动HedgetTerminal。由于所有文件都存在并已配置,因此不会调用安装向导。在这种情况下,活动位置的显示类似于其他终端和计算机的显示。

安装HedgetTerminalAPI并在测试模式下使用库。HedgeTerminal的实现可以用作程序的可视面板或函数库。-对冲终端API。该库包含一个类似的安装向导,在HedgetTerminal首次实时启动时调用该向导。使用此库时,安装文件类似。当第一次调用任意函数时,EA会弹出一个消息框,提示您开始安装。在这种情况下,用户必须做同样的事情-在调用HedgetTerminalAPI之前清理所有位置并执行三个安装步骤。

当库在测试模式下启动时,不需要安装HedgeTerminal。因为在测试模式下,EA每次都会使用一个新的虚拟帐户,所以不需要隐藏以前执行的订单和安装文件。设置保存在文件设置中。XML。在函数库中,可以通过调用相关的函数语法来定义它们。

2.3。对冲终端启动,第一次启动

在HedgetTerminal安装所有工作所需的文件后,它将启动并在图表上显示其面板:

图例. 1 MetaTrader 4 和 MetaTrader 5 的能力图例4

传说。13。对冲终端首次启动,外观

由于所有现有订单都是隐藏的,因此此处不显示活动位置。面板的左上角包含一个用于对冲终端的菜单按钮和一个用于显示终端状态的专用图标。该按钮具有以下功能:

  • 图例. 1 MetaTrader 4 和 MetaTrader 5 的能力图例5-表示面板演示已启动。它不支持真实账户中的交易,只显示持有的Audcad和VTBR*品种。在此模型下,位置历史也限制在最后10个关闭位置。
  • 图例. 1 MetaTrader 4 和 MetaTrader 5 的能力图例6-表示对冲终端中的头寸与元交易员5中的净头寸不匹配。这不是一个严重的错误,但需要消除。如果HedgetTerminal安装正确,请参阅本文中描述如何消除错误的部分。
  • 图例. 1 MetaTrader 4 和 MetaTrader 5 的能力图例7-此图标表示不可交易。将鼠标悬停在图标上,从弹出提示中找到问题的根源。可能的原因:与服务器断开连接;EA禁止交易;EA不允许在MetaTrader 5中交易。
  • 图例. 1 MetaTrader 4 和 MetaTrader 5 的能力图例8-此图标表示允许交易;对冲终端可以执行任何交易操作。

现在,HedgetTerminal已经启动,并准备进行多个交易,以查看它们的显示方式。如果对冲终端已经在外汇市场推出,则可以对Audcad品种采取交易行动。在这种情况下,只有在没有净敞口头寸的情况下才能取得成功,如在对冲终端安装的情况下。如果出于某种原因,情况并非如此,那么清算所有活动。

如果HedgetTerminal在一个与莫斯科交易所相连的账户中启动,它只能与VTBR-13.15或VTBR-06.15等期货品种进行交易。如图所示,通过标准窗口“新订单”以当前价格购买0.4手Audcad。稍后,订单和已执行的交易将显示在终端的订单历史记录中:

图例. 1 MetaTrader 4 和 MetaTrader 5 的能力图例9

传说。14。元交易员5及其交易
中的历史订单

激活位置栏将包含相应的0.4手多位置:

图例. 2. 所有订单形成了历史净持仓0

传说。15。元交易员5中的活跃头寸

同时,对冲终端将历史头寸显示为活跃头寸:

图例. 2. 所有订单形成了历史净持仓1

传说。16。对冲终端中的主动双向头寸及其交易

正如我们所看到的,结果是一样的。对冲终端中的头寸对应于元交易员5中的净头寸。

请注意,如果添加仓库,对冲终端中的仓位包含该仓位的已执行交易(要查看,请按图例. 2. 所有订单形成了历史净持仓2使仓位最大化)。

一些活动位置可以隐藏。要执行此操作,只需在vol.(vol.)字段中输入新的volume值。新卷应小于当前值。本期交易量与新交易量的差额,由新订单补充,形成历史头寸,并在相应的历史头寸中显示。在此字段中输入0.2的值,然后按Enter键。短时间后,第一笔历史交易的活跃头寸数量增加到0.2,而历史头寸数量为0.2手(0.4-0.2=0.2)。

图例. 2. 所有订单形成了历史净持仓3

传说。17。对冲终端双向历史头寸

换句话说,我们关闭了一半的活跃位置。历史和活跃头寸的一般财务结果将与终端中的相同。

现在,我们需要清算剩下的活动。为此,按下对冲终端中的关闭按钮图例. 2. 所有订单形成了历史净持仓4:

图例. 2. 所有订单形成了历史净持仓5

传说。18。对冲终端双向分闸按钮

当按下此按钮时,其余位置必须按相反顺序关闭并转移到历史位置栏。活跃头寸将以这种方式结算(元交易员5或对冲终端)。

2.4。套期保值与经营计算

在本节中,我们将介绍几种使用HedgetTerminal的方法,并以几个双向位置为例。

我们目前没有任何活跃的职位。在Audcad中打开一个0.2手多位置。为此,打开“新订单”对话框窗口并放置相应的订单。打开后,通过反向位置锁定-通过MetaTrader 5终端出售0.2只手。

此时,HedgetTerminal和MetaTrader 5终端窗口中的结果不同。对冲终端显示两个位置:

图例. 2. 所有订单形成了历史净持仓6

传说。19。对冲终端的反向双向头寸

在MetaTrader 5中,没有迹象表明:

图例. 2. 所有订单形成了历史净持仓7

传说。20。净头寸
,元交易员5中缺少一项活动

让我们评估一下结果。执行了四项交易。它们位于下图中的红色框中:

图例. 2. 所有订单形成了历史净持仓8

传说。21。元交易员5交易执行结果

将这些交易的形式设置为:

类型 方向 价格 交易量 利润、积分
购买 &在 098088 0、2
&退出; 098089 0、2
购买 &在 098207 0、2
&退出; 098208 0、2

表1。交易
显示在MetaTrader 5终端上

很明显,四笔交易有两点。每一点的价值约为每手0.887美元。因此,财务结算为每单位0.18美元(0887*0,2*1)或每单位34美分。“利润”栏显示结果是正确的。净利润是34美分。

现在看看HedgetTerminal中的结果:

图例. 2. 所有订单形成了历史净持仓9

传说。22。对冲终端双向头寸的历史结果

起初,他们看起来明显不同。让我们计算两个双向位置的结果:

方向 入场价 外观价格 利润、积分 利润,美元
购买 098088 098208 零点零零一二零 21、28
098089 098207 -0.00 -20,92

表2。仓库
如HedgetTerminal所示

两者之间的差额为0.34美元(21,28美元-20,92美元),与净交换结果完全相同。

2.5。一键交易

HedgetTerminal使用独特的管理系统。这是基于直接在活动仓库的字段中输入所需的值。这里没有可供选择的管理方式。

例如,要为活动存储设置停止损耗,只需在停止损耗字段中输入所需值,然后按Enter键:

图例. 3. 订单配对0

传说。23。在表格中直接输入止损位置

同样,交易者可以通过这种方式修改交易量、设置或修改止损头寸以及更改初始注释。

通常,对冲终端中的头寸与元交易员4/5中所示的头寸类似。仓库表的每一列使用与metatrader终端相同的标识名称和值。也有不同之处。因此,对冲终端中有两个头寸注释,元交易员中每个头寸只有一个注释。这意味着在HedgeTerminal中,仓库由两个订单组成,它们都有自己的注释字段。由于HedgetTerminal不使用这些注释来保存技术信息,因此它可以用于创建开放和扁平的注释。

HedgeTerminal提供了一个添加默认情况下不可用列的机会。例如,它可以反映打开的EA名称的列。用于设置的部分。XML文件配置描述了如何执行此操作。

2.6。设置停止和停止,然后设置停止

对冲终端允许根据止损或止损头寸进行清算。

让我们看看是怎么回事。为活跃头寸设置止损和止损头寸,并等待触发其中一个价格。在我们的例子中,停止位置被触发。它关闭仓库并将其移动到历史事务列表中。

图例. 3. 订单配对

传说。24。双向位置及其停止和停止的历史记录

停止位置的绿色标记表示通过触发停止位置关闭该位置。除了停止丢失信息外,还包含位置激活时可用的停止丢失信息。同样,如果触发停止位置,停止位置单元格将以粉红色突出显示,停止位置将不着色。

HedgeTerminal支持尾部停止,并允许在未来版本中编写带有停止逻辑的特殊自定义模块。对冲终端的当前尾部停止与元交易员终端的不同。要启用,需要在相应位置的停止单元格中输入停止价格。当设置停止位置时,可以在单元格中用符号标记以下价格选项图例. 3. 订单配对2:

图例. 3. 订单配对 3

传说。25。对冲终端止损

标记后,对冲终端确定当前价格和止损头寸之间的距离。如果增加,止损位置将跟随价格,因此距离将保持不变。尾随停止仅在HedgetTerminal运行时工作,直到它离开田地。

在HedgetTerminal中,停止也在Buystop和SellStop订单上执行。每次设置“停止丢失”时,都会放置一个字母顺序,其中包含连接到活动位置的幻数。如果在元交易者终端中删除票据,则止损头寸将在对冲终端中消失。更改票据价格将触发对冲终端的止损变化。

停止盈利的工作略有不同。它是虚拟的,并且隐藏了经纪人的触发器。这意味着对冲终端可以根据停止位置自动关闭其位置。所以,如果你想使用停止利润触发,你的对冲终端应该继续工作。

2.7。生成报告

HedgeTerminal可以将其双向位置的信息保存到设计的文件中,该文件可以由第三方统计程序(如Microsoft Excel)加载和分析。

这个功能特别重要,因为HedgetTerminal目前没有分析和统计收集系统。此时,只支持一种报告格式-csv(逗号分隔值)。让我们看看它是如何工作的。要将双向定位信息保存在csv文件中,启动HedgetTerminal并从菜单中选择“保存csv报告”选项:

图例. 3. 订单配对

传说。26。通过“保存csv报告”菜单保存报告

当从菜单中选择这些点时,HedgetTerminal会生成两个csv格式的文件。一个包括活动位置信息,另一个包括已完成的历史信息。生成两个不同文件的原因是它们具有不同的列组合。另外,主动位置的数目可以连续变化,因此更方便分别分析。生成的文件保存在相对路径中。/对冲终端/经纪人/<经纪人名称-账号>/。这里必须有两个文件:历史记录。csv和active。猪瘟病毒第一个包含历史位置,第二个包含有关活动位置的信息。

这些文件可以载入统计程序进行分析。让我们看一下使用Microsoft Excel的过程。启动程序并选择“数据”->“来自文本”。当数据导出向导出现时,选择分隔符的模式。在随后的窗口中,选择分号作为分隔符。按“下一步”。修改后续窗口中浮点数的一般表示形式。为此,请按“详细信息”。在出现的窗口中选择周期字符作为整数和小数分隔符:

图例. 2. 所有订单形成了历史净持仓5

数字。27。将csv报告导出到Microsoft Excel

按“”,然后按“完成”。有关当前职位的信息将包含在出现的表中:

图例. 3. 订单配对 6

数字。28。将有关活动职位的信息导出到Excel

历史位置的数据可以以同样的方式加载到下一页。列数将与HedgetTerminal中的实际列数相对应。如果从HedgetTerminal面板中删除一列,则该列将不包括在报告中。这种方法有助于仅根据所需数据形成报告。

该程序的后续版本将允许保存XML和HTML格式的报告。添加后,保存HTML格式的报告将类似于MetaTrader 5中的标准HTML报告,但它包括一个完整的双向仓库。

货币互换示范

货币互换是两种双向交换交易的组合,总交易量相同,但估值日期不同。

简单地说,互换是指在以两种货币持有净头寸时支付累积利息的衍生工具操作。

在MetaTrader 5中没有净头寸的历史记录。历史订单和交易构成另一种历史清算。因为没有历史仓位,交换被分配给历史上已经关闭的订单。

图例. 3. 订单配对

传说。29。作为独立交易的货币互换

这将更准确地表明,由于净头寸延期,掉期作为独立的衍生工具操作出现。

对冲终端的当前版本不支持掉期重复,但未来版本将使用此选项。交换将在历史记录部分单独显示。交换标识符将对应于累计净头寸标识符。掉期交易将包括货币对的名称及其财务结果。

2.9的底线。

与元交易员类似,HedgetTerminal在交易表单的最后一行显示整个账户的一般属性。对于活动和历史仓库表,这些属性及其值如下:

    Balance – 总余额。等于 MetaTrader 里活动持仓窗口中的类似数值 “盈利“。这不考虑来自未平持仓的浮动盈亏。
    Floating P/L – 浮动盈亏。这等于所有当前活动持仓的利润总和。
    Margin – 包含质押资金与账户余额的百分比。可以从 0% 到 100% 变化。表示一定程度的资金负载。
    Total P/L – 包含了所有平仓的利润和亏损总和。
    Pos.:# – 显示的历史仓位的数量。

为了正确显示底线,您需要在系统中添加“Arial Round mt Bold”字体。

2.10。更改HedgetTerminal表的外观

如前所述,HedgetTerminal在EA启动窗口中只有一个显式参数。即设置文件名。这是因为HedgetTerminal设置不能放置在EA设置窗口中。它们太多了,对这扇窗户来说太特别了。这就是为什么所有设置都放在设计的配置文件“设置”中的原因。XML。每个起始边缘终端都可以有自己的设置文件。这使您有机会为所启动的每个版本的EdgeterMinal分别进行配置。

HedgetTerminal目前不允许通过可视设置窗口编辑此文件。因此,改变HedgetTerminal行为的唯一方法就是手动编辑文件。默认情况下,设置文件以最佳方式配置,因此大部分时间不需要修改其内容。当需要编辑时,可能会出现这种情况。这样的编辑对于微调和自定义面板的外观是必要的。例如,编辑文件时,会删除不必要的列,反之亦然,可以添加默认情况下未显示的列。

让我们看看这个文件的内容以及如何自定义它。为此,请在HedgetTerminal的安装目录中找到此文件。如前所述,此目录位于地址C:/users/<您的用户名>/appdata/roaming/metaquotes/terminal/common/files/hedgetterminal。文件设置。XML应该在其中。用任何文本编辑器打开它:

<!--This settings valid for HedgeTerminal only. For settings HedgeTerminalAPI using API function and special parameters.-->
<Hedge-Terminal-Settings>
        <!--This section defines what columns will be showed on the panel.-->
        <Show-Columns>
                <!--You can change the order of columns or comment not using columns.-->
                <!--You can change the value of 'Width' for a better scaling of visual table.-->
                <!--You can change the value of 'Name' to install your column name.-->
                
                <!--This columns for tab 'Active'-->
                <Active-Position>       
                        <Column ID="CollapsePosition" Name="CollapsePos." Width="20"/>
                        <!-- Unset this comment if you want auto trading and want see name of your expert:
                        <Column ID="Magic" Name="Magic" Width="100"/>-->
                        <Column ID="Symbol" Name="Symbol" Width="70"/>
                        <Column ID="EntryID" Name="Entry ID" Width="80"/>
                        <Column ID="EntryDate" Name="Entry Date" Width="110"/>
                        <Column ID="Type" Name="Type" Width="80"/>
                        <Column ID="Volume" Name="Vol." Width="30"/>
                        <Column ID="EntryPrice" Name="EntryPrice" Width="50"/>
                        <Column ID="TralStopLoss" Name="TralSL" Width="20"/>
                        <Column ID="StopLoss" Name="S/L" Width="50"/>
                        <Column ID="TakeProfit" Name="T/P" Width="50"/>
                        <Column ID="CurrentPrice" Name="Price" Width="50"/>
                        <Column ID="Commission" Name="Comm." Width="40"/>
                        <Column ID="Profit" Name="Profit" Width="60"/>
                        <Column ID="EntryComment" Name="Entry Comment" Width="100"/>
                        <Column ID="ExitComment" Name="Exit Comment" Width="100"/>
                </Active-Position>
                <!--This columns for tab 'History'-->
                <History-Position>
                        <Column ID="CollapsePosition" Name="CollapsePos." Width="20"/>
                        <!-- Unset this comment if you want auto trading and want see name of your expert:
                        <Column ID="Magic" Name="Magic" Width="100"/>-->
                        <Column ID="Symbol" Name="Symbol" Width="70"/>
                        <Column ID="EntryID" Name="Entry ID" Width="80"/>
                        <Column ID="EntryDate" Name="Entry Date" Width="110"/>
                        <Column ID="Type" Name="Type" Width="40"/>
                        <Column ID="EntryPrice" Name="Entry Price" Width="50"/>
                        <Column ID="Volume" Name="Vol." Width="30"/>
                        <Column ID="ExitPrice" Name="Exit Price" Width="50"/>
                        <Column ID="ExitDate" Name="Exit Date" Width="110"/>
                        <Column ID="ExitID" Name="Exit ID" Width="80"/>
                        <Column ID="StopLoss" Name="S/L" Width="50"/>
                        <Column ID="TakeProfit" Name="T/P" Width="50"/>
                        <Column ID="Commission" Name="Comm." Width="40"/>
                        <Column ID="Profit" Name="Profit" Width="50"/>
                        <Column ID="EntryComment" Name="Entry Comment" Width="90"/>
                        <Column ID="ExitComment" Name="Exit Comment" Width="90"/>
                </History-Position>
        </Show-Columns>
        <Other-Settings>
                <Deviation Value="30"/>
                <Timeout Seconds="180"/>
                <!-- If your computer is not fast enough - set a value 'Milliseconds' greater than 200, such as 500 or 1000. -->
                <RefreshRates Milliseconds="200"/>
        </Other-Settings>
</Hedge-Terminal-Settings>

本文档包含一个用XML标记语言编写的特殊文档,描述HedgeTerminal的行为和外观。

编辑开始前的主要工作是创建备份以防止意外损坏。该文件有一个层次结构,由几个相互嵌入的部分组成。主要部分称为&lt;hedge terminal settings&gt;,其中包括两个主要部分:&lt;show columns&gt;和&lt;other settings&gt;。根据它们的名称,第一部分调整显示列及其条件宽度,第二部分设置面板本身和HedgetTerminalAPI库。

更改大小和列名称。让我们参考“显示列”部分并考虑其结构。基本上,此部分包含两列:一列是“活动”列中的“活动位置”表,另一列是“历史”列中的“历史位置”表。每组列如下:

<Column ID="Symbol" Name="Symbol" Width="70"/>

列必须包含标识符(id=“symbol”)、列名(name=“symbol”)和条件宽度(width=“70”)。

标识符包含唯一的内部列名。它提示HedgetTerminal如何显示此列以及要放入哪些值。标识符不能被更改,它应该能够被HedgetTerminal支持。

列名定义将在表中显示的列名。如果名称更改为其他名称,例如name=“currency pair”,则下次启动HedgetTerminal时将显示修改后的符号:

图例. 7. HedgeTerminal 面板的设置窗口

传说。30。在HedgetTerminal面板中修改列名称

此更改属性允许创建面板的本地化版本,即列名称将以首选语言显示,如俄语:

图例. 3. 订单配对

传说。31。局部对冲终端

下一个标签包含列的条件宽度。面板启动后,图形引擎会根据窗口宽度自动对齐表的大小。更宽窗口的每一列也更宽。无法精确设置列宽,但可以通过设置列的基本宽度来指定比例。当窗口宽度为1280像素时,基本宽度是以像素为单位的列宽。

如果显示更宽,则列的实际大小将变大。要了解统一缩放的工作原理,请将标题的列宽设置为240个条件像素:width=“240”。然后保存文件并重新启动面板:

图例. 4. 订单, 成交和交易之间的关系图例0

传说。32。名称列宽设置为240像素。

军衔范围明显扩大。但是,应该注意的是,它获得的宽度是以其他列宽为代价的(“条目ID”和“条目日期”)。

其他列看起来不好,最终值与允许的宽度不匹配。应仔细修改列大小,以找到每个列的最佳大小。标准设置已经是主显示的精确值,一般不需要更改。

删除列。除了更改列的大小及其列标题之外,还可以添加或删除列。例如,让我们尝试从列表中删除item name列。为此,只需在设置中注释掉列标签。XML文件(以黄色突出显示):

<Column ID="CollapsePosition" Name="CollapsePos." Width="20"/>
<!-- 如果您要自动交易并查看 EA 名称, 则取消注释:
<Column ID="Magic" Name="Magic" Width="100"/>-->
<!--<Column ID="Symbol" Name="Symbol" Width="70"/>-->
<Column ID="EntryID" Name="Entry ID" Width="80"/>

在XML特殊标签中&lt;!-带批注的内容-&gt;具有批注功能。注释列必须在标签中。修改文件并保存后重启HedgeTerminal后,其列集的历史位置将改变。它不包含显示标题的列:

图例. 4. 订单, 成交和交易之间的关系图例1

传说。33。从激活位置表单中删除项目名称列

您可以一次删除多个列。

让我们对除名称和利润规模之外的所有列进行注释,然后在图表上重新启动HedgetTerminal:

图例. 4. 订单, 成交和交易之间的关系图例2

传说。34。从HedgetTerminal面板中删除主列

正如我们所看到的,对冲终端表已经大幅缩水。每一列都应小心删除。在某些情况下,它们包含仓库管理的元素。在我们的情况下,允许反向头寸,并删除其交易列。尽管“利润”列可以从激活的职位表单中删除。但是这个列包含一个关闭按钮。在这种情况下,关闭按钮的消失将阻止位置的关闭。

添加列并显示EA别名。如果HedgetTerminal与它们一起工作,则可以删除和编辑列。将来,用户可以创建自己的列并计算自己的参数。这些列可以通过外部接口指示器ICustom连接,并与用XML编写的扩展进行交互。

目前还没有这样的功能,只有HedgetTerminal才能支持这些列。它可以由面板支持,但设置中未显示的列是默认的,包括EA的幻数。

它不仅可以用手打开,还可以用机器人打开。在这种情况下,可以显示每个位置的计费机器人标识符。注释掉列的标签,包括设置文件中显示的EA数。让我们取消评论:

<Column ID="Magic" Name="Magic" Width="100"/>

保存更改并重新启动面板:

图例. 4. 订单, 成交和交易之间的关系图例3

传说。35。在HedgetTerminal表中添加幻数

如上图所示,出现了一个名为“magic”的列表。这是开放式EA的标识符。仓库是手动打开的,因此标识符为零。通常,机器人打开的位置包含一个不等于零的标识符。在这种情况下,对应于ea的幻数将显示在列中。

显然,看到EA的名字要比看到数字方便得多。HedgetTerminal有这个选项。从实验酶中提取EA别名。并替换相应的数字显示。

例如,如果您的EA称为“expro 1.1”,幻数为123847,请将其放在专家别名的&lt;专家别名&gt中。XML文件;标签部分足够:

<Expert Magic="123847" Name="ExPro 1.1"></Expert>

从现在开始,当你的机器人打开一个新仓库时,它将有它的名字:

图例. 4. 订单, 成交和交易之间的关系图例4

传说。36。在“魔力”列中显示EA的名称

机器人的数量和名称没有限制。这里唯一的条件是它们的数字是不同的。

对冲终端的其他设置。我们已经描述了当前可视面板的所有可用设置。下一部分-lt;other-settings&gt;包含定义终端内部工作的设置。请注意,程序使用这些默认设置调用HedgetTerminalAPI库。EA可以通过特殊设置更改这些设置的当前值…功能。要获取这些设置的值,EA只需要调用一个特殊的get…功能。我们将描述有关设置标签的更多详细信息。

<Deviation Value="30"/>

包括与现行价格的极端偏差,单位价格变动最小。因此,对于有五个报价的欧元兑美元货币对,它是00003。对于RTS期货指数,该值为300点,最低价格变动幅度为10点。如果价格偏差较大,则不执行清算或价格变更。这是用来防止不利滑动点。

<Timeout Seconds="180"/>

标记包含服务器允许的最大响应值。HedgetTerminal以异步模式工作。这意味着HedgeTerminal向服务器发送事务信号,而不等待后者的响应。相反,HedgetTerminal控制事件序列,以指向成功下达的订单。此事件可能不会发生。这就是为什么设置等待超时时间如此重要的原因,在这个时间内,HedgetTerminal等待服务器响应。如果在此期间没有响应,任务将被取消,HedgetTerminal将解锁仓库并工作。

等待加班时间可以缩短或延长。默认值为180秒。

重要的是要了解,在实际交易中,此类限制从未被触及。交易信号的响应速度很快,大部分都在150-200毫秒内执行。

本文的第三部分“在HedgetTerminal的帽子下”详细介绍了HedgetTerminal的工作以及异步模式下工作的特殊性。

<RefreshRates Milliseconds="200"/>

标签设置面板更新的频率。它包含两个面板更新之间的时间(毫秒)。值越低,面板更新的频率越高,使用的CPU资源越多。如果处理器不够强大,无法处理200毫秒的更新(默认),可以通过编辑标签将其增加到500毫秒甚至1000毫秒。

在这种情况下,CPU负载将显著降低。不建议该值小于100毫秒。当更新频率增加时,CPU负载将非线性增加。重要的是要理解更新频率定义了终端的离散性。它的一些动作是由计时器定义的,并以一定的速度发生。

2.11。计划但未实施

由于这个项目的非凡能力,HedgetTerminal的灵活和非凡的架构变得可行。今天,这些功能还没有实现,但如果需要,它们将来可能会出现。主要内容如下:

使用配色方案和外观。HedgetTerminal使用自己的图形引擎。这是基于本地图形,如矩形标签或普通文本。不再使用基于图片的图形。这提供了一个机会来改变所有的显示元素,颜色,大小和字体在HedgetTerminal。当HedgetTerminal开始改变外观时,很容易创建字体描述和颜色方案来形成皮肤并加载HedgetTerminal。

连接自定义尾部停止模块。每个EA,包括HedgetTerminal,本质上也是EA,可以通过特定的程序接口计算任意度量(函数icustom())。它允许根据任何一组参数调用度量计算。尾随停止是一种基于当前价格设置新价格或保留旧价格的算法。该算法及其价格可以作为一个指标来实现。如果接受传递的参数,HedgetTerminal可以调用这些指标并计算所需的价格。HedgetTerminal可以注意变速器尾部止动机构。这样,任何HedgetTerminal用户都可以编写自己的(甚至是最不寻常的)模块来管理尾部停止。

向仓库表中添加新列。这包括自定义列。HedgetTerminal的表设计允许添加新列。在HedgetTerminal中,新列可以以类似于icustom()接口的方式进行编程和实现。每一行中的每个单元格代表一个参数(例如,开盘价或止损位置)。这个参数可以通过一个索引来计算,这意味着可以编译无限多个索引,并且可以计算每个计算位置的一些参数。如果传递给这些度量的参数是协调的,那么可以向HedgetTerminal中的表添加无限数量的自定义列。

连接扩展模块。其他算法可以通过自定义索引调用机制进行计算。例如,报告系统包含大量的计算参数,如预期收益和锐度比率。其中许多参数可以通过将计算块移动到自定义度量来接收。

复制交易记录,从其他帐户接收和转移交易记录。HedgetTerminal本质上是仓库经理。由于主要功能已经实现,很容易成为交易复印机的基础。这样的复印机将有非凡的能力复制双向元交易者4个位置到元交易者5终端。复印机将在两个方向上显示这些位置,并且可以单独管理每个位置,就像在MetaTrader 4中一样。

报告和统计。净值图表和汇总列。双向头寸计数可以分析每个策略或交易者的结果及其相应贡献。除统计外,还可以进行组合投资分析。这个报告明显不同于MetaTrader 5报告,它添加了很多东西。在摘要栏中,除了通常接受的参数如预期收益、最大提款率和盈利能力因素外,还有许多其他参数。后者的名称和值可以从自定义扩展模块中获得。与图中类似的平衡图不同,您可以使用自定义烛台来形成净值图。

列排序。通常,行首时,行可以按升序或降序排序(按秒排序)。EdgeterMinal的当前版本不支持此选项,因为排序链接事务筛选器和自定义列尚不可用。此选项将在后续版本中使用。

交易报告通过邮件和FTP发送。推送通知。HedgeTerminal可以使用系统功能发送邮件、FTP文件甚至推送通知。例如,它可以每天形成一个HTML报告并发送给列表中的用户。由于HedgetTerminal是EA管理员,它知道其他EA的所有交易行为,并且可以通知用户其他EA的交易行为。例如,如果某个EAS打开一个新仓库,HedgetTerminal可以发送一个推送通知,通知EA它正在进入一个新仓库。对冲终端还可以指示进入方向、日期、时间和数量。EA本身不需要配置,将其名称添加到别名文件就足够了。

使用正则表达式控制台筛选仓库位置。这是最强有力的发展计划。它将HedgetTerminal的工作提升到一个全新的水平。正则表达式可用于筛选历史记录和活动存储,以便只显示满足筛选器要求的那些。可以通过位于活动和历史仓库表上方的专用控制台组合和输入正则表达式。这就是未来版本的HedgetTerminal中控制台可能会出现的情况:

图例. 4. 订单, 成交和交易之间的关系图例5

传说。37。HedgetTerminal未来版本中的请求控制台

正则表达式可以形成非常灵活的过滤条件,并通过统计计算过滤存储空间。例如,只显示audcad品种的历史位置,在“符号”单元格中输入“audcad”的名称就足够了。条件可以组合。例如,特殊机器人执行的澳元兑美元头寸可以在2014年9月1日至2014年10月1日之间显示。您需要做的只是在相应的单元格中输入条件。筛选显示结果后,摘要列中的报告将根据新的筛选条件进行更改。

正则表达式将由少量简单运算符组成。但是,当它们一起使用时,它们将能够创建非常灵活的过滤器。

控制台中的以下操作员足够且必要:

    运算符=全部相等。如果从“符号”字段中获得单词audad,则将找到包含此字符串的所有标题,如audcad_M1或audcad_1。这意味着将使用隐式插入运算符。完全相等“=”要求表达式完全匹配,因此除Audcad之外的所有标题都将被排除。不包括Audcad_M1或欧元兑美元。

    operator&gt;-仅限大于指定值的值。

    operator&lt;-仅显示小于指定值的值。

    接线员!-逻辑否定。只返回那些不等于指定值的值。

    运算符-逻辑或。允许同时指定两个或多个条件。同时,为了满足标准,它只需要满足至少一个条件。例如,在表达式控制台的单元格中,“entry order”输入表达式“&gt;10106825=10106833”,将显示所有大于10106825或等于10106833的顺序标识符。nbsp;

    运算符&amp;-逻辑和。允许在一行中指定两个或多个条件,并且它们必须同时满足每个条件。在单元格中,“entry order”输入表达式“&gt;10106825&lt;10105939”显示标识符大于10106825或小于10105939的所有订单。两个标识符(如10106320)之间的位置将被过滤掉。

使用特殊命令纠正和管理职位。可以在单元格中输入其他名称,以返回数量或止损和止损头寸。这使得更复杂的仓库管理成为可能。例如,要关闭当前交易量的一半,请在相应活跃头寸的“数量”字段中输入值“50%”。

您可以在这些单元格中输入值,例如“1%”,而不是设置停止和停止。套期保值终端可以自动计算止损持仓量,并将止损持仓量和止损持仓量设置为入门价的1%。在这些单元格中可以输入后缀为“P”的数字。例如,“200P”是指一个指令:“止损和止损头寸设定为一个头寸的入门价的200点”。将来,如果在“卷”列中的事务量之前添加减号,则事务量将按符号后面的指定值关闭。例如,如果您的头寸交易量为1.0,我们打算关闭部分交易量(例如0.3),然后在交易量单元格中输入“-0.3”。

第3章。在树篱码头的帽子下。操作规范和原则

3.1。全局和局部轮廓。信息的上下文、传输和存储

HedgetTerminal的外观和交易过程与熟悉的MetaTrader 4类似。由于虚拟化和数据显示的转换,从MetaTrader 5获得的可用交易信息可能以更方便的方式显示在面板上。本章描述了创建此类虚拟化和数据包处理的机制。

如你所知,HedgetTerminal出现在几个不同的产品中。它们主要是可视面板和程序接口库。后者允许在任何外部EA中进行双向仓库管理,并可集成到HedgeTerminal可视面板中。例如,可以直接从面板关闭属于EA的活动位置。EA将获取信息并进行相应的处理。

显然,这种结构需要EAS之间的群体交互。这个小组,本质上是一个EA,必须理解发生的所有交易行为。相反,所有使用对冲终端库的EAS必须了解所有手动交易操作(通过第三方程序或使用对冲终端面板)。

一般来说,有关交易行为的信息可以从交易环境中获得。例如,当用户打开一个新仓库时,订单数量会发生变化。最终的订单可以告诉哪些项目是未结的,它的交易量是多少。有关订单和事务的信息存储在服务器上。这就是为什么它可以在所有连接到交易账户的终端上使用。这些信息可以称为全球化,因为它是通过全球渠道分发的,并且对所有人都可用。与事务服务器的通信采用请求-响应格式。

因此,这种交流可以呈现为一个整体轮廓。”“轮廓”是图论中的一个概念。简单地说,轮廓是一条闭合线,其中几个节点相互作用。这个定义可能不够,但我们将把它留给数学家。对我们来说,最重要的是当前交易过程中一些收盘行为的顺序。

并非所有必需的信息都可以通过全局轮廓传输。有些信息无法传递,因为MetaTrader 5不支持传递不明确存在的信息。交易行为的顺序是:

  1. 交易员下订单购买。
  2. 命令在某个时刻执行。
  3. 交易环境的变化。已执行订单进入历史订单列表。品种仓储总量及变化。
  4. 交易者或EA在交易环境中检测到这种变化并做出下一个决定。

在第一个和第四个动作之间需要一些时间。显然,如果只有一个交易者在账户上交易,他们知道应该采取什么行动,并等待服务器的适当响应。如果账户上同时有多个交易员或EAS交易,则可能会出现管理错误。

例如,第二交易者可以在第一步和第四步之间关闭现有头寸。你能看到潜在的问题吗?当一个地方命令被执行时,第二个命令出现了。换言之,一个结束命令被发送了两次。

如果一个交易者单独在一个帐户中手工交易,并且以同步的方式下单,那么这个例子就显得遥远而不可能。有几个机器人在他们的帐户中执行独立的交易操作,并且这种错误的概率很高。

所以HedgetTerminal是一个以异步模式工作的仓库管理器,以确保几个EAS同时工作,非常接近这些错误。为了避免这种情况,HedgetTerminal使用多线程来读取和修改活动位置。通过实现所有启动副本之间的局部轮廓机制(无论它们是HedgetTerminalAPI库还是可视面板)来实现XML文件。与活动场所互动。XML文件是局部轮廓的核心,是对冲终端的重要组成部分。下面详细描述了这种机制。

简单地说,HedgetTerminal将其工作减少到使用局部和全局轮廓,如下所示:

图例. 4. 订单, 成交和交易之间的关系图例6

传说。38。全局和局部轮廓信息交换的简化方案

HedgetTerminal中的所有交易行为(标签从图例开始)都开始在Activepositions中编写特殊标签。XML,这是职位的变更部分,将来将修改。

仓库块设置完成,本地轮廓线传递成功后,HedgetTerminal向服务器发送交易指令。例如,逆序关闭其位置。片刻之后,订单被执行,交易环境发生了变化。HedgetTerminal处理此更改,检测全局轮廓是否平滑通过以及订单是否已执行。它解锁位置并返回初始状态(图例上的标签完成)。

一种情况是订单没有执行。在这种情况下,HedgeTerminal也会解除锁定,并在MetaTrader 5终端日志中记录故障原因。

在现实中,信息交流的方式更为复杂。正如我们已经提到的,几个HedgetTerminal副本可以在MetaTrader 5终端上运行。它们可以是库或可视面板。每一本都可以作为一个倾听者和一个作家。当HedgetTerminal执行事务操作时,它是一个编写器,因为它使用设计良好的XML标记来阻止位置更改。所有其他边缘终端副本都是侦听器,因为它们定期读取文件活动位置。基于阻塞标记的XML和阻塞对仓库的更改。

此机制确保独立线程之间的信息传播。这有助于面板和使用HedgetTerminalAPI库的EAS之间的并行工作。

多线程条件下HedgetTerminal协调的实践说明:

图例. 4. 订单, 成交和交易之间的关系图例7

插图。39。近天然套期保值终端副本
之间的信息交换

这是一种非常有效的数据组织方式。阅读和写作活动。XML文件通常需要不到1毫秒的时间,在全局轮廓之后,一起发送和执行命令可能需要150-200毫秒。观察图例以了解这些数据刻度之间的差异。

绿色矩形的宽度表示局部轮廓经过的时间,蓝色表示执行事务订单的时间:

图例. 4. 订单, 成交和交易之间的关系图例8

传说。40。记录和订单在文档中执行的耗时尺度

如您所见,绿色矩形看起来更像一条垂直线。实际上,中尺度之间的差别更大。

快速的读取和记录操作有利于EAS之间复杂数据的交换,有利于建立分布式高频交易系统。

3.2。保存全球和本地信息

传统上,所有使用对冲终端的交易都可以分为两部分:

  • 当地信息。计算机中存储的文件仅通过局部轮廓传输。
  • 全球信息。此信息存储在事务服务器上。它通过全局轮廓线,可用于连接到此帐户的所有终端。

订单、交易和账户信息是全局信息。这些信息可以通过metatrader 5的特殊功能获得,例如historyordergetinteger()或accountinfoiinteger()。HedgetTerminal主要使用此信息。鉴于此,HedgetTerminal显示以下数据:

  • 对冲终端的活动和历史位置;
  • 活动停止和历史订单;
  • 历史位置的触发停止位置;
  • 活动位置、历史位置和外部注释的嵌入注释;
  • 活动和历史位置的所有其他属性不包括在本地信息列表中。

因为所有这些属性都是全局的,所以运行在不同计算机上的所有HedgetTerminal副本都显示出唯一性。例如,如果一个双向位置在终端上关闭,那么即使在另一台计算机上启动了EdgeterMinal的副本,它也将关闭。

除了全球数据外,HedgetTerminal在工作时还使用本地信息。本地信息仅在一台计算机上可用。此信息是以下属性的基础:

  • 激活位置的停止位置;
  • 历史位置未触及停止位置。
  • 激活位置的外部注释;
  • 服务标志阻止双向仓库更改。

未接触的停止位置保存在历史位置中。XML文件。其余的本地信息存储在活动位置中。XML文件。

本地数据存储意味着,如果您设置了一个Winner Stop,它只在运行HedgetTerminal副本的计算机上可见。只有你知道价格。

3.3。止损止损。订单系统问题和OCO订单

在元交易者5和元交易者4中,存在止损和止损概念。这些是保护性挡块。与元交易者4类似,当一个头寸达到一定的损失(止损)或利润(止损)时,它将关闭。在MetaTrader 4中,每个订单都有自己的停止位置。在元交易者5中,这些止损点在整体净头寸中发挥作用。

这里的问题是,净头寸与EA的双向头寸和对冲终端无关。这意味着传统的停止和停止不能用于双向位置,但这些价格可以表示为单独的提单。如果你有多个位置,有两个账单分别模拟停车和停车。一个是开盘价以上的限价,另一个是开盘价以下的限价。

事实上,如果开盘后价格达到限价指令,订单将被获利地关闭,如果价格达到限价指令,订单将停止关闭。唯一的缺点是,如果价格在一次触发后改变方向,第二个订单将不会停止现有的位置,但也会在第一次触发后触发。

由于目前没有头寸,触发第二个指令将打开一个新的头寸,而不是清算先前的头寸。

下图描述了在多个位置使用保护止动块的问题:

图例. 4. 订单, 成交和交易之间的关系图例9

传说。41。使用sellstop和sell limit命令模拟停止和停止

为了避免这种矛盾,在外汇交易中使用了OCO订单(“多个”)。

这是两张账单之间的关联,触发一张账单取消另一张。在我们的示例中,一个订单触发器和另一个订单触发器被事务服务器取消,因此不会打开新的仓库,这正是我们所期望的。此类订单的工作如下图所示:

持仓不相等0

传说。42。OCO命令停止和停止

MetaTrader 5不支持OCO订单。由于三个指令不能被约束,一个指令不能同时作为止损和止损。两个订单可以成对使用!所以这就是止损或止损。nbsp;

事实上,如果与已执行订单关联的提单被放置以初始化新的双向位置(如止损),则此结构是安全的。这里没有第二张提单,也不会形成新的双向仓位。事实上,只有三种情况:

  • 挂起列表由于某种原因被代理或用户取消。
  • 将触发挂起列表。
  • 账单没有触发。

没有其他情况。如果票据被取消,等于取消止损或停止赢。如果吊卡触发,仓库将关闭。如果未触发该命令,双向位置将保持激活状态,同时停止丢失。

即使HedgetTerminal在触发单独的触发器时被禁用,它也可以处理触发器,并了解当其启动时要按顺序关闭的位置。如果magic number字段包含特殊服务信息,则可以指示通过常规订单、止损或止损来关闭已关闭的头寸。链接和服务信息在幻数字段中的存储将在下一节中详细描述。

由于不能同时使用两个真正的保护止动器,因此在HedgetTerminal的设计中已经做出了妥协:

套期保值终端的双向头寸受实际买入和卖出指令保护,并起到止损作用。停止位置是虚拟的,仅在运行HedgetTerminal副本的计算机级别上受支持。它在全球范围内不可用。

选择止损头寸是因为它们需要可靠地触发更高的价格。如果止损不起作用,就不会造成灾难,账户也不会因追加保证金而关闭,而不触发止损会导致账户爆裂。

然而,也有机会选择一种算法来跟踪位置。您可以在实际站点和虚拟站点之间进行选择,也可以在虚拟站点和实际站点之间进行选择。停止损失和停止位置也可以是虚拟的。此时,该函数尚未实现,但如果有需要,它可能会出现。

停止位置的虚拟化降低了其整体可靠性,但并不明显。止损单是本地分发的,可用于所有对冲终端的副本。对于性能停止,使用HedgetTerminal库或HedgetTerminal面板的副本运行至少一个EA。当有多个对冲终端运行时,其中只有一个将执行止损收益。这将是第一个将一个阻塞标签放在双向位置。从这个意义上讲,在多线程模式下,HedgetTerminal的实例在读写数据方面相互竞争。

对于用户而言,通过对冲终端面板或使用EA中的虚拟库,通过手工交易停止收益和停止损失之间没有区别。这些水平之间的所有实际差异都隐藏在对冲终端的幕后。对于交易者来说,输入“止损收益”和“止损”就足够了。这些价格将同时显示,警告将以相同的颜色显示:触发其中一个相关价格。

3.4。OCO订单能否解决双向仓库保护问题?

OCO指令可以同时使用实际止损和止损头寸。他们在组织双向交易方面真的是万能的吗?这是它们的特点。正如我们已经知道的,OCO订单允许一个订单被触发,而另一个订单被取消。

这似乎可以通过两种方式保护我们的双向位置,因为在这种情况下,停止和停止可以是真正的命令,所以无需HedgetTerminal在计算机上运行。问题是在订单执行中必须考虑部分订单执行。这种性质会破坏应用程序的业务逻辑。让我们考虑一个简单的例子:

  1. 以10个合同量开仓。两个链接到OCO订单,实现止损和止损头寸设置;
  2. 在收益头寸到达时,部分执行了限售令。其中十分之七的合同已经关闭,剩下三个多个职位。
  3. SellStop订单实现的止损位置取消,因为SellLimit订单已部分执行。
  4. 持有三份合同不再具有保护性。

该场景如下图所示:

持仓不相等1

传说。43。保护停止部分执行

在设计OCO命令时,可能会出现一些反对意见,以考虑部分执行并避免批准保护性停车。可以关联两个OCO订单的交易量。这样的部分实施当然是可以预见的。然而,这将导致订单系统的逻辑更加复杂。

这里的主要问题是,即使考虑到部分执行,OCO订单也不能提供与MetaTrader 4相同的机会。例如,很难将提单与止损和止损地点放在一起。其原因是,对于两个相互关联的订单,不能考虑初始订单的触发。

编写一个真正的通用算法来管理像MetaTrader 4这样的仓库。OCO订单必须具有以下特征:

  1. 每个关联订单必须根据关联订单的执行程度进行调整。例如,如果止损收益执行10个合同中的7个,则其链接的止损必须从10修改为3(10-7=3);
  2. 对于每个链接订单,必须考虑初始订单执行的交易量。当一个交易者发出一个买入限额类型的指令,并在产生的指令中用止损和止损保护它时,这并不意味着买入限额可以保证整个交易量的执行。这些情况也必须通过成对订单来满足。
  3. 取消的一个附加条件是一对订单必须具有附加触发条件。它只能在连接到它的附加命令触发时触发。这意味着一个OCO订单必须与两个订单关联。第一个链接指向激活当前订单的触发顺序。笔链接指向取消当前订单的触发顺序。这种机制将允许创建带有初始提单的仓库。

这种机制,即使发生,对于经验有限的用户来说也是复杂的。它的适用性值得怀疑。客户机端的虚拟化,和目前在HedgetTerminal中使用的一样,更容易使用。

作为OCO订单的替代方案,MetaQuotes考虑了引入特殊停止和停止算法以实际保护某些交易订单的可能性。当然,这只是一个理论,尽管它有一个合理的核心。该算法可以在事务服务器中隐藏其实现和配置的重要组成部分,为最终用户提供一种简单而现成的保护机制。

综上所述,我们讨论了在MetaTrader 5平台上集成OCO订单的一些想法。

当订单部分执行时,OCO订单无效。对于平台的普通用户来说,它们并不十分可靠和复杂。nbsp;

3.5。存储初始订单的链接

本节检查连接到其他订单的内部存储以及它们之间绑定机制的详细描述。如前所述,“order magic”字段包含下一个订单EA的标识符。这意味着任何交易者都可以使用MQL5编程语言在该字段中输入任何整数值。在这种情况下,可能会发生冲突。当订单最初放置在新仓库中时,它将包含与现有订单的标识符匹配的EA标识符。在这种情况下,将出现错误的订单链接。

如果交易者使用的EA标识符接近零(如“1”、“7”或“100”),并且订单号明显大于这些数字(如“10002384732”),则可以避免这些冲突。我宁愿天真地相信交易员会记住这一点。这就是为什么HedgetTerminal以一种特殊的方式存储到订单的链接,以减少冲突的可能性,并且它的算法不允许含糊不清,并且在冲突发生时自动消除冲突。

“order magic”字段保存的链接是64位。因为它的宽度,这个字段可以容纳很长的数字。实际上,订单标识符的范围要小得多。为了安全起见,HedgetTerminal允许该字段使用更高的数字以特殊方式形成订单链接。让我们参考计划来展示HedgetTerminal如何保存初始订单链接:

持仓不相等2

传说。44。在HedgetTerminal中存储初始订单链接的形状

字段的顶部位(63)始终标记为1。这允许您非常快速地迭代所有订单。显然,如果下一位不等于1,则该顺序不包含指向另一个顺序的链接,可以跳过该链接。另外,将1的值赋给最高的位使得幻数非常大,并且增加了顺序标识符和HedgetTerminal中的链接的范围,以最小化冲突的可能性。

HedgeTerminal可以用服务信息填写以下三位。与订单标识符不同,HedgetTerminal在该字段中存储的订单标识符是从内到外的。首先,它填充最高的位,然后填充较低的位。在图4.44中,使用蓝色箭头指示服务信息的方向。这种存储方法使服务信息和订单标识符的范围达到一半。如有必要,可以更改它们的组合。服务信息的大小可以通过存储订单标识符位来增加。此信息可以标识仓单的类型。

关键是metatrader 4中的活跃订单可以通过停止盈亏来进行清算。这是固定价格,也就是说,订单以固定的利润或损失结算。在元交易者5中,止损和止损只能用于净头寸,不适合匹配订单。只有普通票据才能起到止损的作用。

在HedgetTerminal中,这些订单被分配特殊的标识符,以指示它们是赢得订单还是停止订单。由于幻数存储在事务服务器上,因此访问此帐户的所有交易员都可以使用服务信息。这样,即使在不同的计算机上运行的多个对冲终端副本也能获得有关触发的订单类型的信息,并能正确显示关闭的头寸。

有关订单标识符的参考信息存储在0到59位的范围内。它以标准方向存储,从右到左排列,目录ID由蓝色箭头指示。为了评估分配的存储空间,让我们计算一年内发送到莫斯科交易所的所有订单所需的存储量。

截至2013年6月13日,我的经纪人报告包含10789965471个订单的标识符。这些数字需要33.3297位(log2(10 789 965 471))或64位中的34位。2014年9月25日下的订单的标识符为13000775716。这个数字使用33.6416位。虽然在一年或四个月内有26亿个订单,但标识符的大小只增加了0.31263位,甚至小于一个数量级。我不认为太阳会在订单标识符到达第59位之前被摧毁,但我相信它不会在数百万年前发生。

HedgetTerminal不存储公共链接。为此,它对ordermagic字段进行加密,保持高位数字不变。HedgetTerminal的代码是基于数字可逆重排的,通过对可变长度密钥进行特殊加密来实现。在这种加密之后,服务信息和订单标识符相互混合,并用一个特殊的掩码隐藏起来,最终它们显示为均匀分布的1和0。使用加密有两个原因。首先,数字重排降低了重叠链接和顺序标识符的概率,然后保护HedgetTerminal的内部算法免受外部恶意或随机影响。

这个过程是绝对安全的,可逆的,不容易发生冲突。它保证,无论交易者使用EA执行什么操作,都不会影响HedgetTerminal内部算法的可靠性。这一点很重要,因为在实践中,不使用复杂的专用算法就无法管理这些链接。

同时,如果我们把自己局限于控制链接,业务逻辑的失败是不可避免的。接下来的章节将解释为什么会出现这种情况,并且他们将具体描述这些算法。也可以使用加密来避免此故障。这种限制就像硬币的反面,没有其他方法来管理对冲终端的头寸。

3.6。对冲终端工作限制

链路存储结构的特殊性表明,HedgetTerminal存储的订单链路通常使用9223372036854775808到18446744073709551615之间的数字。如果64位字段表示长符号整数类型,则为负。所以对冲终端的工作有三个限制。

第一个限制涉及与HedgedTerminal合作的交易机器人。这不是太严格。这可以看作是一种建议:

交易机器人或EA和HedgetTerminal在工作时必须具有标识符(EA的幻数)。不能超过9223372036854775808。

实际上,EA永远不会遇到这种限制,因为使用的标识符很少超过5-6位。最常见的EA标识符是“12345”或类似的东西。这种限制可能适用于存储服务信息的机器人,例如以幻数链接到其他订单。HedgetTerminal与这些EAS不兼容,不能与它们一起工作。

如果由于某种原因超出了上述限制,冲突的概率为零。后者只是一个极小的巧合,在这样的范围内,可能性是极小的。即使在这种情况下,HedgetTerminal也会使用其算法来解决这种冲突。解释链接会减慢工作速度,比较链接与现有订单,并分析此订单是否与另一个订单匹配将需要额外的时间。因此,为了避免这种情况,最好不要使用带负号的长整数。

第二个限制是严格的,但它只涉及对冲终端将连接到的经纪人和交易所:

订单标识符的数量必须介于0到2^59或576 460 752 303 423 488之间。

显然,只有59位可以用来存储顺序标识符,而不是64位。如果代理使用的标识符大于此值,则不能在工作时使用对冲终端。

第三个限制来自位置的表示方式:

HedgetTerminal与任何其他仓库管理系统不兼容。它不能与具有仓储功能的外部交易面板兼容,也不能一起使用。

3.7。顺序匹配与行为判断机制

研究了对冲终端的定位性能及其链路结构。我们不打算继续讨论管理边界命令的算法描述。例如,我们从一些其他订单中选择两个订单并链接它们。如果我们不依赖于订单链接是唯一的,并且只能有一个订单拥有的规则,那么所有可能的案例都可以分为三组:

  1. 该订单未被任何其他订单引用。
  2. 该订单由另一订单报价。
  3. 该订单由两个或多个订单报价。

第一组不会造成困难。此类订单可被视为未平仓。第三组还可以非常直接地确定成对订单的完成情况。第三组我们该怎么办?为什么一个订单被另外两个订单引用?它们中的哪一个应该与第一阶相关联,第二阶会发生什么?如果我们将配对过程表示为一个序列,则很容易回答这个问题:

  1. 我们遇到了一个不包含其他订单链接的订单。它被传输到活动订单的一部分(位置),然后在订单上连续迭代。
  2. 然后我们又接到另一个订单,引用了第一个订单。然后,在活动订单部分搜索引用的订单。如果引用的订单在本节中,则与当前订单配对,并将所有订单转移到历史位置形成的已完成交易部分。
  3. 在进一步的迭代中,我们会遇到更多的订单,其中包含第1点中描述的订单链接。然后,在活动订单部分搜索引用的订单。此搜索将不会成功,因为目标订单已从此部分转移到已完成的交易部分。由于根据当前订单未找到订单参考,因此到当前订单的链接是活动订单,并转移到活动位置。

因为顺序标识符是一致填写的,并且它们的列表是按时间排序的,所以它们可以执行顺序迭代。因此,初始订单将与包含其链接的第一个订单配对,而不考虑具有相同链接的其他订单的数量。与初始订单链接的所有其他订单都将包含在当前职位列表中。

正如我们已经提到的,该算法的迭代实现必须是完全确定和一致的。HedgetTerminal在其工作中使用了这种迭代算法。实际上,这不是一个简单的迭代,而是自第一次交易以来执行的所有交易操作的循环。实际上,每当HedgetTerminal启动时,总是从开始到当前构建一个事务操作列表。鉴于此,当前头寸实际上是开始时交易审核的结果。

因为迭代遍历所有的历史顺序,所以它还需要连续执行事务操作。这决定了如何在对冲终端执行订单。例如,在对冲终端,需要清算受止损保护的活跃双向头寸。我们知道这种双向头寸主要由两个指令组成:活跃头寸的执行初始指令和作为止损指令的买入或卖出票据。如果你想关闭你的位置,你需要删除提单和关闭你的位置在两个方向通过一个反向的顺序与相同的交易量。因此,必须执行这两个事务。HedgetTerminal异步执行所有交易指令。

这样,订单可以同时执行,即第一个订单用于取消提单,第二个订单用于订单,这将关闭仓库。然而,这将破坏行动的确定性,对冲终端无法执行。如果由于某种原因,提单没有被取消,并且仓位没有通过反向单仓关闭,则会出现歧义,因为仓位已经平了,但其止损仍然存在。最后,达到停止损失的指令可以触发并生成一个新的双向位置。这不应该发生。这就是为什么对冲终端将取消止损,并在成功取消后下达反向订单。可能在第二步中没有执行或部分执行反向顺序。在这种情况下,模糊性将被消除,因为部分执行的反向指令将清算部分活跃头寸。这是一般情况。

HedgetTerminal还实施了一系列更为复杂的操作。让我们用一个类似于前一个的例子,但这次我们只会清算一些头寸。这意味着对冲终端将启动三项行动:

  1. 删除提单作为止损;
  2. 执行指令指令将部分双向平仓交易量平仓。
  3. 新的止损点设置新的交易量,以保护活跃头寸的剩余部分。

所有这些行动都将持续进行,以避免破坏行动的确定性。预计订单执行速度会提高是很自然的,因为在并发订单的情况下,无法保证交易操作的顺序将被执行,并且可能出现歧义。连续订单处理并不意味着任何歧义。

3.8。分割和链接交易订单操作的基础

连续订单处理是不够的。这里应该指出两件事:

  • 订单可以包括多个交易。这些交易的数量可能是随机的;
  • 考虑部分订单执行,以及更常见的情况下,关闭订单的数量不等于初始订单的数量,这一点也很重要。

此订单可以由多个交易同时执行,也可以部分执行。如果您不知道原因,请参阅专门研究交易定价的文章“莫斯科交易所衍生品市场交易价格原则”。问题是,“为什么公开交易量等于公开交易量?”需要答案。在这种情况下我们能做什么?

事实上,如果我们假设有机会清算部分活跃头寸,交易量将不相等。如果我们以50个合约开仓,以20个合约开仓,当反向订单部分关闭时,活跃头寸分为两部分。第一部分中有20个合同的反向订单将成为新的历史头寸,而第二部分将保持不变,尽管数量将减少到30个合同。

这部分仓储算法已经在HedgetTerminal中实现。如果您在对冲终端面板的交易量字段中输入新的交易量值,将发生部分关闭。新的头寸将出现在历史文件夹中,当前交易量将等于新值。对冲终端可以处理这种情况,即使关闭订单的数量大于初始订单的数量!当HedgetTerminal出于某种原因将仓单放入错误的交易量时,或当经纪人取消的多个交易包括初始订单时,会发生这种情况,此时交易量将以较小的基础执行。

考虑到可能的交易量差异,需要采用通用算法来计算与此订单相关的所有交易的总交易量。在这种情况下,决定一切的是交易,而不是命令。订单量是订单的交易量。已执行订单的价格是其平均交易价格。

HedgetTerminal使用一种用于链接或拆分订单的算法。这是基于这些交易的叠加和取消。其工作基于初始仓单和形成历史仓位的仓单之间的所有交易的集成。

为了理解该算法的工作原理,我们假设两个订单需要配对并转换为历史位置。两个订单的事务数相同,执行量相同。为简单起见,订单号设置为三位数:

订单1(仓储订单)_______ 交易量(10/10)
交易第283号
交易第288号
交易第294号

表3。订单1及其交易

订单2(仓储订单) 交易量(10/10)
交易第871号
交易第882号
交易第921号

表4。订单2及其交易

让我们把它们的交易量放在一起:

持仓不相等3

表5。把订单放在一起

从每列中选择最后两个订单:_和_uu。通常情况下,它们不在同一水平上(在本例中)。

选择卷最小的事务。这笔交易是5英镑。分段反向事务是两个笔画。第一个等于交易量4(5份合同),第二个包含剩余交易量1份合同(6份合同-5份合同=1份合同)。在统一交叉口和921的第一部分中,交易量类似于5:

持仓不相等4

表6。体积减小

将合并部分转移到包含历史位置的新列。

它被绿色照亮了。将事务921的事务卷1的剩余部分保留在活动位置的初始列中。它以灰色突出显示:

持仓不相等5

表7。共享和关闭事务

在第一步中,我们合并了这两个订单并将它们转移到历史位置。让我们简要回顾一下操作顺序:

持仓不相等6

表8。分段和关闭步骤1

交易结转到历史位置。交易已经完全结束。因此,这笔交易被削减并延续到了历史地位。这就是为什么在下一步中,我们可以使用卷2来处理事务8。事务921仍然出现,其容量等于事务的第二部分。在随后的步骤中,交易量将与8的交易量同步。

在第二步中,重复和921的过程。交易的剩余量(一份合同)和交易量(288)整合到历史订单的列中。剩余交易量288等于一份合同,将保持活跃状态。

持仓不相等7

表9。分段和关闭步骤1-2

重复8和2的相同操作:

持仓不相等8

表10。分段和关闭步骤1-3

步骤4和5的实施方式相同:

持仓不相等9

表11。分段和关闭步骤1-5

第五步之后,开放式仓单的交易量将绝对等于开放式仓单的交易量。交易结转到历史地位的等级构成一个完整的历史事件。活动位置的其余部分被视为新的活动位置。在这种情况下,没有事务保持在活动位置。这意味着在这种整合之后,活跃的职位将不再存在。新的历史头寸将出现,包括所有有活跃头寸的交易。

一个事务完成后,其中的一部分将被分割成多个部分,并占用多行。为了避免这种情况,将收集事务的选项添加到统一/切割和切割交叉算法中。只需集成相同标识符的事务量:

0

表12。同一类复合交叉口

在集成之后,事务数及其卷与初始卷及其卷完全匹配。这仅仅是因为它们的交易量与最初的交易量相匹配。如果它们的交易量不同,那么在集成过程之后,这些交易将具有不同的交易量。

此算法是通用的,因为它不需要在初始订单和扁平仓库收据之间进行相同数量的事务处理。让我们看看基于这种性质的另一个例子:

1

表13。合并不同数量的订单

如我们所见,合并订单是一个成功的历史地位。尽管有很多事务,但它们的卷还是再次匹配。

现在,假设关闭订单(12个合同)的总量小于初始订单(22个合同)的总量。在这种情况下如何集成?

2

表14。订购不同体积的

如我们所见,在第二步中,仓单的交易量等于零,而初始单包含两个交易,交易量为4,交易量为6。这超出了活动顺序。这样,超额将作为一个活动的双向位置存在。在这里,历史头寸的交易转移到绿色列。最初的交易量与12份合同相符。

当仓单的交易量大于初始仓单时,仓单的单侧也有超调:

3

表15。订购不同体积的

如我们所见,最初的单笔交易量是4,而最后的单笔交易量是6,这变成了两个头寸。第一个是历史头寸,交易量为4,初始订单的交易量为625,结束订单的交易量为720。第二个头寸比率超出了成对订单的交易。包括交易量2 719。该交易在对冲终端面板的“活动”栏中产生活跃的头寸。

交易和订单可以通过算法分为历史和活跃头寸。交易量可能会有所不同。最重要的是,该算法可以将平仓的初始订单和交易量一起计算,形成一个进出口交易量相等的历史仓库。它确保了交易量不均衡和头寸复制错误导致的头寸不对称不会发生。

让我们假设在第一个示例中,经纪人取消了仓单中包含的交易:

4

表16。从历史记录中删除交易的模拟

新的净持仓量是六份合约。这相当于已取消的交易量。让我们看看HedgetTerminal的算法在这种情况下是如何工作的:

5

表17。还原完整性
的复制

如我们所见,在第二步中还有六个合同(3+2+1)。这些过剩将变成一个活跃的位置,双向位置的体积和方向等于净位置。

综上所述,综合交易算法保证了历史仓位初始仓单交易量和平仓单交易量的相等,尽管存在太多的未绑定交易。超额交易变成双向活跃头寸,即元交易员5中的净头寸等于对冲终端中所有活动的净头寸。

这种机制在追溯和实时模式下都有效,这意味着无论经纪人是否取消交易,对冲终端的净头寸始终对应于元交易员5中的精益头寸。净持仓与取消持仓的变动组合不会导致终端与对冲终端之间的净持仓不对称。

基于该算法,提出了合并不同交易量的能力。该算法是树篱终端的重要组成部分之一,保证了其作为一个自适应系统稳定工作而不需要设置。

3.9。订单和事务虚拟化

在HedgetTerminal中,每个订单和交易都有一个带有通信标识符的真实原型。然而,从对冲终端的角度来看,订单可以作为一个活跃的位置,也是历史的一部分。MetaTrader 5中的交易和订单是不可分割的实体。在平台中,可以挂起或执行订单。事务还具有固定的事务量,并且始终是已执行的事务。

在对冲终端中,相同的订单和交易可以代表不同的双向头寸。同一交易或订单可以是活动或历史位置。换言之,订单和交易在对冲终端中被分割成几个虚拟部分。此数据复制与MetaTrader 5非常不同。然而,这种再现性可以是灵活的,可以适应事务信息可追溯性的变化,并且可以集成订单和事务。

3.10。隐序机制

我们在描述HedgetTerminal安装的章节中提到了隐藏订单的机制。对冲终端可以忽略一些订单。对于套期保值终端,存在订单或交易终止,其标识符输入指定的文件excludeorders。XML。

假设我们已经为一个已经实现的特定产品进行了几次销售或账单。销售订单的总数量等于采购的总数量。这样,不管我们有多少个订单,总头寸都等于零。如果这些订单的标识符不在excludeorders中。XML文件,HedgetTerminal将它们视为双向位置。它的总位置保持为零。因此,在元交易者5中,如果净头寸为零,则可以简单地忽略订单对净头寸的贡献。

现在假设我们现在持有的S品种的净位置为零,此时执行S品种的订单集n。由于该品种没有净头寸,因此订单集n的总交易量微不足道。事实上,订单的数量和交易量是无关的,因为这些订单不占总净头寸,因为没有头寸。这意味着这样的命令可以被简单地忽略,不需要将它们表示为双向位置。

这正是HedgetTerminal在安装时当前使用的机制。如果T在安装时没有净位置,HedgetTerminal将订单集N放入异常列表。因为没有净头寸,它们的总量和数量是无关的。如果在安装HedgeTerminal时有一个净仓库,那么非常简单。在网络仓库关闭之前,不会安装它。安装后,新订单将改变净位置。该状态将与对冲终端双向头寸的净容量同步。

看来我们可以摆脱对冲终端,把执行的订单放到例外列表中。在安装的同时,可能会出现大量订单。从对冲终端的角度来看,它们都将成为双向头寸,它们的总交易量可能不同于元交易员5。

这种隐藏命令的机制可以有效地抵御历史上的帐户崩溃。这就是它的工作原理。假设有一些顺序历史。当HedgetTerminal启动此帐户时,它遍历所有订单,并基于这些订单建立双向位置。如果所有订单在开盘时间都有良好的数据,这些订单的净头寸将对应于MetaTrader 5中的净头寸。显然,对冲终端的净头寸将等于这些订单的总和。如下图所示:

6

传说。45。总体历史传奇

部分历史记录可能丢失或订单信息不正确。

如果只有一个或多个订单丢失,这无关紧要;如果帐户历史记录信息从开始或中间丢失,也无关紧要。在该账户上运行的对冲终端的净头寸等于所有可用订单的净头寸。由于缺少历史数据,订单的净位置不等于终端中的实际净位置。如图B所示:

7

传说。46。历史数据
部分丢失

为了使HedgetTerminal的净头寸与MetaTrader 5的实际净头寸同步,我们不需要知道订单是否消失或损坏。我们只需要计算这些净头寸之间的差额。在上面的示例中,MetaTrader 5终端通过五个合同打开一个多头头寸。在对冲终端,它将持有8个合同的多个头寸。这两个头寸的差额是三份合约,因为8买5买=3买。

在计算完合同余额后,我们需要根据相同的交易量下一个长的或短的订单。在我们的示例中,我们需要为三个合同下多个订单。执行订单时,HedgetTerminal将在激活位置栏中显示订单。对冲终端的净头寸总额将增加三份合约,相当于11份以上的合约。

元交易者5的头寸也将增加到8个合同。订单标识符将输入排除订单。XML列表,之后需要重新启动终端。因此,如果我们的订单标识符等于101162513,则应将以下标记写入文件:

<Orders-Exclude>
        ...
        <Order AccountID="10052699" ID="101162513"></Order>
</Orders-Exclude>

重启对冲终端后,该双向位置将消失。这样,元交易者5中的净头寸将与对冲终端中的净头寸匹配,并生成五个多方合约。操作顺序的描述如下图所示:

8

传说。47。数据完整性恢复图例

损失头寸的财务结果不会记录在对冲终端统计数据中。不幸的是,隐藏双向头寸不是交易统计的一部分。

事实上,部分历史数据不可用或损坏的可能性极低。尽管大多数MetaTrader 5用户永远不会遇到这种情况,但如果他们需要使用它,则必须建立此机制。不能完全排除在HedgetTerminal中出现程序错误的可能性。即使在这种情况下,也应该有可靠的方法来解决这些错误。

3.11。适应机制

我们研究了通过对冲终端在元交易员5中复制双向净头寸的机制。有三种机制:

  1. 交易的顺序迭代;
  2. 交易的分割与整合机制;
  3. 隐藏订单机制。

这些机制中的每一个都是针对它们的问题的,并且可以避免在它们的级别上出现模棱两可和错误。让我们把这些问题及其解决方案摆到桌面上来。第一列包含问题和可能不正确的绑定,第二列是解决这些问题的机制:

双向贸易组织中的问题、错误、歧义 误差修正机制
指向计费的连接错误;连接冲突;EA的长幻数;从历史记录中删除订单;事务操作的执行错误。 顺序序列迭代。行动判断。
交易量错误;不同交易量的订单匹配错误;部分执行订单;从历史数据中删除交易;将较小的交易转换为较大的交易。 交易分割与匹配机制。
在执行了大量订单的账户上安装HedgetTerminal;历史数据损坏;HedgetTerminal处理订单的缺陷。 隐藏订单机制。

表18。可能的误差及其消除机制

这三种机制,加上存储连接系统,确保了数据的稳定复制。从本质上讲,这些机制涵盖了所有不可预见的失败,并确保对冲终端的净头寸与元交易员5的净头寸相匹配。

3.12。性能和内存使用

HedgetTerminal本质上是一个面向对象的应用程序。由于面向对象原理的底层架构,终端效率高,存储需求低。唯一消耗资源的任务是当终端在图形上启动时,将订单和事务的历史数据提取到计算机内存中。

一旦所有必需的事务被提取到内存中,终端将打印一条消息,通知操作时间和内存使用情况。在使用Inteli7处理器的计算机上,该帐户包含超过20000个事务。启动HedgeTerminal面板和118 MB内存不到30秒。

2014.11.20 16:26:19.785 hedgeterminalultimate (EURUSD,H1)       We begin. Parsing of history deals (22156) and orders (22237) completed for 28.080 sec. 118MB RAM used.

由于不需要以图形方式重现事务,HedgetTerminalAPI库的工作速度更快,占用的内存更少。以下是同一账户的启动结果:

2014.11.20 16:21:46.183 TestHedgeTerminalAPI (EURUSD,H1)        We are begin. Parsing of history deals (22156) and orders (22237) completed for 22.792 sec. 44MB RAM used.

简单计算表明,根据程序类型提取位置需要1到1.26毫秒。事务占用的存储:(22156事务+22237命令)/44 MB=1 K内存。存储附加事务图形复制大约需要:(118 MB-44 MB)*1024/(22 156个事务+22 237个订单)=1.71 KB的内存。

代码分析表明,花费的主要时间只是一个订单分析。后者的主要部分是系统函数调用。在未来的版本中,这个模块将被优化,这将在启动时提高10-15%的效率。

结论

我们研究了树篱终端视觉面板的要点。这是创建可灵活配置的新面板类的一个很好的例子。

规划和标准化给了双向交易组织原则的深刻思考。如果您正在创建自己的虚拟化库,本文的第二章将帮助您设计这样的库。

交易执行的特点,作为交易的双向位置再现和订单流程需要考虑的关键点。本文表明,没有事务和订单的虚拟化,这种重复是不可能的。虚拟化是一种机制,它“断开”已执行的事务量并克隆实际订单,以便订单可以成为多个事务的一部分。

这些依赖于交易环境的操作是相当勇敢的,但是虚拟化所需的主要信息存储在交易服务器上,基于此进行复制可以被认为是可靠的。

本文由MetaQuotes Software Corp.翻译自俄语原文
,网址为https://www.mql5.com/ru/articles/1297。

 

 


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

 

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

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

風險提示

MyFxtops邁投所列信息僅供參考,不構成投資建議,也不代表任何形式的推薦或者誘導行為。MyFxtops邁投非外匯經紀商,不接觸妳的任何資金。 MYFXTOPS不保證客戶盈利,不承擔任何責任。從事外彙和差價合約等金融產品的槓桿交易具有高風險,損失有可能超過本金,請量力而行,入市前需充分了解潛在的風險。過去的交易成績並不代表以後的交易成績。依據各地區法律法規,MyFxtops邁投不向中國大陸、美國、加拿大、朝鮮居民提供服務。

邁投公眾號

聯繫我們

客服QQ:981617007
Email: service@myfxtop.com

MyFxtops 邁投