文章 "轻松快捷开发 MetaTrader 程序的函数库(第 二十三部分):基准交易类 - 基准类,有效参数验证"

 

新文章 轻松快捷开发 MetaTrader 程序的函数库(第 二十三部分):基准交易类 - 基准类,有效参数验证已发布:

在本文中,我们继续开发交易类,实现错误交易订单参数值的监控,以及交易事件的语音。

编译 EA 并在测试器中启动,同时将 Lots 预置为 10,将 StopLoss in pointsTakeProfit in points 参数设置为 1 个点:


因此,我们尝试以无效的手数开仓,如此导致开仓资金不足,再尝试违反由品种的 StopLevel 参数规定的最小停止单距离:


EA 在日至中显示两个错误 — "Not enough money to perform trading operation" 和 "StopLoss values violate the StopLevel parameter requirements"。 我们已将止盈设为 1 个点。 为什么 EA 并未显示该错误的信息? 实际上,这里没有错误,因为 设置止盈和止损价位时小于最小 SYMBOL_TRADE_STOPS_LEVEL 并不违反规则:

在执行相反操作时,止盈和止损价位应与当时的价格进行比较

  • 买入按要价(Ask)完成 — 止盈和止损价位应与出价(Bid)比较。
  • 卖出按出价(Bid)完成 — 止盈和止损价位应与要价(Ask)比较。

作者:Artyom Trishkin

Artyom Trishkin
Artyom Trishkin
  • www.mql5.com
交易者的个人资料
 

谢谢。对于 MQL4 来说,这真的是一个发现。感谢您为社区的利益付出的辛勤劳动和时间。

让我们开始编写文档吧。

 
Alexey Viktorov:

谢谢。对于 MQL4 来说,这真的是一个发现。感谢您为社区的利益付出的辛勤劳动和时间。

让我们开始编写文档吧。

只有在库的主要功能开发完成后,才会有详细的文档。因此,现在您可以在文章讨论中提出问题。
 

我很好奇,有人使用过这些库吗?这些库的代码真的非常庞大,了解它们比研究 MQL 本身要花费更多的时间。 很有可能,使用这些库是有用的。但在我看来,mql5 中的运算符比这个庞大库中的方法和类还要少。

在我看来,OOP 应该减少代码,使其更具可读性。但在使用所有这些库时,我并没有发现任何便利之处。如果使用标准库,在那里打开一个位置使用的是一个简单的命令:Obligated 对象的类型:

Ctrade tr;
tr.OpenBuy();

就是这样!

但在这个库中,仅 OnInit 就塞进了很多东西。使用了太多的全局变量。说得难听点,就是找不到东西。

 
Dmitiry Ananiev:

我很好奇,有人使用过这些库吗?这些库的代码真的非常庞大,了解它们比研究 MQL 本身要花费更多的时间。 很有可能,使用这些库是有用的。但在我看来,mql5 中的运算符要少于这个庞大库中的方法和类。

在我看来,OOP 应该减少代码,使其更具可读性。但在使用所有这些库时,我并没有发现任何便利之处。如果使用标准库,打开一个位置只需使用一个简单的 contsruktion:Obligated object type:

Ctrade tr;
tr.OpenBuy();

就是这样!

在这个库中,仅 OnInit 就塞进了很多东西。还使用了许多全局变量。说得难听点,就是找不到东西。

是的,它们会。

你不需要解析库代码。这些文章描述了创建过程,并为感兴趣的人提供了详细的教程。

每篇文章都附有一个测试顾问,说明如何使用程序库的这个或那个功能。如果不需要该功能,则无需初始化。

程序库尚未完成--只是正在开发中。将会有一些简单方便的功能用于访问数据和打开仓位。顺便说一下,你描述的是用默认值开仓。你跳过了(故意?)交易对象的初始化。

如果目前库中没有简单的 Buy(), Sell() 方法,并不意味着将来不会有。将来会有的,而且不仅仅是它们。

现在,请举例说明,如何轻松识别 MQL4 中的平仓头寸,即使用 magik 123 而不是当前符号的前一个头寸--是否在触发挂单时开立。以及是什么样的订单。

 
Artyom Trishkin:

挂单触发时是否已打开。以及订单的类型。

MQL4 不存储已触发挂单 的历史,您只能在订单历史中确定:

- 如果关闭的订单是 OP_BUY 或 OP_SELL 类型 - 这意味着市场订单被关闭。

- 如果关闭的订单类型为 OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT 或 OP_SELLSTOP,则表示挂单被取消。


订单关闭时间与市场订单关闭时间或挂单取消时间一致。

挂单开仓时间与挂单下达时间一致,但在挂单触发时,该时间将被市场订单开仓时间取代。

订单的票据和魔法编号在整个时间内不会改变(订单反向或部分平仓的情况除外--情况不同,但魔法编号不会改变)。


也就是说,在 MQL4 订单历史中不存在触发挂单的事实,只有取消挂单的事实。我甚至不记得这些信息有多必要,也许我不知道涉及的所有任务。

 
Igor Makanu:

其中有多少是必要的信息--我都不记得了,也许任务并不是我所知道的全部

估算滑点值。在 MT5 中,有用于此目的的 OrderOpenPriceRequest 和 OrderClosePriceRequest。

 
Igor Makanu:

MQL4 不存储已触发挂单 的历史记录,您只能在订单历史记录中定义:

- 如果关闭的订单是 OP_BUY 或 OP_SELL 类型 - 这意味着关闭了市场订单

- 如果关闭的订单是 OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT 或 OP_SELLSTOP 类型 - 这意味着挂单被取消。


订单关闭时间与市场订单关闭时间或挂单取消时间一致。

挂单开仓时间与挂单下达时间一致,但在挂单触发时,该时间将被市场订单开仓时间取代。

订单的票据和魔法编号在整个时间内不会改变(订单反向或部分关闭的情况除外 - 情况不同,但魔法编号不会改变)。


也就是说,在 MQL4 订单历史中不存在触发挂单的事实,只有取消挂单的事实。我甚至不记得这些信息有多必要,也许我不知道涉及的所有任务。

因此,我要求一个不了解库功能的人写出他是如何 "轻松简单 "地识别它的。

图书馆可以。用户甚至都不用考虑--只要问一下。

他马上就明白了--"我没读过,但我谴责它"。

 
fxsaber:

估算滑点值。MT5 有用于此目的的 OrderOpenPriceRequest 和 OrderClosePriceRequest。

我还没有对其进行评估,因为我还在努力创造完美......重写 重写 - 重写 ((((

但我认为,这种事情(对经纪人工作的评估)应与主智能交易系统的工作同时进行,并记录在案,这样的数据在测试器中没有意义?


-------------------

Artyom Trishkin:

所以我要求一个不了解库功能的人写出他是如何 "轻松简单 "地识别库的。

库可以。用户甚至都不用考虑--只需提出要求即可。

他马上就明白了--"我没读过,但我谴责它"。

关于这篇文章的材料,我是有选择性地浏览的,因为信息量实在太大,所以还是问一下比较方便:

有可能在测试实例中保存 TS 的状态吗?- 我对用自己的魔法 "拾取 "订单不感兴趣,我感兴趣的是在终端重新加载的情况下保存智能交易系统状态的实现。

 
Igor Makanu:

这样的数据对测试人员毫无意义吗?

对测试人员来说意义重大。如果不对滑动进行估计,就会很容易上当受骗。

例如,我马上就注意到了这种情况

关于交易、自动交易系统和测试交易策略的论坛。

MetaTrader 5 策略测试器:漏洞、错误、改进建议

fxsaber, 2019.10.13 16:58

在股票自定义符号上,按最后价格接受卖出,并按买入价/卖出价执行。

例如,买入头寸的卖出价为 1.09801。买入价/卖出价/最后价 = 1.09799/1.09802/1.09801。触发的原因是最后一个价格已被触及,但触发的是买入价,而买入价比最后一个价格差。

事实证明,在负滑点的情况下,取价一直都会被触发。

如果不在测试器中使用 Report-bid,我什么也不会做。否则,你可以做很长时间的无用功而不自知。
 
Igor Makanu:
...

关于文章的材料,我有选择地翻阅了一下,信息量嘛,就是大,所以比较容易问到:

测试示例是否提供了保存 TC 状态的可能性?- 我对用自己的魔法 "拾取 "订单不感兴趣,我感兴趣的是在终端重新加载的情况下保存智能交易系统状态的可能性。

测试示例仅用于检查本文所述内容。作为可操作性测试。

在完成主库功能和创建用户功能以快速访问所有库功能后,将在单独的文章中提供使用功能的示例及其说明。

----------------------

什么是 "专家状态"?