程序库: MT4Orders - 页 34

 

我注意到一个有趣的现象


我有一个用于 mt4 的统计指标(免费)。

我决定为 mt5 也做一个。

这个库来得正是时候!(我懒得自己写这样一个库)。


在此之前,我有一个 MT5 版本,但它在工作中也有自己的问题。


我删除了所有 MQL5 代码 - 连接了 MT4Orders 库 - 启动时显示出错误。


与此同时,历史记录一切正常:


订单打印(OrderPrint)显示一切正常(与历史记录一样)。


我通过票据编号选择交易(系统复杂且令人困惑,我自己总是搞不清楚,过一段时间就忘了它是如何工作的 :-)))

这里有一段代码:

      if(SearchNextTicket(firsttimeticket,ticketREPORT,i,HistoryarrayNumber)==2)
        {
         firsttimeticket=MT45_OrderCloseTime();
        }
      ticketREPORT=MT45_OrderTicket();


问题是,下一个票据(用于统计)是按收盘时间排序选择的,如果时间相同,则按票据编号选择。

因此,在这种情况下显示的是无意义的结果。


但如果我添加一个无害的打印字符串:

 Print("1=== i="+i+" firsttimeticket="+firsttimeticket+" ticketREPORT="+ticketREPORT+" HistoryarrayNumber="+HistoryarrayNumber);
      if(SearchNextTicket(firsttimeticket,ticketREPORT,i,HistoryarrayNumber)==2)
        {
         firsttimeticket=MT45_OrderCloseTime();
        }
      ticketREPORT=MT45_OrderTicket();

则一切正常。



打印有什么魔力?


这种打印效果很好:

       Print("1=== i="+i);


这样的打印就不能正常工作了。

       Print("1=== i=");
 

想出来了

int i; // 不工作

int i=0; // 一切正常

 
Vladislav Andruschenko:

我注意到一件有趣的事

写一个简短的源代码来重现这一功能。这样就可以不用猜测就能行动了。


通过票据进行选择

#include <MT4Orders.mqh>

void OnStart()
{
  TICKET_TYPE Tickets[];
  
  const int Size = ArrayResize(Tickets, OrdersHistoryTotal());
  
  for (int i = 0; i < Size; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      Tickets[i] = OrderTicket(); // 机票记忆
      
  for (int i = 0; i < Size; i++)
    if (OrderSelect(Tickets[i], SELECT_BY_TICKET)) // 凭票取票
      OrderPrint();
}
 
fxsaber:

写出玩这个功能的简短来源。这样就可以不用猜测,直接行动了。


选票工作


可能是变量初始化的 问题(对我来说)。

进一步解析。

 
Andrey Khatimlianskii:

在我们的通信中挖出来的:

在这项任务中。

挂单任务示例:设置订单的价格水平是根据历史价格计算的,但会根据刻度线移动的性质进行调整。在订单触发和交易关闭后,EA 不应再根据相同的价格水平下单(但可在此时调整不同的值)。我将这些信息(订单涉及的价位)存储在绑定到票据的主变量中。当然,您也可以将其写入注释中,但这并不总是方便和可靠的。

与 OrderTicketOpen 绑定是合理的。然后,我们需要为TicketOpen-transaction创建SELECT_BY_TICKET,现在还没有。好吧,再为TicketOpen订单添加SELECT_BY_TICKET。

很明显,TicketOpen 的两个变体可以有多个 ENTRY_OUT-deals,但只能选择一个。不过,对于此类会计任务来说,这种模糊性并不妨碍工作。

说得好,谢谢。我没想到会有这样的安排。

 

有趣的是,在 mt5 报告中,所有内容的计算方式都与 mt4 报告不同。


在 mt4 中,按收盘时间排序,如果交易的收盘时间相同,则按票计算。


所以在 mt5 中就不同了,在 mt5 中,报告的排序是按开仓时间 进行的。

不方便。



@fxsaber 您是如何实现排序的?在 mt4 中是按收盘时间排序?

 
Vladislav Andruschenko:

有趣的是,在 mt5 报告中,所有内容的计算方式都与 mt4 报告不同。

在 mt4 中,按成交时间排序,如果成交时间相同,则按票计算。

开仓时间 进行的。

不方便。

而事实并非如此。

@fxsaber 您是如何实现排序的?在 MT4 中是按收盘时间排序还是按票据编号(开盘时间)排序?

在 MT5 中,按收盘时间排序 - MT5 本身就是这样将记录放入历史记录的。

 
fxsaber:

不是 这样的。

也不是。

MT5 按收盘时间排序 - MT5 本身就是这样将记录放入历史记录的。


我使用的是从 MT4 下载的报告。

当我制作统计指标时,我的数据与 mt4 的报告不符。

我根据经验发现,要使所有数据一致,所有头寸都应按收盘时间排序(如果时间相同,则按交易排序)。

根据这一原则,我的报告和 mt4 报告中的所有统计数字都是相同的。

如果是 mt5,我在计算中没有做任何改动,只是应用了您的库。在上传报告时,我发现 mt5 的排序方式是按开盘时间排序。

SELECT_BY_TICKET 由于某些原因无法正常工作。

 
Vladislav Andruschenko:


我是根据从 mt4 下载的报告进行操作的。

当我制作统计指标时,我的数据与 mt4 的报告不符。

我根据经验发现,要使所有数据一致,必须按收盘时间对所有仓位进行排序(如果时间相同,则按交易对这些仓位进行排序)。

根据这一原则,我的报告和 mt4 报告中的所有统计数字都是一致的。

在 mt5 的情况下,我没有改变我的计算,只是应用了您的库。

SELECT_BY_TICKET由于某些原因不能正常工作。

在 mt4 中完美运行的功能在 mt5 中却无法完美运行。

 
Vladislav Andruschenko:


我是根据从 mt4 下载的报告进行操作的。

当我制作统计指标时,我的数据与 mt4 的报告不符。

我根据经验发现,要使所有数据一致,必须按收盘时间对所有仓位进行排序(如果时间相同,则按交易对这些仓位进行排序)。

根据这一原则,我的报告和 mt4 报告中的所有统计数字都是一致的。

如果是 mt5,我在计算中没有做任何改动,只是应用了您的库,并在上传报告时发现 mt5 的排序方式是按开盘时间排序。

执行

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

库:报告

fxsaber, 2018.12.11 12:28 pm.

要立即了解报告的外观,只需在您的账户上运行此脚本即可

#define  REPORT_BROWSER      // 在浏览器启动时创建报告 - 需要 DLL 许可。
#include <Report.mqh> //https://www.mql5.com/zh/code/18801

void OnStart()
{
  REPORT::ToFile(); // 在浏览器中创建并打开报告。
}

SELECT_BY_TICKET由于某些原因无法正常工作

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

库:MT4Orders

fxsaber, 2019.03.11 21:40

票据选择正常

#include <MT4Orders.mqh>

void OnStart()
{
  TICKET_TYPE Tickets[];
  
  const int Size = ArrayResize(Tickets, OrdersHistoryTotal());
  
  for (int i = 0; i < Size; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      Tickets[i] = OrderTicket(); // 机票记忆
      
  for (int i = 0; i < Size; i++)
    if (OrderSelect(Tickets[i], SELECT_BY_TICKET)) // 凭票取票
      OrderPrint();
}