Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 159

 
Yurixx:

Potete dirmi per favore, pls.

In indicatore l'ordine delle serie, per esempio close[], è impostato da ArraySetAsSeries() una volta o in qualche altro modo?

Viene fatto in OnCalculate() o in OnInit()?

Ho incontrato una situazione confusa:

L'ordine in close[], impostato da AS_SERIES all'entrata sul primo tick, sul prossimo tick cambia spontaneamente in normale, cioè !AS_SERIES.

Non ho trovato la ragione di questo nel codice.

in qualsiasi funzione che ottiene lo scalare &arr[] non si può essere assolutamente sicuri della direzione di indicizzazione dell'array:-(

Inoltre, se cambiate la "serialità" all'interno, questa direzione rimarrà dopo la fine della vostra funzione... sarà un effetto collaterale, che nessuno si aspetta

ecco perché, purtroppo, quando si ottiene un array per l'input in una funzione, ricordate la sua serializzazione, impostatela su una conveniente e restituite SEMPRE l'originale quando uscite dalla funzione

Questo è un caso raro con OnCalculate, ma in pratica veniva chiamato anche da altro codice.

 
Maxim Kuznetsov:

Inoltre, se cambiate "serializzazione" internamente, questa direzione rimarrà quando la vostra funzione finisce...

Era quello su cui contavo. Ecco perché ho messoArraySetAsSeries(close,true) nel bloccoOnCalculate(), che viene eseguito solo una volta al primo accesso. E questa "serializzazione" era effettivamente impostata. Tuttavia, con mia sorpresa, al secondo tick, e oltre, la "serialità" era già il contrario.

Maxim Kuznetsov:

Con OnCalculate è un caso raro, ma in pratica è capitato che venisse chiamato anche da altro codice.

Non ho queste esotiche e, inoltre, non cambio la "serializzazione" delle serie temporali e degli array di buffer all'interno del programma. Pertanto, mi basterebbe impostarlo una volta sola, all'inizio dell'indicatore. Ma, se non possiamo essere sicuri che la "serialità" di questi array sia salvata, dobbiamo impostarla all'inizio di ogni ciclo OnCalculate(). Questo sembra essere qualcosa di completamente innaturale.

 
input string inStr = NULL; // Входная строка не может быть NULL, но об этом нигде не сообщается.

#define  PRINT(A) Print(#A + " = " + (string)(A));

void OnStart()
{
  string Str = NULL;
  
  PRINT(inStr == NULL); // false
  PRINT(Str == NULL);   // true


  PRINT(inStr == ""); // true
  PRINT(Str == "");   // false
}
È una buona idea generare un avvertimento al momento della compilazione.
 
fxsaber:
È una buona idea generare un avvertimento al momento della compilazione.

Se non è cambiato nulla dai vecchi tempi, NULL != "" Molte persone ci sono cadute prima.

 
Alexey Viktorov:

Se non è cambiato nulla dai vecchi tempi, NULL != "" Molte persone ci sono cadute prima.

Non è di questo che stiamo parlando.

 
fxsaber:

Stiamo parlando di qualcos'altro.

Allora spiega perché non può esserlo. Perché

input string inStr = "";

può essere, ma

input string inStr = NULL;

non può essere.

 
Alexey Viktorov:

Allora spiega perché non può esserlo.

Lo script qui sopra lo mostra.

 
fxsaber:

Lo script qui sopra lo mostra.

Se fosse così, non ci sarebbero domande. Pensi sempre che tutti quelli che ti circondano debbano leggerti nel pensiero, o essere meglio addestrati di te nella programmazione.

 
Alexey Viktorov:

Se fosse così, non ci sarebbero domande. Pensate sempre che tutti debbano leggervi nel pensiero, o essere meglio addestrati di voi nella programmazione.

Non capisco le ragioni di questa reazione. Il codice terso dimostra la funzione al 100%.

 
fxsaber:

Non capisco le ragioni di questa reazione. Il codice terso dimostra la funzione al 100%.

Reazione normale. Non capisco i vostri codici, ho chiesto una spiegazione, e la risposta è...

Il NULLA è una tale ambiguità che bisogna trattarla con attenzione. Specialmente se applicato a variabili stringhe.

Dalla documentazione

//--- если строка не инициализирована, то присвоим ей наше предопределенное значение 
if(some_string==NULL) some_string="empty";

Quindi, in questo esempio NULL non significa che la lunghezza della stringa è uguale a zero, ma che la variabile non è inizializzata.

Nel tuo esempio

input string inStr = NULL;

la variabile è inizializzata. Non mi è chiaro come viene inizializzato e non ho voglia di risolverlo.

Di conseguenza,

PRINT(inStr == NULL); // false

Indica che la variabile è inizializzata. Di nuovo, con cosa è la grande domanda. Perché pensate che sia impossibile inizializzare una variabile con NULL?

Apparentemente questa inizializzazione fa sì che la lunghezza della stringa sia uguale a zero, che è ciò che dice questo controllo

PRINT(inStr == ""); // true
Motivazione: