Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1374

 
Alexey Viktorov #:

Qualcuno ti ha insegnato male. La variabile _LastError memorizzerà il valore fino al prossimo errore.


Bene, guarda, all'inizio del codice principale si verifica il seguente errore

ERR_INVALID_DATETIME

4010

Valore errato della data e/o dell'ora


E poi un oggetto viene creato dal codice e _LastError viene riscritto in

ERRARE_OGGETTO_NON_TROVATO

4202

Oggetto grafico non trovato


Se il controllo _LastError è alla fine del codice, come faccio di solito, otterrò 4202 e lo ignorerò. Cioè, l'errore 4010 rimarrà inosservato. Dove mi sbaglio?

Alexey Viktorov #:


È un requisito del mercato che nessun errore di esecuzione venga ricevuto dal server\dc del broker.

Grazie, non lo sapevo, pensavo che tutti gli errori fossero vietati.

 
leon_17 #:

Guardate, all'inizio del codice principale, per esempio, si verifica il seguente errore:

ERR_INVALID_DATETIME

4010

Valore errato della data e/o dell'ora


E poi un oggetto viene creato dal codice e _LastError viene riscritto in

ERRARE_OGGETTO_NON_TROVATO

4202

Oggetto grafico non trovato


Se il controllo _LastError è alla fine del codice, come faccio di solito, otterrò 4202 e lo ignorerò. Cioè, l'errore 4010 rimarrà inosservato. Dove sto sbagliando?

Grazie, non lo sapevo, pensavo che tutti gli errori fossero vietati.

Esattamente. Non hai torto...

 

Ciao, qualcuno può darmi un suggerimento.

Sto scrivendo i valori temporali di ogni barra specificamente in un array. C'è un limite di 3000 barre sul grafico.

Il compito:

- Per spostare l'array di valori ad ogni nuova barra.

void CNewBar::PriceHL2()
  {
   int start= 0;
   ArrayResize(this.m_tim_pr_hl2,this.m_rt);
  
   if(this.m_pc!=0)
     {
      start= this.m_pc;
      ArrayCopy(this.m_tim_pr_hl2, this.m_tim_pr_hl2, 0, this.m_rt-this.m_pc);
     }  
   for(int b= start; b < this.m_rt; b++)
     {
      this.m_tim_pr_hl2[b]= iTime(this.m_symbol, this.m_timeframe, this.m_rt-b);
     }
  }

Non riesco a regolarla per farla funzionare correttamente.

Sto spostando correttamente l'array su una nuova barra se (this.m_rt-this.m_pc)=1?

ArrayCopy(this.m_tim_pr_hl2, this.m_tim_pr_hl2, 0, this.m_rt-this.m_pc); // this.m_rt-this.m_pc=1
 
Mikhail Toptunov #:

Ciao, qualcuno può darmi un suggerimento.

Sto scrivendo i valori temporali di ogni barra specificamente in un array. C'è un limite di 3000 barre sul grafico.

Il compito:

- Per spostare l'array di valori ad ogni nuova barra.

Non riesco a regolarla per farla funzionare correttamente.

Ho ragione a spostare l'array su una nuova barra se (this.m_rt-this.m_pc)=1?

Cioè la dimensione dell'array deve essere esattamente 3000 e alla formazione di una nuova barra l'indice zero dovrebbe essere sovrascritto prima ......... e alla fine scrivere il nuovo valore?

Se ho capito bene, qual è lo scopo del ciclo? Basta copiare l'array stesso nell'indice nullo partendo dal primo, e poi scrivere il nuovo valore nell'ultimo indice.

 
Alexey Viktorov #:

Se non viene trovato nessun oggetto, questo è l'errore di ricerca dell'oggetto...

ERRARE_OGGETTO_NON_TROVATO

4202

Oggetto grafico non trovato


Non c'è bisogno di allertare...

Ho fatto un paio di test... Ecco cosa ho in mente. In MQL5, non è necessario usare ObjectFind() quando si creano oggetti.
L'oggetto può essere creato senza alcun controllo preliminare della sua esistenza (semplicemente usando ObjectCreate). Anche all'interno dell'OnTick tale codice non causerà alcun errore _LastError.

Non so come sia implementato nelle profondità del codice di sistema MQL5, forse c'è qualche controllo già caricato lì che l'oggetto sarà creato solo se non è ancora presente. Ma si scopre che almeno quando si crea un oggetto in MQL5, ObjectFind() non è necessario. E tutte le sue proprietà sono invariabilmente aggiornate ad ogni tick.

Questo non si può dire di MQL4. La creazione di un oggetto sopra uno esistente causerà un errore 4200 ("L'oggetto esiste già"). Significa che l'uso diObjectFind() è obbligatorio per la sua creazione.Questo mi lascia una semplice possibilità di chiudere le sue proprietà da aggiornamenti costanti senza generare errori _LastError.

Per favore, confermate le mie conclusioni.

 
Alexey Viktorov #:

Cioè la dimensione dell'array dovrebbe essere esattamente 3000 e quando si forma una nuova barra, l'indice zero dovrebbe essere sovrascritto prima ......... e il nuovo valore dovrebbe essere aggiunto alla fine?

Se ho capito bene, perché ho bisogno di un ciclo? Semplicemente, l'array stesso dovrebbe essere copiato nell'indice nullo a partire dal primo, e poi il nuovo valore dovrebbe essere aggiunto all'ultimo indice.

Beh, sì, è chiaro, ma se c'è una pausa, per esempio, un ritardo, sono apparse due battute, le scrivo.

Grazie mille, ho capito, proverò attraverso CopyTime.

 
leon_17 #:

Ho fatto un paio di test... Ecco cosa succede. In MQL5, non è necessario usare ObjectFind() quando si creano oggetti.
L'oggetto può essere creato senza alcun controllo preliminare della sua esistenza (semplicemente usando ObjectCreate). Anche all'interno del codice OnTick questo codice non causerà alcun errore _LastError.

Non so come sia implementato nelle profondità del codice di sistema MQL5, forse c'è qualche controllo già caricato lì che l'oggetto sarà creato solo se non è ancora presente. Ma si scopre che almeno quando si crea un oggetto in MQL5, ObjectFind() non è necessario. E tutte le sue proprietà sono invariabilmente aggiornate ad ogni tick.

Questo non si può dire di MQL4. La creazione di un oggetto sopra uno esistente causerà un errore 4200 ("L'oggetto esiste già"). Significa che l'uso diObjectFind() è obbligatorio per la sua creazione.Questo mi lascia una semplice possibilità di chiudere le sue proprietà da aggiornamenti costanti senza generare errori _LastError.

Per favore, confermate le mie conclusioni.

Non si tratta affatto di errori. Il punto è che quando un oggetto viene creato, gli vengono assegnate certe proprietà e perché sprecare tempo e risorse della macchina per ridefinire le proprietà senza apportare modifiche. È molto più economico controllare se l'oggetto esiste e poi assegnare nuove proprietà solo a quelle che devono essere cambiate. Per esempio un'etichetta di testo o Lable, spesso solo il testo in questi oggetti dovrebbe essere cambiato. Tutte le altre proprietà rimangono come sono...
 
Mikhail Toptunov #:

Beh sì, sembra chiaro, ma se c'è un'interruzione, per esempio un ritardo, sono apparse due battute, le scrivo.

Grazie, capisco, proverò attraverso CopyTime.

Beh, se lo fate tramite CopyTime, non c'è nessun problema. Basta copiare dalle attuali 3000 barre e il gioco è fatto.

 

Come posso impostare il livello del trailing stop regolare nel codice del programma quando piazzo un ordine pendente o apro una posizione dal mercato?

Come questo sia fatto manualmente è chiaro. I programmi per i trailing stop non standard non sono interessanti.

Grazie in anticipo.

 
   for (int symbols; symbols < SymbolsTotal(true); symbols++) 
      {
        Print(SymbolName(symbols ,true));
      }

Perché un tale disegno non funziona? Dov'è l'errore... (il registro è vuoto)


E il registro è vuoto.

enum c_mode
  {
   Auto,
   Manual,    
  };

input c_mode MODE         = Auto;

if (MODE==Auto) 
      {
      Print("MODE=Auto");
      }