エラー、バグ、質問 - ページ 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:
それが保証されることに賭けています。少なくとも私はいつもそれを頼りにしていますし、問題は一度も起きていません。

なるほど、とにかく一触即発の状態ですね。

ビックおじさん

それはそうですね。でも、私の場合、それは冗長です。

#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:

なるほど、とにかく一触即発の状態ですね。

ビックおじさん

それはそうですね。でも、私の場合、それは冗長です。

ご覧のように、前回のサイクルでツールにエラーがあった場合、OnTickでは1回も反復されません。

私は主張しない。ただ、実行結果を確認するのは正しいことです。

削除済み  
uncleVic:

無理はしない。実行結果を確認するだけでも、正しいことだと思います。

なるほど、とにかくアドバイスありがとうございました。
 

こんな仕掛けを発見しました。このスクリプトを実行すると、「ハングアップ」してしまいます。

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

しかし、同じ3行(コード)をExpert Advisorの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に開始されましたが(最初の2行からわかるように)、テスターはコード処理後にすぐに17日分ジャンプし(この場合、これは2行目から3行目)、この17日間を考慮せずにテストが継続されるのです。

 
で算術オーバーフローを起こしたところです。
 Sleep(-1000*2764799);
その結果、待ち時間は17.5日となりました。
 
Renat:

で算術オーバーフローが発生し、17.5日待たされたところです。
ええ、テスターではSleepを 無視して動作しますから。
 
Renat:
での算術オーバーフローを捕捉しています。
その結果、17.5日待ちとなりました。

わからないから「釣られたオーバーフロー」については論外です :)問題は、このような状況を、コンパイラが抑制するか、テスターがクリティカル・エラーの 出力で抑制するか(あるいは他の方法で)である。ターミナルからの警告がない状態で、プログラムの動作に細心の注意を払う人ばかりではないでしょう。

この問題は、コードがOnInit()の最初の行(つまり、履歴データがダウンロードされる前)に配置されているという事実にも見られます - しかし、何らかの理由で、最初の17.5日間のデータが失われています。

Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Программы MQL5 / Ошибки выполнения - Документация по MQL5
 
joo:
テスターではSleepは無視されるため、動作します。
Sleep() が無視されるのは、本当に大丈夫ですか?- 2行目と3行目の終端時間差を見てください。
 
Yedelkin:
Sleep()が無視されるのは、本当に大丈夫ですか?- 2行目と3行目の終端時間の差を見てください。
おそらく、コード中にSleepが あるだけで(ない場合と比較して)何らかの形で総実行時間に影響するのでしょうが、テスターではSleepがカウントされないという事実は確かです。