Errori, bug, domande - pagina 437

 
voix_kas:

In un certo senso l'ho cucinato. Le critiche sono benvenute.

Dato che probabilmente sarà un esperto, allora:

    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:
Scommetto che questo è garantito. Almeno io ci conto sempre e il problema non si è mai presentato.

Capisco. Comunque, è un momento delicato.

zioVic

Questo è vero. Ma nel mio caso è ridondante:

#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);
}

Come potete vedere, se c'è un errore negli strumenti nell'ultimo ciclo in OnTick, non ci sarà alcuna iterazione.

 
voix_kas:

Capisco. Comunque, è un momento delicato.

zioVic

Questo è vero. Ma nel mio caso è ridondante:

Come potete vedere, se c'è un errore negli strumenti nell'ultimo ciclo, non ci sarà una sola iterazione in OnTick.

Non insisto. È solo che controllare il risultato dell'esecuzione è la cosa giusta da fare.

 
uncleVic:

Non sto spingendo. Controllare solo il risultato dell'esecuzione è la cosa giusta da fare.

Capisco. Comunque, grazie per il consiglio.
 

Ho scoperto questo trucco. Se eseguo questo script, si "blocca".

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

Ma se queste tre linee (codice) vengono inserite prima nella funzione OnInit() dell'Expert Advisor ed eseguite tale Expert Advisor in modalità test, il risultato sarà il seguente:

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

In primo luogo, il codice in qualche modo funziona in modalità test.

Secondo, (più importante), la storia dei primi giorni di test si perde. Così, nell'esempio precedente, il test è stato iniziato il 2011.01.03 (come si può vedere dalle prime due righe), ma il tester ha immediatamente saltato in avanti di 17 giorni dopo l'elaborazione del codice (in questo caso si tratta di una linea 2-3), e il test è continuato senza prendere in considerazione questi 17 giorni.

 
Avete appena beccato un overflow aritmetico nel file
 Sleep(-1000*2764799);
risultante in un periodo di attesa di 17,5 giorni.
 
Renat:
Hai appena beccato un overflow aritmetico in
e stai aspettando da 17,5 giorni.
Sì, e funziona nel tester perché ignora Sleep.
 
Renat:
Avete trovato un overflow aritmetico in
come risultato avete un'attesa di 17,5 giorni.

Non sto discutendo su "caught overflow" perché non lo so :) La questione è che una tale situazione dovrebbe essere soppressa o dal compilatore o dal tester con un output di errore critico (o in qualche altro modo). Non tutti saranno meticolosi su come funzionano i loro programmi in assenza di avvisi dal terminale.

Il problema si vede anche nel fatto che il codice è inserito nelle prime righe di OnInit() (cioè prima che qualsiasi dato storico venga scaricato) - ma per qualche motivo, i dati dei primi 17,5 giorni vengono persi.

Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Программы MQL5 / Ошибки выполнения - Документация по MQL5
 
joo:
Sì, e funziona nel tester perché Sleep è ignorato in esso.
Siete così sicuri che Sleep() sia ignorato? - Guarda la differenza di tempo terminale tra le linee 2 e 3.
 
Yedelkin:
Siete così sicuri che Sleep() sia ignorato? - Guarda la differenza di tempo terminale tra le linee 2 e 3.
Forse la semplice presenza di Sleep (rispetto alla sua assenza) nel codice influisce in qualche modo sul tempo totale di esecuzione, ma il fatto che Sleep non venga contato nel tester è certo.
Motivazione: