mql5语言的特点、微妙之处以及技巧 - 页 60

 
阿列克谢-科齐岑
我不知道你说的是什么GUI,但在测试器窗口的参数标签中,你可以设置开始和停止字段。而测试者正确地确定了参数值的数量。

现场步骤。

 
fxsaber:

现场步骤。

对不起,没有仔细阅读。
 
fxsaber:

步骤领域。

可能的原因是枚举字段可以被赋予特征值,而这些特征值可能不是任何步骤的倍数。

 
阿列克谢-科齐岑

原因可能是枚举字段可以被赋予特征值,它可能不是任何步骤的倍数。

是的,这不是一个错误,这就是为什么我们开始在这个主题中讨论它。如果我们想要一个优化步骤,可以通过MQL对枚举进行设置。

 

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

图书馆:TesterBenchmark

fxsaber, 2017.11.22 16:54

在MT5的每个变体中只插入一行内容

#define Comment(A)

全面加速了67%,手工业加速了108%!


但这不是主要的问题。我们成功地用一条线加速了我们的EA!而这是在优化器中,评论并没有发挥任何作用。

 
// Возвращает true только в случае, если выбран (в тестере) режим по реальным тикам
// Перед использованием должен быть хотя бы один OnTick вызван тестером
bool IsRealTicks( void )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(_Symbol, Tick) && (Tick.volume || !(Tick.flags & TICK_FLAG_LAST)));
}


使用实例

// Советник будет тестироваться только в режиме по реальным тикам
void OnTick()
{
  static bool IsRemove = true;
  
  if (IsRemove)
  {
    IsRemove = MQLInfoInteger(MQL_TESTER) && !IsRealTicks();
    
    if (IsRemove)
    {
      Print("Real ticks mode is needed!");
      
      ExpertRemove();
      
      return;
    }
  }
  
  //........
}
如何在OnInit(没有OnTick)中做到这一点--不知道。
 

关于上述主题 的对话的一个片段

fxsaber2017.11.24 08:35
不要在打印(或注释)参数中使用表达式。指定由逗号分隔的参数。那么可以肯定的是,所有的字符串转换将被重写

你能用一个例子解释一下这两个字符串在优化模式下有什么不同吗?

Print((string)i + (string)d);
Print(i, d);
支持团队2017.11.24 08:44

在第一种情况下进行优化时,将在打印前计算一个字符串表达式。打印本身将被调用,但它不会工作。

在第二种情况下,Print将被调用,但它不会起作用。而i+d的字符串转换也不会工作

在一个简单的测试中,第一次和第二次调用的结果在时间和收到的输出上都将是一样的。

也就是说,为优化模式使用带逗号的打印,比为它形成一个字符串的单一输入参数要便宜得多。


另一方面,如果它在Print里面把所有东西都形成一个单一的字符串,就很容易在优化模式下通过以下方式禁止其形成

#define Print(A)

但如果使用了逗号,这样的结构就无法工作。此外,这样的结构在优化模式下也会使其失效。

Print(SendOrder()); // SendOrder будет проигнорирован при #define Print(A)


因此(还有其他原因),最好不要在Print里面调用真正重要的函数。因此,如果你在优化模式下照顾到性能,你仍然需要做这样的事情

static const bool IsNotOptim = !MQLInfoInteger(MQL_OPTIMIZATION);

if (IsNotOptim)
{
  const string Str = GetString(); // дорогой вызов
  
  Print(Str);
//  Comment(Str); 
//  Alert(Str);
}
 
fxsaber:

关于上述主题 的对话中的一个片段

也就是说,为优化模式使用带逗号的打印,要比为它形成一个单一的输入参数的字符串便宜得多。


另一方面,如果你把所有的东西都在打印里面形成一条线,就很容易在优化模式下通过以下方式禁止其形成

但如果使用了逗号,这样的结构就无法工作。此外,这样的结构在优化模式下也会使其失效。


因此(还有其他原因),最好不要在Print里面调用真正重要的函数。因此,如果你关心优化模式下的性能,你仍然需要做这样的事情

对不起,也许我不明白,但为什么要在打印中调用重要的函数?
 
弗拉迪斯拉夫-安德鲁申科
对不起,也许我不明白,为什么我需要在打印中调用重要的函数?

这不是被禁止的。

 
fxsaber:

这不是被禁止的。

我同意。

只是想知道这有什么意义?

我现在遇到了一个问题,历史上有超过1000个交易,当我调用 历史处理函数 时,比如说计算历史的利润。+ 我不知道我为什么要为这个问题而烦恼。也就是说,报价是有延迟的。