[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 1086

 
drknn:


¿Qué coño es esto entonces?

bool Fun_New_Bar() // Detección de Fun_New_Bar fi
{ // ... nueva barra


static datetime New_Time=0; // Hora de la barra actual

Esto se llama inicialización de variables estáticas. Sólo se asignará el cero cuando se inicialice esta variable.
 
khorosh:
Esto se llama inicializar una variable estática. El cero sólo se asignará cuando se inicialice esa variable.


¡Ah, tío! Genial. Se ha llamado a una subrutina y se ha inicializado una variable estática. La subrutina terminó, dejando sus variables en el espacio de direcciones de la RAM. Y lo más importante, sin liberar el propio espacio del ajetreo, ¿verdad?

¡¡¡¡La inicialización estática en su subrutina se producirá en cada nuevo tick del NEW!!!! Esto se aplica a la inicialización de todas las variables de todas las subrutinas. El alcance y el tiempo de vida de su variable estática es qué, ¿eh?

 
drknn:

¡Ah, tío! Genial. Se ha llamado a una subrutina y se ha inicializado una variable estática. La subrutina terminó, dejando sus variables en el espacio de direcciones de la RAM. Y lo más importante, sin liberar el propio espacio de la ocupación, ¿verdad?
Es fácil comprobar si funciona correctamente. ¿Por qué esta teorización? La práctica es el criterio de la verdad. Deberías alegrarte si de repente identificas una laguna en tus conocimientos. Siempre me alegro en estos casos y doy las gracias a quien me ha iluminado.
 
drknn:


¡Ah, tío! Genial. Se ha llamado a una subrutina y se ha inicializado una variable estática. La subrutina terminó, dejando sus variables en el espacio de direcciones de la RAM. Y lo más importante, sin liberar el propio espacio del ajetreo, ¿verdad?

¡¡¡¡La inicialización estática en su subrutina se producirá en cada nuevo tick del NEW!!!! Esto se aplica a la inicialización de todas las variables de todas las subrutinas. El alcance y el tiempo de vida de su variable estática es qué, ¿eh?


Sí, ¡comprueba tu gráfico M1! Después de todo, parece que todo funciona como debería. Y no emite un pitido cada vez que se forma una garrapata, sino sólo cuando se forma una nueva garrapata.

int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
{
Alert("Сформировался новый бар"); // Вывод на экран
}
return(0); // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
}
return(New_Bar);
}

 
khorosh:
Es fácil comprobar si funciona. ¿Por qué toda esta teorización? La práctica es el criterio de la verdad. Deberías alegrarte si descubres tu falta de conocimientos. Siempre me alegro en estos casos y doy las gracias a la persona que me ha iluminado.


Estoy de acuerdo. Me emocioné un poco. Mis disculpas. Comprobación de la estática. Escribe un guión.

//+------------------------------------------------------------------+
//|                 Старт работы скрипта                             |
//+------------------------------------------------------------------+
int start(){
  int SchVizovov=0;
	for(int i=1;i<5;i++){
		SchVizovov=Proverka(i);
	}
  Alert("-------------------");
	return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                   |
//+------------------------------------------------------------------+
int Proverka(int Sch){
	
	static int My_value=0; //
	if(My_value==0){
		My_value=Sch;
		Alert("Статическая переменная инициализирована. Proverka() вызвана ",Sch,"-й раз. Статическая переменная = ",My_value);
		return(Sch);
	}
	else{
	 My_value=Sch;
	 Alert("Статическая не реинициализирована. Proverka() вызвана ",Sch,"-й раз. Статическая переменная = ",My_value);
	}
	return(Sch);
}

Compilarlo, ponerlo en el gráfico. El resultado es http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg.

Bueno. Por desgracia, tengo que admitir que el statik no se reinicia. Entonces el código funcionará. Esto no es bueno. :( La ayuda lingüística debería explicar estos matices. La ayuda sólo indica que una variable estática no pierde su valor al salir de la función. Pero no dice que esta variable no se reinicie al ser reiniciada. Cielos, he dado con el hecho de que la ayuda en el meta-editor está incompleta de nuevo. Cielos, pensé que nunca me atraparían de nuevo :)))))))

 
drknn:


Estoy de acuerdo. Me emocioné un poco. Mis disculpas. Comprobación de la estática. Escribe un guión.

Compáralo, y luego échalo en el gráfico. El resultado es http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg.

Bueno. Por desgracia, tengo que admitir que el statik no se reinicia. Entonces el código funcionará. Esto no es bueno. :( La ayuda lingüística debería explicar estos matices. La ayuda sólo indica que una variable estática no pierde su valor al salir de la función. Pero no dice que esta variable no se reinicie al ser reiniciada. Oh, mierda, estoy atrapado de nuevo. Cielos, creí que nunca más me atraparían :)))))))

Pero no te enfades, aquí todos estamos aprendiendo. Ocurre que algún matiz se te escapa, y lo descubres cuando creías saberlo todo.

La referencia dice que la inicialización de una variable estática es de una sola vez, lo que significa que no hay reinicialización como tal.

 
khorosh:
Lo principal es no enfadarse, aquí todos estamos aprendiendo. Ocurre que algún matiz se te escapa, y lo descubres cuando creías que ya lo sabías todo.


No me molesta que haya descubierto una laguna en mis conocimientos: me molesta cuando encuentro fallos en mi código, cuando he pasado más de una hora para encontrarlos, cuando resulta que no ha sido culpa mía, sino un error en el sistema de ayuda o en el terminal. Si sumo el tiempo que he pasado durante los últimos 6 años de programación para encontrar errores relacionados con estos temas, puedo decir que una gran parte de mi vida se ha ido a la basura. Eso es lo frustrante: el tiempo de la vida se pierde en tonterías. Se va volando y nunca vuelve. Pues bien, la situación de hoy no ha sido molesta, al contrario, ha sido agradable: no he tenido que pasar noches buscando un error, sino que se ha identificado rápidamente.

Nikolai, una vez más mis disculpas - he pensado durante 6 años que una variable declarada inicializada con un valor dentro de la función, se reinicializa cuando esta función es llamada de nuevo. (Me callo sobre las variables de acceso directo global del terminal - eso es otro tema). Resulta que hay excepciones a la regla. ¡Hoy tengo una lección simplemente real!

 
khorosh:

La ayuda dice que la inicialización de una variable estática es de una sola vez, lo que significa que no hay reinicialización como tal.

Para citar la ayuda:

Las variables estáticas se inicializan una vez antes de llamar a la función especializada init(),

¿Y dónde inicializamos una variable estática? En un subprograma. Violamos la regla de inicialización, la violamos.

Antes de llamar a la función init(), la variable estática no fue declarada ni llamada desde el subprograma. Esto es lo que provoca la confusión. Dado que no hubo inicialización de la variable estática antes del bloque init(), la regla de singularidad será inválida porque está ligada a un fragmento particular de la estructura del programa. Esto es lo que dice la ayuda al respecto. Pero no lo cumple: ¡la reinicialización sigue sin producirse a pesar de que la regla de una sola vez no es válida!

La cuestión es que la norma de una sola vez impone una rigidez. Aquí es donde entra en juego la relación de equivalencia entre el sujeto y el predicado de la sentencia. Por lo tanto, es una equivalencia: una no existe sin la otra.

Pero además, el lenguaje también permite otra violación de la regla de la singularidad. Si declaramos esta variable como debe ser y si se puede inicializar con un valor sólo antes del bloque de inicialización, no podemos inicializar esta variable en ningún otro lugar del código, porque violaría la regla de la singularidad. Pero el script que hice muestra que no es así - la variable puede ser inicializada con otro valor sobre la marcha.

Nunca he utilizado estas variables en mi código y no lo haré ya que aquí se violan dichas reglas. No sé qué otros escollos hay con ellos.

 

TENGO UN PROBLEMA ....

Cuando configuro el correo en la configuración del terminal, en SMTP - uso smtp.gmail.com:25

Me aparece el error - Mail: 530 5.7.0 Must issue a STARTTLS command first. l3sm2329679fan.0
 
drknn:

Citando la ayuda:

¿Dónde inicializamos la variable estática? En una subrutina. Rompiste la regla de inicialización - la rompiste.

Antes de llamar a la función init(), la variable estática no fue declarada ni llamada desde el subprograma. Esto es lo que provoca la confusión. Dado que una variable estática no fue inicializada antes del bloque de inicialización, la regla de singularidad no es válida porque está ligada a un fragmento particular de la estructura del programa. Esto es exactamente lo que dice la ayuda al respecto. Pero el diablo no lo cumple: ¡la reinicialización sigue sin producirse a pesar de que la regla de la singularidad no es válida!

Además, hay un ejemplo de uso de una variable estática en el tutorial del que se desprende que se inicializa una sola vez, de lo contrario el contador de ticks no funcionaría.

//--------------------------------------------------------------------
// staticvar.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int start()                            // Специальная функция start()
  {
   static int Tick;                    // Статическая локальная перем
   Tick++;                             // Счётчик тиков
   Comment("Поступил тик № ",Tick);    // Сообщение, содержащее номер
   return;                             // Оператор выхода из start()
  }
//--------------------------------------------------------------------