Errori, bug, domande - pagina 38

 

È sorto un problema, non so dove metterlo.

Ecco la sezione del codice che mi interessa:

      Print("itogo do=",itogo);
      if(itogo>1000)
        {
         Print("itogo>1000 =",itogo);
         itogo=500;
         Print("vsego_if=",itogo);
        }
      Print("itogo posle=",itogo);
      Print("+-----------------------------------------------------------+");

Dice che per prima cosa dobbiamo togliere il valore della variabile itogo con il testo "itogo do",

allora se itogo è più di 1000 allora stampa itogo con il testo "itogo>1000 "

itogo è assegnato 500

Stampare itogo con il testo "vsego_if=" poi lasciare la zona protetta

stampare itogo con il testo "itogo posle="

tracciare una linea.

Perché sto entrando nei dettagli?

dovrebbe essere chiaro che se non c'era nessuna condizione, ci saranno due linee tra loro; se c'era una condizione, ci saranno quattro linee.

Dobbiamo renderci conto che quando la condizione viene attivata il valore della variabile cambierà.

La prima cosa da fare è di staccare la variabile itogo do, ecco lo stacco che mostra due stampanti, quindi nessuna condizione innescata ma il valore della variabile è cambiato.

Come può essere ??????????


Ecco uno screenshot del codice per mostrare che nulla tra le linee, da qualche parte oltre i confini del campo, è nascosto.

Il codice si blocca del tutto, compila senza problemi ma si rifiuta di funzionare come previsto.

La variabile è dichiarata globalmente int, il codice stesso è grande ma le stampe non sono da nessuna parte nel codice.

E la cosa più interessante con il debugger funziona bene, ma quando si esegue in modalità normale, ecco tali mescolanze

e questo non è il bot delle stampanti dalla logica del programma vedo che qualcosa è sbagliato.

 

Non sono ancora riuscito a riprodurlo su altri esempi, ma questa sembra essere la soluzione

In precedenza c'era DebugBreak(); e il codice veniva eseguito attraverso il debugger, successivamente DebugBreak() è stato rimosso e tutto è stato ricompilato

ma apparentemente ME ricorda che il debugger è stato usato e si rifiuta di lavorare correttamente senza un debug dopo la compilazione.

Se eseguo il debugger, allora anche all'avvio normale lo script funziona bene.

 
Urain:

Non sono ancora riuscito a riprodurlo su altri esempi, ma questa sembra essere la soluzione

In precedenza c'era DebugBreak(); e il codice veniva eseguito attraverso il debugger, successivamente DebugBreak() è stato rimosso e tutto è stato ricompilato

ma apparentemente ME ricorda che il debugger è stato usato e si rifiuta di funzionare correttamente senza eseguirlo dopo la compilazione.

Se lo si esegue attraverso il debugger, lo script funziona bene anche durante il funzionamento normale.


E lo chiamano rilascio?

Il potenziale partecipante al Campionato 2010 ha scritto un Expert Advisor e lo ha debuggato, ma la roba del debugger rimane nel codice. Tuttavia, l'Expert Advisor funziona bene. Tuttavia, funziona solo con i "trucchi", ma il partecipante non lo sa - come potrebbe sapere di una tale caratteristica non documentata?

Così quel partecipante ha inviato il codice sorgente del suo EA a MetaQuotes per la partecipazione al Campionato 2010 e loro lo hanno semplicemente compilato e, naturalmente, il codice è risultato pulito senza alcuna "roba da debugger".

Il campionato 2010 è in corso, ma MetaQuotes Expert Advisor in qualche modo non fa trading come sul suo computer. Un partecipante è perplesso e ha ogni sorta di pensieri...

 
Urain:

È sorto un problema, non so nemmeno dove metterlo.

Ho fatto questo codice come esempio (ho messo i vostri valori):

void Check(int itogo)
  {
   Print("itogo do=",itogo);
   if(itogo>1000)
     {
      Print("itogo>1000 =",itogo);
      itogo=500;
      Print("vsego_if=",itogo);
     }
   Print("itogo posle=",itogo);
   Print("+-----------------------------------------------------------+");  
  }
void OnStart()
  {
   Check(158);
   Check(179);
   Check(202);
   Check(222);
   Check(243);
   Check(261);
   Check(288);
   Check(301);
  }

Ha funzionato bene:

2010.07.08 07:00:22     size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07.08 07:00:22     size (EURUSD,D1)        itogo posle=301
2010.07.08 07:00:22     size (EURUSD,D1)        itogo do=301
2010.07.08 07:00:22     size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07.08 07:00:22     size (EURUSD,D1)        itogo posle=288
2010.07.08 07:00:22     size (EURUSD,D1)        itogo do=288
2010.07.08 07:00:22     size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07.08 07:00:22     size (EURUSD,D1)        itogo posle=261
2010.07.08 07:00:22     size (EURUSD,D1)        itogo do=261
2010.07.08 07:00:22     size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07.08 07:00:22     size (EURUSD,D1)        itogo posle=243
2010.07.08 07:00:22     size (EURUSD,D1)        itogo do=243
2010.07.08 07:00:22     size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07.08 07:00:22     size (EURUSD,D1)        itogo posle=222
2010.07.08 07:00:22     size (EURUSD,D1)        itogo do=222
2010.07.08 07:00:22     size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07.08 07:00:22     size (EURUSD,D1)        itogo posle=202
2010.07.08 07:00:22     size (EURUSD,D1)        itogo do=202
2010.07.08 07:00:22     size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07.08 07:00:22     size (EURUSD,D1)        itogo posle=179
2010.07.08 07:00:22     size (EURUSD,D1)        itogo do=179
2010.07.08 07:00:22     size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07.08 07:00:22     size (EURUSD,D1)        itogo posle=158
2010.07.08 07:00:22     size (EURUSD,D1)        itogo do=158

Come potete vedere, non ci sono errori o incongruenze nei valori delle variabili.

Forse avete dimenticato di ricompilare il codice dopo numerose rielaborazioni e avete usato una vecchia versione.

Cosa dovete fare:

  • Copia il tuo codice da zero, riavvia il terminale (per sicurezza) e controlla
  • Se l'errore rimane, inviaci il codice completo via servicedesk (o anche nel forum) - lo controlleremo sicuramente
 
simpleton:

Smettila di fare l'isterica.

Se questo errore è confermato, sarà corretto immediatamente. Lo sviluppo del software non può andare avanti senza errori.

 
Renat:

Smettila di fare l'isterica.

Se questo errore è confermato, sarà corretto immediatamente. Lo sviluppo del software non può andare avanti senza errori.

Renat, suggerisco di aprire l'argomento "Critica di MQL5" o qualcosa di simile. E tutti questi messaggi di altri argomenti (thread) dovrebbero essere cancellati come off-top.

In questo modo i critici avranno la possibilità di esprimere il loro punto di vista, e i fili saranno ben educati.

 

Vorrei sapere il destino della richiesta#18261 peruna chiamata di indicatore da un EA (il valore non corrisponde all'indicatore).

Sarebbe bello se rispondessero in qualche modo...

Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • 2010.03.09
  • KlimMalgin
  • www.mql5.com
C появлением новой версии языка MQL, не только изменился подход к работе с индикаторами, но и появились новые способы создания индикаторов. Кроме того, появилась дополнительная гибкость при работе с индикаторными буферами - теперь вы можете самостоятельно указать нужное направление индексации и получать ровно столько значений индикатора, сколько вам требуется. В этой статье рассмотрены базовые методы вызова индикаторов и получения данных из индикаторных буферов.
 
ddd06:

Vorrei sapere il destino della richiesta #18261 per una chiamata di indicatore da un EA (il valore non corrisponde all'indicatore).

Sarebbe bello se rispondessero in qualche modo...

La sua richiesta è stata esaudita. È stato consigliato.

Perché non è stato aggiornato nel tuo profilo - lo scopriremo.

 
Renat:

Ho fatto questo codice come esempio (mettete i vostri valori):

Ha funzionato bene:

Come potete vedere, non ci sono errori o incongruenze nei valori delle variabili.

È possibile che dopo numerosi ritocchi vi siate dimenticati di ricompilare il codice e abbiate usato una vecchia versione.

Cosa fare:

  • Ricopiate il vostro codice da zero, riavviate il terminale (per essere sicuri) e controllate
  • Se hai ancora l'errore, mandaci il codice completo via servicedesk (o anche nel forum) - controlleremo sicuramente

E prima di postare qui ho fatto lo stesso, e il risultato è stato come avete ma qui sul foglio dove l'errore è sorto inizialmente tutto e si blocca.

Ripeto il motivo nel debugger, se su quel particolare foglio di lavoro ha fatto la ricompilazione e non ha eseguito attraverso il debug funziona in modo errato, dopo una corsa nel debug tutto è normale. Non so perché il debugger si sia agganciato a questo particolare foglio di lavoro, le copie di codice su altri fogli di lavoro funzionano bene, ma questo no.

Ecco perché ho scritto sopra che non posso riprodurre l'errore finora (o meglio, si riproduce ma solo all'interno del progetto localizzato).

Forse c'è una caratteristica del debugger o di ME per ricordare la storia delle modifiche, forse c'era un errore critico prima dell'incidente a cui non ho prestato attenzione.

Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Программы MQL5 / Ошибки выполнения - Документация по MQL5
 
Urain:

E ho fatto lo stesso prima di postarlo qui, e il risultato è stato come il tuo, ma sul foglio dove si è verificato l'errore in origine, tutto si blocca.

Ripeto il motivo nel debugger, se ho ricompilato sul foglio specifico e non l'ho eseguito attraverso il debug funziona in modo errato, dopo il debug tutto è normale. Non so perché il debugger si sia agganciato a questo particolare foglio di lavoro, le copie di codice su altri fogli di lavoro funzionano bene, ma questo no.

Ecco perché ho scritto sopra che non posso riprodurre l'errore finora (o meglio, si riproduce ma solo all'interno del progetto localizzato).

Forse c'è una caratteristica del debugger o di ME per ricordare la storia delle modifiche, forse c'era un errore critico prima dell'incidente, a cui non ho prestato attenzione.

Vi ricordate dove è stato impostato DebugBreak()?

Nessuna fortuna nel riprodurlo finora.