交易机器人在市场发布前必须经过的检验 - 页 21

在 check_freezelevel.mq5 文件代码(第 140 行)中有一个错误,缺少`if(!TP_check)`语句

bool CheckPositionForFREEZE_LEVEL(ulong ticket)
  {
//--- 获取 SYMBOL_TRADE_FREEZE_LEVEL 级别
   int freeze_level=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL);
   if(freeze_level!=0)
     {
      PrintFormat("SYMBOL_TRADE_FREEZE_LEVEL=%d: Cannot modify order"+
                  "  nearer than %d points from the activation price",freeze_level,freeze_level);
     }
//--- 选择工作位置
   if(!PositionSelectByTicket(ticket))
     {
      //--- 选择位置失败
      return(false);
     }
//--- 获取订单数据 
   ENUM_POSITION_TYPE pos_type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
   double sl=PositionGetDouble(POSITION_SL);
   double tp=PositionGetDouble(POSITION_TP);
//--- 检查 StopLoss 和 TakeProfit 的结果
   bool SL_check=false,TP_check=false;
//--- 位置类型
   switch(pos_type)
     {
      //--- 购买
      case POSITION_TYPE_BUY:
        {
         SL_check=(Bid-sl>freeze_level*_Point);
         if(!SL_check)
            PrintFormat("Position %s #%d cannot be modified: Bid-StopLoss=%d points"+
                        " < SYMBOL_TRADE_FREEZE_LEVEL=%d points)",
                        EnumToString(pos_type),ticket,(int)((Bid-sl)/_Point),freeze_level);
         TP_check=(tp-Bid>freeze_level*_Point);
         if(!TP_check)
            PrintFormat("Position %s #%d cannot be modified: TakeProfit-Bid=%d points"+
                        " < SYMBOL_TRADE_FREEZE_LEVEL=%d points)",
                        EnumToString(pos_type),ticket,(int)((tp-Bid)/_Point),freeze_level);
         //--- 返回检查结果
         return(SL_check&&TP_check);
        }
      break;
      //--- 出售
      case POSITION_TYPE_SELL:
        {
         SL_check=(sl-Ask>freeze_level*_Point);
         if(!SL_check)
            PrintFormat("Position %s cannot be modified: StopLoss-Ask=%d points"+
                        " < SYMBOL_TRADE_FREEZE_LEVEL=%d points)",
                        EnumToString(pos_type),(int)((sl-Ask)/_Point),freeze_level);
         TP_check=(Ask-tp>freeze_level*_Point);
         PrintFormat(" Position %s cannot be modified: Ask-TakeProfit=%d points"+
                     " < SYMBOL_TRADE_FREEZE_LEVEL=%d points)",
                     EnumToString(pos_type),(int)((Ask-tp)/_Point),freeze_level);
         //--- 返回检查结果
         return(SL_check&&TP_check);
        }
      break;
     }
//--- 位置未通过检查
   return (false);
  }
您好,我的 EA 基于新闻事件进行交易,在策略测试器中 不起作用,但在真实账户中却能盈利。我的 EA 在测试器中不起作用是否会导致市场验证失败?

一般来说,检查止盈位和止损位时, 考虑 到 SYMBOL_TRADE_STOPS_LEVEL 的 最小距离,情况如下:

  • 在 Ask 价格买入- TakeProfit 和 StopLoss 水平必须与 Bid 价格至少相差 SYMBOL_TRADE_STOPS_LEVEL 点。
  • 按买入价卖出- 止盈和止损水平必须 与 卖出价至少相差 SYMBOL_TRADE_STOPS_LEVEL 点。
以卖出价买入
按买入价卖出
TakeProfit - Bid >= SYMBOL_TRADE_STOPS_LEVEL
Bid - StopLoss >= SYMBOL_TRADE_STOPS_LEVEL
Ask - TakeProfit >= SYMBOL_TRADE_STOPS_LEVEL
StopLoss - Ask >= SYMBOL_TRADE_STOPS_LEVEL



有人能解释一下我的疑惑吗?

我知道买入是按卖出价进行的,而卖出是按买入价进行的。我也能理解为什么我们在买入时使用买入价来比较止损和止盈(因为我们将进行相反的交易,即卖出,因此使用买入价)。

但是,我不明白为什么止盈在买入时不与卖出价比较,因为如果我们只与买入价比较,用户就有可能将值设置得高于买入价而低于卖出价,这完全说不通。

谢谢您的宝贵时间。

您好、

我的 EA 被拒绝,因为验证报告显示 "无交易活动"。由于我的 EA 被设计为在特定的新闻日期进行交易,因此我需要知道在 EA 验证过程中使用了哪些历史数据。这样我就可以提供一个默认日期用于验证。

预先致谢

蒂姆

[删除]
@Tim Arthur Herbert Kasprzyk #: 我的 EA 被拒绝,因为验证报告显示 "无交易活动"。由于我的 EA 被设计为在特定的新闻日期进行交易,因此我需要知道在 EA 验证过程中使用了哪些历史数据。这样我就可以提供一个默认日期用于验证。

看来您在发帖之前并没有阅读这个主题...

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

讨论文章 "交易机器人在市场发布前必须通过的检查"

Fernando Carreiro, 2022.12.24 18:46

根据Market 产品规则,您不能将您的 EA 限制或局限于单一符号。您的 EA 必须适用于所有符号,即使其预期用途仅限于单一符号。

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

讨论文章 "交易机器人在市场上发布前必须通过的检查"。

Fernando Carreiro, 2023.03.27 01:50

您不能以任何方式限制您的 EA。它必须能够对任何事物进行交易,即使它是为指数而设计的。请阅读市场规则。

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

讨论文章 "交易机器人在市场上发布前必须通过的检查"

Fernando Carreiro, 2023.06.01 13:15

您的 EA 必须能够在所有符号和所有时间框架内进行交易。不能有任何限制。

要减少日志大小,请考虑...

  • 减少日志输出中 "打印 "语句的数量
  • 使用追踪步骤或时间步骤,而不是连续追踪止损。
  • 不要连续创建和删除挂单。考虑使用 "虚拟 "挂单。
Fernando Carreiro #:

看来您在发帖前没有阅读本主题 ...

嗨,费尔南多,感谢您的反馈。事实上,我的 EA 并不局限于任何符号或时间框架。它只需要一个指定的新闻日期,如美国联邦储备委员会利率新闻日期。我还在 EA 中提供了默认新闻日期。因此理论上它应该能通过验证。但可能的情况是,验证过程使用的历史数据并不包括我的默认日期。因此,了解所使用的历史数据(而不是符号或时间范围,这我可以在报告中看到)将会有所帮助。
[删除]
@Tim Arthur Herbert Kasprzyk #: 费尔南多,感谢您的反馈。事实上,我的 EA 并不局限于任何符号或时间框架。它只需要一个指定的新闻日期,如美国联邦储备委员会利率新闻日期。 我还在 EA 中提供了默认新闻日期。因此理论上它应该能通过验证。但可能的情况是,验证过程使用的历史数据并不包括我的默认日期。因此,了解所使用的历史数据(而不是符号或时间范围,这我可以在报告中看到)将会有所帮助。

这仍然是一个限制。通过设置默认参数值,允许在任何特定日期、符号或时间范围内进行交易,从而消除所有限制。

EA 还需要读取合同规格并做出相应调整,否则将无法通过验证过程。

我收到 "Strategy Tester Report not found"(找不到策略 测试报告) 的 信息,EURUSD 1H。 如何解决这个问题?

我已经在策略测试器中 检查了很多次,我的 EA 运行时没有任何错误。

我编写了一个 "验证测试 "EA,简单地以允许的最小交易量开仓,几秒钟后平仓,但还是出现了同样的错误。

刚刚看到一条关于验证报告的 评论,说 "没有交易活动"。 所有 EA 都必须进行交易吗?我的 EA 只是在图表上画东西,还是说它应该是一个指标?

有人遇到过此类问题吗?在 Metaquotes DEMO 账户中,它正常工作,而在测试中,它没有通过验证。


测试 EURUSD,H1 (netting) 2021.06.30 23:59:59 调用 ExpertRemove() 函数,在 OnDeinit 内自行移除,在 99% 的测试间隔内自行移除策略测试器 报告 共有 1 笔交易