程序库: MT4Orders - 页 69

 

来自自由职业者的部分广告。

Конвертация должна быть выполнена в родном MQL5 без использования сторонних библиотек типа MT4Orders.

开发人员应在工作结束前提供源代码,以便验证转换是如何完成的。

显然,有些地方做得不好。

 
fxsaber #:

文件已损坏。

---

存档包含最新版本

//01.06.2021
// 修复:与编译器第 2449 版及更高版本的兼容性问题。
// 修复:改进了同步功能。ByPass.mqh 必须是最新版本。
// 添加:OrderLots(true) - 所选仓位的同步大小,考虑到关闭该仓位的所有订单。
 
Vitaly Muzichenko #:

文件已损坏

需要下载。

 
fxsaber #:

需要下载。

没错这是一个奇迹,不同的文件。

谢谢
 
// 更改列表:
// 06.01.2022
// 修正:精确定义开仓数据和佣金大小。仅在 ByPass 模式下运行正常。
// 添加:已添加 OrderDealsAmount() - 头寸形成中涉及的 MT5 交易数量。仅在 ByPass 模式下正常工作。

如果您需要处理部分执行和 CloseBy 重叠,我推荐您使用此更新。

 
fxsaber #:

如果您需要处理部分执行和 CloseBy 重叠,我推荐您使用此更新。

检查脚本的计算准确性。

#define  MT4ORDERS_BYPASS_MAXTIME 1000000 // 采用旁通模式进行精确计算。
#include <MT4Orders.mqh> //https://www.mql5.com/zh/code/16006

// 总结所有货币操作 -MT5 风格
double GetProfitMT5( void )
{
  double Res = 0;
  
  if (HistorySelect(0, INT_MAX))
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
      
      Res += HistoryDealGetDouble(Ticket, DEAL_PROFIT) +
             HistoryDealGetDouble(Ticket, DEAL_SWAP) +
             HistoryDealGetDouble(Ticket, DEAL_COMMISSION);
    }
    
  return(Res);
}

// 总结所有货币操作 -MT4 风格
double GetProfitMT4( void )
{
  double Res = 0;

  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)  
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      Res += OrderProfit() + OrderSwap() + OrderCommission();
    
  return(Res);
}

void OnStart()
{
  if (PositionsTotal())
    MessageBox("The script works only if there are no open positions."); // 仅在没有空缺职位时才进行检查。
  else
  {
    const double ProfitMT5 = GetProfitMT5(); // 总结所有货币操作 -MT5 风格
    const double ProfitMT4 = GetProfitMT4(); // 总结所有货币操作 -MT4 风格
    
    // 比较不同方法计算的现金交易总额。
    Alert("MT5 (" + DoubleToString(ProfitMT5, 8) + ") == MT4 (" + DoubleToString(ProfitMT4, 8) + ") - " +
          (string)(bool)!NormalizeDouble(ProfitMT4 - ProfitMT5, 8));
    Print(__MT4ORDERS__);
  }  
}


结果只有一行。

Alert: MT5 (0.00000000) == MT4 (-0.00500000) - false
Alert: MT5 (0.00000000) == MT4 (0.00000000) - true

false - MT4Orders 某处出错。请检查复杂账户。如果错误 - 请告诉我。

 
fxsaber #:

检查脚本计算是否准确。

请在复杂账户中进行检查。

检查结果表明,具有非常复杂的交易历史记录的库可以完美运行。可靠性为 100%。

 

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

库:MT4Orders

fxsaber, 2022.01.06 03:18 AM

// 更改列表:
// 06.01.2022
// 修正:精确定义开仓数据和佣金大小。仅在 ByPass 模式下运行正常。
// 添加:已添加 OrderDealsAmount() - 头寸形成中涉及的 MT5 交易数量。仅在 ByPass 模式下正常工作。

CustomReport 为例,让我向您展示它的外观

从左到右突出显示的地方。

  • 订单交易金额。这些位置由相应的交易数量生成。一般来说,这些头寸不仅可以是 ENTRY_IN 交易,也可以是其他类型的交易。
  • 因此,开仓价格可以是小数点 - 形成头寸的所有交易的成交量加权平均价格。
  • 以点为单位的佣金大小。在一个符号上,它不应该有很大差异(如果成交量很大)。否则就是 MT4Orders 的错误。

截图中的情况非常简单。订单交易金额(OrderDealsAmount)以十为单位的 情况要复杂得多。例如,在 MT5 中,有可能存在同一票据的仓位,但在有效期内并不重叠。MT5-GUI 会显示这是一个仓位,开仓时间是第一个仓位的开仓时间。而 MT4Orders 会显示多个仓位,开仓时间(和价格)和 OrderTicketOpen(开仓交易的票据)各不相同。


总之,一切都非常准确,符合 MT4 的一贯风格。仅在ByPass 模式 下。

 
// 更改列表:
// 12.01.2022
// 修复:OrderPrint() 可正确输出罕见 MT5 订单/交易类型的数据。
 
// 更改列表:
// 14.01.2022
// 修复:大大加快了 ByPass 模式下的 OrderSelect(index,SELECT_BY_POS,MODE_HISTORY)速度。