文章 "来自 MQL5 向导的预制专家交易系统运作于 MetaTrader 4 平台中"

 

新文章 来自 MQL5 向导的预制专家交易系统运作于 MetaTrader 4 平台中已发布:

本文为 MetaTrader 4 提供了简单的 MetaTrader 5 交易环境模拟器。模拟器实现了标准函数库的交易类的移植和调整。结果就是, MetaTrader 5 向导中生成的专家交易系统在 MetaTrader 4 中无需修改即可进行编译并执行。

在 EURUSD M15 图表上, 专家交易系统看来交易良好, 包括设定止损位和止盈位的方式。

图表窗口, 展示来自 MetaTrader 5 向导的专家交易系统在 MetaTrader 4 里的操作

图表窗口, 展示来自 MetaTrader 5 向导的专家交易系统在 MetaTrader 4 里的操作

作者:Stanislav Korotky

 

致作者 谢谢!

MT4 用户会安装 MT5,至少是为了 "向导"--巧妙的营销?只是部分原因。

现在,这篇文章满足了程序员的好奇心--它是如何实现的?但不能满足用户。

市场营销需要另一篇更高层次的文章,逐步描述如何按键才能让向导在 MT4 中运行。

然后,用户就会开始与其他同类人分享他们在这项业务中的经验。或者说我对市场营销一无所知。

 
fxsaber:

致作者 谢谢!

MT4 用户会安装 MT5,至少是为了 "向导"--巧妙的营销?只是部分原因。

现在,这篇文章满足了程序员的好奇心--它是如何实现的?但不能满足用户。

市场营销需要另一篇更高层次的文章,逐步描述如何按键才能 让向导在 MT4 中运行。

然后,用户就会开始与其他同类人分享他们在这项业务中的经验。或者说,我对市场营销一无所知。

写作不是问题。但不太可能写成文章。事实上,这些信息已经写在文章里了,只需要几段文字。

为了准确起见,我想指出的是,该向导在 MT4 中不起作用,只有 MT5 中才有这种向导。生成的智能交易系统 应该可以工作,但可能不是全部。

 

为了进行比较,我建议试用 Tick Data Suite(兼容 MT4 940 - 1052 版)。

在 MT5 测试仪中选择 "按真实点数 "模式。在 MT5 测试仪中选择 "按真实点数 "模式,保存后通过 TDS 输入 MT4 测试仪。

这样,两个测试器中的报价将 100% 一致,这样您不仅可以按交易进行精确比较,还可以按速度进行比较。

然后我们就可以比较两个方向的 EA 转换/创建情况。

 

在 kodobase 中发布 EA 是通过 SB 实现 MT4 -> MT5 转换的结果。

此类作者似乎可以利用这篇文章进行自我检查。如果转换是正确的,那么通过 MT5Bridge 进行反向转换的结果应该与 MT4 原始结果完全相同。

 
fxsaber:

在 kodobase 中发布 EA 是通过 SB 实现 MT4 -> MT5 转换的结果。

这类作者似乎可以利用这篇文章进行自我检查。如果转换是正确的,那么通过 MT5Bridge 进行反向转换的结果应与 MT4 原始结果完全相同。

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

MT4 测试仪 VS MT5 测试仪

fxsaber, 2017.05.08 15:12

通过MT5Bridge您的代码 转换为 MT4。MT4build1072

EURUSD,M1: 1865415 tick events (7292 bars, 1865515 bar states) processed in 0:00:07.645 (total time 0:00:08.362)


原始代码

EURUSD,M1: 1865415 tick events (7292 bars, 1865515 bar states) processed in 0:00:03.744 (total time 0:00:04.493)


转换后的结果完全相同!速度下降了一半。

 

我的 MT5 EA(已生成,但使用自己实现的CExpertSignal 而不是标准指标)在 MT4 上编译和测试时没有问题,谢谢!

但现在我将 Expert Advisor 发送到真实平台,结果发现它根本无法交易。没有错误,什么也没显示。它就是不交易。我花了很长时间研究代码,终于找到了原因--Trade.mqh 中的 bool CTrade::FillingCheck(const string symbol) 函数。

该检查针对市场订单触发。

// 根据符号获取可能的填充策略类型
  uint filling = (uint)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);
  // 再次检查执行模式
  if(exec == SYMBOL_TRADE_EXECUTION_MARKET)
  {
    // 适用于 MARKET 执行模式
    // 分析顺序
    if(m_request.action != TRADE_ACTION_PENDING)
    {
      // 在即时执行命令的情况下
      // 如果支持所需的填充策略,则将其添加到请求中
      if(m_type_filling == ORDER_FILLING_FOK && (filling & SYMBOL_FILLING_FOK) != 0)
      {
        m_request.type_filling = m_type_filling;
        return(true);
      }
      if(m_type_filling == ORDER_FILLING_IOC && (filling & SYMBOL_FILLING_IOC) != 0)
      {
        m_request.type_filling = m_type_filling;
        return(true);
      }
      // 填料策略错误,设置错误代码
      m_result.retcode = TRADE_RETCODE_INVALID_FILL;
      return(false);
    }
    return(true);
  }

在我的情况下,m_type_filling 和 filling 都等于零,因此函数返回 false。
,根据代码逻辑,filling 不应等于零,但根据帮助 SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE),MT4 不支持。这就是为什么在测试版中,检查由于某种原因通过了,也许在某些经纪商的真实交易中也是如此。但这对我不起作用,到目前为止,我只是修改了函数,跳过了所有代码,并从函数中返回 true。

 
Dr. Trader:

该检查适用于市场订单。

在我的情况下,m_type_filling 和 filling 都等于零,因此函数返回 false。
,根据代码逻辑,filling 不应等于零,但根据帮助,MT4 不支持 SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE)。这就是为什么在测试版中,检查由于某种原因通过了,也许在某些经纪商的真实交易中也是如此。但这对我不起作用,目前我只是修改了函数,跳过了所有代码,并从函数中返回 true。

感谢您的留言。我没有遇到过这种情况。这个方法保持不变。显然,有必要根据订单 和/或工具的类型,将所有填充变量设置为特定常量(可能无法通过 API 以任何方式调出,测试人员使用了一些默认值)。如果有人知道 MT4 如何在内部选择填充,请与我们分享。

 
Stanislav Korotky:

如果有人知道 MT4 内部如何选择填充 - 请分享。

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

mql5 语言的特殊性、微妙之处和工作技巧

fxsaber, 2017.02.25 16:12

// 如果 Symb 上的订单执行类型可用,则返回与 Type 相同的订单执行类型,否则返回正确的订单执行类型。
ENUM_ORDER_TYPE_FILLING GetFilling( const string Symb, const uint Type = ORDER_FILLING_FOK )
{
  const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Symb, SYMBOL_TRADE_EXEMODE);
  const int FillingMode = (int)::SymbolInfoInteger(Symb, SYMBOL_FILLING_MODE);

  return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
         (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type);
}
应用程序
Request.type_filling = GetFilling(Request.symbol);
尚未检查止损订单的错误 是否已修复。
 
fxsaber:

谢谢,能否对这段代码稍作修改,以获得 MT4 的 SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE)类似函数。函数不应返回ENUM_ORDER_TYPE_FILLING,而应返回 (SYMBOL_FILLING_FOK | SYMBOL_FILLING_IOC)。

ORDER_FILLING_FOK = 0,ORDER_FILLING_IOC = 1,而 SYMBOL_FILLING_FOK = 1,SYMBOL_FILLING_IOC = 2,因此只需将结果递增 1 即可。

//funtion 返回 MT4 的符号填充模式,又称 SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE)。
//参数类型 - 订单填写类型
uint GetSymbolFilling( const string Symb, const uint Type = ORDER_FILLING_FOK )
{
  const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Symb, SYMBOL_TRADE_EXEMODE);
  const int FillingMode = (int)::SymbolInfoInteger(Symb, SYMBOL_FILLING_MODE);

  return ((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
         (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type) + 1;
}

然后调用函数 bool CTrade::FillingCheck(const string symbol) 中的代码。

uint filling = GetSymbolFilling(symbol, m_type_filling);
//而不是
//uint filling = (uint)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);


但实际上,这只是代码调整后的效果。最好不要这样做,而要找到正确的解决方案。

 

Stanislav Korotky 先生,您好!希望您一切都好。

我发现您的文章非常有趣,我试着按照您的指导让现成的 MT5 EA 兼容 MT4。

但我出现了以下错误,能否请您指导我如何解决这个错误?

按照您的指导,我做了以下工作我只是复制了 MQL5 源文件和MQL5 程序,然后将其粘贴到 Expert 文件夹的主目录中。

但我还是遇到了很多错误。

您能告诉我如何才能让 MQL5 生成的 EA 在 MT4 中运行吗?

下面是所附的错误图片。

附加的文件:
Capture_1.PNG  52 kb
Capture_2.PNG  53 kb
Capture_3.PNG  56 kb
Capture_4.PNG  51 kb
Capture_5.PNG  59 kb
Capture_6.PNG  22 kb
该网站使用cookies。了解有关我们Cookies政策的更多信息。