程序库: MT4Orders - 页 77

 
Aleksey Vyazmikin 在研究了 GetLastError 之后,我认为对其进行补充是不合理的。
// 更改列表:
// 08.02.2017:
// 添加:变量 MT4ORDERS::LastTradeRequest 和MT4ORDERS::LastTradeResult содержат соответствующие данные MT5-OrderSend.

现在可以完整获取所有 MT5-OrderSend 数据。

Print(MT4ORDERS::LastTradeResult.retcode); // 操作返回代码
Print(MT4ORDERS::LastTradeResult.retcode_external); // 外部交易系统的返回代码 

MT5 代码本身在这里。与MT4 代码 比较。


请注意,在 MT5 中,GetLastError() 不会返回交易错误。因此,如果要像 MT4 中那样操作,需要通过SetUserError 生成自己的相应错误。但即使是ERR_USER_ERROR_FIRST, 也不会提供 MT4 版本的错误信息。

 

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

库: MT4Orders

fxsaber, 2022.07.20 00:39

// 更改列表:
// 20.07.2022
// 添加:已添加 OrderLotsOpen() - 关闭/删除前的全部仓位/订单量。仅在 ByPass 模式下正常工作。

Example.

#define  MT4ORDERS_BYPASS_MAXTIME 1000000 // 等待交易环境同步的最长时间(以微秒为单位
#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define  PRINT(A) Print(#A + " = " + (string)(A) + "\n")


void OnStart()
{
  const ulong Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0); // 开仓一手。

  for (int i = 1; i <= 4; i++)    
    if (OrderSelect(Ticket, SELECT_BY_TICKET) && !OrderCloseTime())
    {
      OrderClose(OrderTicket(), 0.1 * i, OrderClosePrice(), 0); // 在 0.1、0.2、0.3、......关闭。地段:0.1,0.2,0.3,...
      
      if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
      {
        OrderPrint();
        
        PRINT(OrderLotsOpen()); // 相应收盘前的持仓量。它取自交易历史记录。
      }
    }
}


结果。

#50167020751 2022.07.20 09:58:58.401 buy 0.10 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.457 1.02468 0.00 0.00 -0.29 0
OrderLotsOpen() = 1.0

#50167020753 2022.07.20 09:58:58.401 buy 0.20 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.512 1.02468 0.00 0.00 -0.59 0
OrderLotsOpen() = 0.9

#50167020754 2022.07.20 09:58:58.401 buy 0.30 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.567 1.02468 0.00 0.00 -0.88 0
OrderLotsOpen() = 0.7

#50167020755 2022.07.20 09:58:58.401 buy 0.40 EURUSD 1.02471 0.00000 0.00000 2022.07.20 09:58:58.622 1.02468 0.00 0.00 -1.17 0
OrderLotsOpen() = 0.4
 

与 MT5 相比,库显示平仓头寸 的特殊性。


交易情况。

  1. BuyLimit 开仓 1 手。
  2. 买入限价在 12:00 部分执行 0.4 手。
  3. 0.4 手的头寸于 13:00 关闭。
  4. 限价买入的其余部分于 14:00 执行 - 0.6 手。
  5. 0.6 手头寸于 15:00 关闭。

MT5 将显示有一个仓位在 12:00 开仓,15:00 平仓。该仓位的开仓/平仓价格可能非常奇怪。


MT4Orders 将显示有两个仓位:一个在 12:00 开仓,13:00 平仓,另一个在 14:00-15:00 开仓。开仓/平仓价格将足够。

 
fxsaber #:

MT5-Market 的部分内容就是通过该库编写的。主要原因是易于使用。

是的,这是一项成就。但是,市场接受时的错误检查并不能重现所有情况。

fxsaber#:

关于错误的话题。

MT5 代码本身在这里。与MT4 代码 比较。


请注意,在 MT5 中,GetLastError() 不会返回交易错误。因此,如果要像 MT4 中那样操作,需要通过SetUserError 生成自己的相应错误。但即使是ERR_USER_ERROR_FIRST, 也不会提供 MT4 版本的错误信息。

感谢您提供的信息,我对这方面不是很在行。

我的理解是否正确?

int er=GetLastError();

替换为

int er=MT4ORDERS::LastTradeResult.retcode_external;

就可以处理新的错误代码?

顺便说一下,我还没有找到 MT5 的类似错误,在 MT4 中是 135、145、146:135, 145, 146 - 还有吗?

 
Aleksey Vyazmikin #:

是的,这是一项成就。但是,marquee 准入错误检查并不能重现所有情况。

遗憾的是,我对市场只有理论上的想法。我没有通过检查的实践经验。

我的理解是否正确,即只需替换和处理新的错误代码即可?

正确。只有重置代码。ResetLastError 的类似方案是相同的 - 赋值为零。

顺便说一下,我还没有找到 MT5 的类似错误,在 MT4 中是这样的:135、145、146 - 还有吗?

我完全不知道错误的类型,因为我没有在战斗中使用 Expert Advisors。也许您应该尝试在 MT4 中重现每个错误,然后清楚地了解它们的性质,并与 MT5 中的类似错误进行比较。也许某处已经有对应的表格。并非所有代码在其他平台上都有同名代码。

 
fxsaber #:

这就对了。只有重码。与 ResetLastError 类似的方案--赋值为零。

那么,错误重置能否以某种方式集成到你的类中?因为第四个类并不需要它。

还是只需调用上次错误的信息,然后立即重置,即交换你示例中的函数就可以了?

fxsaber#:

我完全不知道错误的类型,因为我没有在战斗中使用 Expert Advisors。也许您应该尝试在 MT4 中重现每个错误,然后清楚地了解它们的性质,并与 MT5 中的类似错误进行比较。也许某处已经有对应的表格。并非所有代码在其他平台上都有同名代码。

我一直在寻找这样的表格,但没有找到。错误并不总是出在代码上,经纪中心方面也会出现问题。

我的理解是,如果订单工作出现任何问题,GetLastError(); 返回代码 4756,如果是这样,也不错。

 
Aleksey Vyazmikin #:

那么,错误重置可以整合到你的课堂中吗?我的意思是,4 似乎并不需要它。

或者,调用上次错误的信息,然后一次性重置,即交换你示例中的函数,这样就可以了吗?

我不认为有重置的必要。我说的是与 MT4 工作方式的额外兼容性。

 
fxsaber #:

我不认为有必要重置。说是为了与我认为的 MT4 工作方式更加兼容。

我仍然需要澄清,这些错误是在调用的代码下面吗?

Print(MT4ORDERS::LastTradeResult.retcode); // 操作返回代码

因为类似的事情 - 我不明白需要什么 - 下面的相同代码从MqlTradeResult 结构返回错误?

Print(MT4ORDERS::LastTradeResult.retcode_external); // 外部交易系统的返回代码 
 
Aleksey Vyazmikin #:

我还是要澄清一下,这些错误是下面所说的代码吗?

因为类似的事情 - 需要什么我不明白 - 下面的相同代码从MqlTradeResult 结构返回错误?

retcode - MT5 错误。retcode_external - 第三方桥接器开发人员可选择填写的字段。

 
fxsaber #:

retcode - MT5 错误。retcode_external - 可由第三方网桥开发人员选择填写的字段。

明白了,谢谢。我想现在用标准的就足够了。