Errori, bug, domande - pagina 743

 
Fia:

Salve, signori sviluppatori!

Possiamo fare dei cambiamenti nel compilatore MQL5 per darci almeno un avvertimento?

per errori di questo tipo nel codice.

if(Flag_Exitl=true) {break;}


La condizione di confronto qui non è corretta (dovrebbe essere == ), ecco perché sarà sempre break.

Come affrontare questa situazione nel compilatore (se è possibile), in modo che io possa avere meno scossoni quando scrivo il codice?

(Ho pensato che non funzionerà, sembra che dovremmo separare l'assegnazione e il confronto in if, quindi la domanda viene rimossa).

Si può fare, se la condizione contiene un'assegnazione booleana con una costante a destra.
Le variabili di tipo bool non possono essere confrontate con true/false, ma usate direttamente (essenzialmente è una bandiera sì/no)
if(Flag_Exitl) {break;}
Il tuo modo è burroso.
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип bool
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип bool
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Тип bool - Документация по MQL5
 
notused:

Ricevo regolarmente l'errore 4401

ERR_HISTORY_NOT_FOUND

Il seguente codice indicatore

darà un errore subito dopo l'avvio (se non è su D1). O meglio, una volta che avviate il terminale e aprite il grafico - mettete l'indicatore, otterrete un errore. Se il terminale non è chiuso, allora non ci sarà questo errore all'inizio.

Ma dopo un po' di tempo (un paio d'ore - 2 ore sono state sufficienti per me) vedremo che otterremo l'errore sul grafico già aperto. (Lo stavo facendo funzionare su m30)

Rappresentanti, MetaQuotes, per favore commentate, deve essere così?
 
struct SDaylyRange {double min, max, open, close;};
struct SNoDaylyRange {
   uint x;
   double y;
 };

void OnStart()
  {
   SNoDaylyRange tmp;
   SDaylyRange tmp2 = tmp;
  }
Questo codice si compila senza un solo avvertimento. Anche se probabilmente non dovrebbe nemmeno compilare
 
notused:
...l'errore 4401 appare regolarmente.

riferimento:

Organizzare l'accesso ai dati

Accessibilità dei dati

La disponibilità di dati in formato HCC o anche in formato HC pronto all'uso non significa sempre la disponibilità incondizionata di questi dati per la visualizzazione su un grafico o per l'uso in programmi mql5.

Quando si accede ai dati dei prezzi o ai valori degli indicatori dai programmi mql5, dobbiamo ricordare che non è garantito che siano disponibili in un certo momento, o da un certo punto nel tempo. Questo ha a che fare con il fatto che MetaTrader 5 non memorizza la copia completa dei dati necessari per il programma mql5, ma dà accesso diretto al database del terminale per risparmiare risorse.

La storia dei prezzi per tutti i timeframes è costruita a partire dai dati comuni in formato HCC e qualsiasi aggiornamento del server porta all'aggiornamento dei dati per tutti i timeframes e al ricalcolo dell'indicatore. Pertanto, l'accesso ai dati può essere negato anche se i dati erano disponibili un attimo prima.

CopyRate

Quando si richiedono dati all'indicatore, se le serie temporali richieste non sono state costruite o devono essere scaricate dal server, la funzione restituisce immediatamente -1, ma viene avviato il processo di download/costruzione.
Questo sembra essere il modo in cui dovrebbe essere. Prima di CopyRate SERIES_SYNCRONIZED potete controllare...
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту - Документация по MQL5
 
Swan:

scheda informativa:

Sembra che dovrebbe essere così. Fino a CopyRate SERIES_SYNCRONIZED si può controllare...

Mi sto solo cospargendo il capo di cenere, sì. Grazie.

Anche se è strano vedere la richiesta di due barre e la storia non disponibile, anche se cambia solo zero barre. Ma non importa - se è descritto nella documentazione, non è un errore

 

nel mio IsNewBar è uscito un errore.

Invece di

CopyTime(sym, period, 0, 1, currentTime);

Avrei dovuto scrivere

   if (CopyTime(sym, period, 0, 1, currentTime) < 1) return (false);

E mi sono chiesto perché ogni paio d'ore IsNewBar(PERIOD_D1) == true -> da qui ho scoperto l'inaccessibilità della storia, ma non mi veniva in mente una funzione che avevo scritto un anno o due fa.

 
sergeev:

Perché l'indicatore non può gestire tipi di colore (COLOR_ARROW, ecc.) con più di un buffer

campione di codice

Impostiamo due DRAW_COLOR_ARROW (buf1 e buf2) e per ogni buffer di colore aggiuntivo (clr1, clr2)

Allo stesso tempo, anche se il secondo buffer buf2 riceve le barre High/Low, non appare sul grafico. Sembra che il colore delle frecce in questo buffer = clrNONE. Cioè, l'impostazione del colore nel buffer clr2 non funziona


Ecco uno screenshot. solo i valori di buf1/clr1 sono visibili. i valori del secondo buffer non sono visualizzati a colori anche se i valori sono ricevuti.


Dov'è l'errore?

La domanda è stata creata semplicemente per rispondere "in MQL5 DNA".

Tale assurdità anche su DRAW_FILLING e anche su relativamente normale DRAW_HISTOGRAM2 (non così stabile ovviamente, ma i bug si verificano).

Solo dall'instabilità dei bug, concludo che è improbabile ottenere una risposta senza un CD.

 

Bild 642 per Win32

Qualche problema con gli array tridimensionali di doppi appare se per errore andate oltre i limiti dell'array quando fate l'output nella funzione Print

Lo script entra da solo in un ciclo infinito.

int i1,i2,i3;
double out[3][7][7];
for(i1=0;i1<7;i1++) out[0][0][i1] = inp[i1];
double sum;
sum = 0.0;
for(i3=0;i3<3;i3++){
   for(i2=0;i2<7;i2++){
      for(i1=1;i1<7;i1++)  sum += W[i3][i2][i1] * out[i3][i2][i1-1];
      out[i3][i2][i1] = f(sum + WT[i3][i2]);
      sum = 0.0;
      Print("out[",i3,"][",i2,"][",i1,"] = ",out[i3][i2][i1]);
   }
}
Print("sum = ",sum);

}
//-------------------------------------------------------
double f(double x){return(1/(1+MathExp(-x)));}
 
IgorM:

Bild 642 per Win32

qualche problema con gli array tridimensionali doppio appare se si passa per errore all'esterno dell'array quando si emette nella funzione Print

In realtà, il superamento avviene due righe prima

e stai chiamando un esponente da un elemento inesistente, molto probabilmente zero.

Guarda nel registro

 
sergeev:

Generalmente, il fuori limite si verifica due righe prima

e stai chiamando un esponente da un elemento inesistente, molto probabilmente zero.

guarda nel registro

Sì, lo so, e ho citato un codice che non causa un errore di esecuzione, ma fa un loop dello script