Características del lenguaje mql5, sutilezas y técnicas - página 159

 
Yurixx:

Me pueden decir por favor, pls.

En el indicador el orden de las series, por ejemplo, close[], se establece mediante ArraySetAsSeries() una vez o de alguna otra manera?

¿Se hace en OnCalculate() o en OnInit()?

Me he encontrado con una situación confusa:

El orden en close[], establecido por AS_SERIES al entrar en el primer tick, en el siguiente tick cambia espontáneamente a normal, es decir, !AS_SERIES.

No he encontrado la razón de esto en el código.

en cualquier función que obtenga el escalar &arr[] no se puede estar absolutamente seguro de la dirección de indexación del array:-(

Además, si cambias la "serialidad" en el interior, esta dirección permanecerá después de que tu función termine... será un efecto secundario, que nadie espera

por eso, lamentablemente, cuando se obtiene un array para introducirlo en una función, hay que recordar su serialización, establecerla en una conveniente y devolver SIEMPRE el original al salir de la función

Este es un caso raro con OnCalculate, pero en la práctica solía ser llamado también desde otro código.

 
Maxim Kuznetsov:

Además, si cambia la "serialización" internamente, esta dirección se mantendrá cuando su función termine...

Con eso contaba. Por eso puseArraySetAsSeries(close,true) en el bloqueOnCalculate(), que se ejecuta sólo una vez en el primer ingreso. Y esta "serialización" fue efectivamente fijada. Sin embargo, para mi sorpresa, en el segundo tick, y más allá, la "serialidad" ya era lo contrario.

Maxim Kuznetsov:

Con OnCalculate es un caso raro, pero en la práctica también ha sido llamado desde otro código.

Yo no tengo tales exóticos y, además, no cambio la "serialización" de las series de tiempo y los arrays del buffer dentro del programa. Por lo tanto, me bastaría con fijarlo una vez, al principio del indicador. Pero, si no podemos estar seguros de que la "serialidad" de estas matrices se guarda, tenemos que establecerla al principio de cada bucle OnCalculate(). Esto parece ser algo completamente antinatural.

 
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
}
Es una buena idea generar una advertencia en tiempo de compilación.
 
fxsaber:
Es una buena idea generar una advertencia en tiempo de compilación.

Si nada ha cambiado desde los viejos tiempos, NULL != "" Mucha gente ha caído en esto antes.

 
Alexey Viktorov:

Si nada ha cambiado desde los viejos tiempos, NULL != "" Mucha gente ha caído en esto antes.

No estamos hablando de eso.

 
fxsaber:

Estamos hablando de otra cosa.

Entonces explica por qué no puede ser. Por qué

input string inStr = "";

puede ser, pero

input string inStr = NULL;

no puede ser.

 
Alexey Viktorov:

Entonces explica por qué no puede ser.

El script de arriba lo muestra.

 
fxsaber:

La secuencia de comandos anterior lo demuestra.

Si lo hiciera, no habría preguntas. Siempre piensas que todos los que te rodean deberían leer tu mente, o estar mejor formados que tú en programación.

 
Alexey Viktorov:

Si lo hiciera, no habría preguntas. Siempre piensas que todo el mundo debería leer tu mente, o ser más hábil que tú en la programación.

No entiendo las razones de esta reacción. El escueto código demuestra la función al 100%.

 
fxsaber:

No entiendo las razones de esta reacción. El escueto código demuestra la función al 100%.

Reacción normal. No entiendo sus códigos, pedí una explicación, y la respuesta es...

NULL es una ambigüedad tal que hay que tratarla con cuidado. Especialmente cuando se aplica a variables de cadena.

De la documentación

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

Por lo tanto, en este ejemplo NULL no significa que la longitud de la cadena sea igual a cero, sino que la variable no está inicializada.

En su ejemplo

input string inStr = NULL;

la variable se inicializa. No me queda claro cómo se inicializa y no tengo ganas de solucionarlo.

En consecuencia,

PRINT(inStr == NULL); // false

Indica que la variable está inicializada. De nuevo, con qué es la gran pregunta. ¿Por qué crees que es imposible inicializar una variable por NULL?

Aparentemente esta inicialización hace que la longitud de la cadena sea igual a cero, que es lo que dice esta comprobación sobre

PRINT(inStr == ""); // true
Razón de la queja: