错误、漏洞、问题 - 页 437

 
voix_kas:

算是熟能生巧吧。欢迎提出批评。

既然可能是要当专家,那么。

    bool   SetSymbols(string);

и:

CSymbolList slMain;

int OnInit()
  {
   if(!slMain.SetSymbols(inWorkSymbols)) return(-1);
   for (int i = 0; i < slMain.GetSymbolCount(); i++)
      Print(slMain.GetSymbolName(i));
//--- ok
   return(0);
  }
 
MetaDriver:
我敢打赌,这是有保证的。至少我一直指望着它,而且问题从未出现过。

我明白了,无论如何,这是一个敏感的时刻。

UncleVic

这倒是真的。但在我看来,这是多余的。

#include <CSymbolList.mqh>

input int    inTimeToRescan = 3600; // Интервал времени для принудительного пересканирования рабочих инструментов, в секундах
input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструменты

CSymbolList slMain;

int OnInit() {
  slMain.SetSymbols(inWorkSymbols);
  return 0;
}

void OnTick() {
  static long LastScan = 0;
  if (!slMain.GetSymbolCount() || ((long)TimeCurrent() - LastScan >= inTimeToRescan)) {
    Comment("Идентификация рабочих инструментов...");
    slMain.SetSymbols(inWorkSymbols);
    LastScan = (long)TimeCurrent();
    return;
  }

  static string Information;
  Information = TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS);

  for (int i = 0; i < slMain.GetSymbolCount(); i++) {
    if (!SymbolSelect(slMain.GetSymbolName(i), true) || !SymbolIsSynchronized(slMain.GetSymbolName(i))) continue;
    //
    StringConcatenate(Information, Information, "\n", slMain.GetSymbolName(i));
  }
  Comment(Information);
}

正如你所看到的,如果在OnTick的最后一个周期中的工具有错误,将不会有迭代。

 
voix_kas:

我明白了,无论如何,这是一个敏感的时刻。

UncleVic

这倒是真的。但在我看来,这是多余的。

正如你所看到的,如果在最后一个周期的工具中有一个错误,在OnTick中就不会有一个迭代。

我不坚持。只是,检查执行的结果是正确的事情。

 
uncleVic:

我不是在催促它。仅仅检查执行的结果是正确的事情。

我明白了,总之,谢谢你的建议。
 

我发现了这个技巧。如果我运行这个脚本,它会 "挂起"。

void OnStart()
  {
   Print("Start  ",TimeLocal());
   Sleep(-1000*2764799);
   Print("Finish ",TimeLocal());
  }

但是,如果同样的三行(代码)首先插入专家顾问的OnInit()函数中,并在测试模式 下启动该EA,结果如下。

NS 0 Core 2 14:23:49 2011.01.03 00:00:00   Ye00-01-2Event5.mq5 OnInit: терминал (470), разрешение на торговлю (true), TERMINAL_MAXBARS=10000000, компилятор (470)
PD 0 Core 2 14:23:49 2011.01.03 00:00:00   Start  2011.01.03 00:00:00
NP 0 Core 2 14:24:18 2011.01.20 17:02:48   Finish 2011.01.20 17:02:48
II 0 Core 2 14:24:18 2011.01.20 17:02:48   MisFunciones.mqh FileInit: Поиск bin-файла Y.bin

首先,代码以某种方式在测试模式下工作。

第二,(更重要的是),最初几天的测试历史会丢失。因此,在上面的例子中,测试是在2011.01.03开始的(从前两行可以看出),但是测试人员在代码处理后立即向前跳了17天(在这种情况下,这是第2-3行),测试继续进行,没有考虑到这17天。

 
你刚刚发现了一个算术溢出,在
 Sleep(-1000*2764799);
导致等待时间为17.5天。
 
Renat:
你刚刚在 中发现了一个算术溢出,并且已经等待了17.5天。

是的,而且它在测试器中工作,因为它忽略了睡眠
 
Renat:
你已经微不足道地发现了一个算术溢出,在
因此,你需要等待17.5天。

我不是在争论 "捕获的溢出 "问题,因为我不知道 :)问题是,这种情况应该由编译器或测试人员通过输出关键错误(或以其他方式)来抑制。不是每个人都会在没有终端警告的情况下对他们的程序如何工作一丝不苟。

问题还表现在,代码被放在OnInit()第一行(即在下载任何历史数据之前)--但由于某些原因,前17.5天的数据被丢失了。

Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Программы MQL5 / Ошибки выполнения - Документация по MQL5
 
joo:
是的,而且它在测试器中起作用,因为睡眠在其中被忽略了。
你这么肯定Sleep() 被忽略了吗?- 看一下第2行和第3行之间的终端时间差。
 
Yedelkin:
你这么肯定Sleep()被忽略了吗?- 看看第2行和第3行之间终端时间的差异。
也许仅仅是代码中存在 "睡眠"(与没有 "睡眠"相比)就会在某种程度上影响总的执行时间,但 "睡眠 "在测试器中不被计算的事实是肯定的。