Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 600

 

Saludos. :)

Tengo más o menos el mismo código que este indicador:

bool busy=false;

int start()
{
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;
   
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   //if(busy=false) return(0);
   for (i=0; i<limit; i++)
   { 
      busy=true;
      FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), DoubleToStr(i, 0), DoubleToStr(IndicatorCounted(), 0));
      FileFlush(han);
      Здесь идут сложные вычисления которые занимают минуты 3
   }

   busy=false;
}

Lo dejo caer en el gráfico M1. El indicador cuelga junto con el terminal, supuestamente realizando cálculos.
Lo cierro a la fuerza en 15 minutos y abro su registro:

Imagen 1

Resulta que el indicador no reacciona a los ticks recién llegados (es lógico) hasta que calcula la primera vez. Pero se olvida de decirle a la terminal durante la evaluación que a IndicatorConted() se le debe asignar ya un valor distinto de 0.
¿Así que resulta que los ticks entrantes ordenados para la evaluación recuerdan el valor actual de IndicatorCounted()?

Intenté controlarlo a través de la variable ocupada (cadena comentada - mismo resultado).

Yo también lo probé así:

int start()
{
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   return(0);
   .
   .
   .
}

Naturalmente, esta vez todo funcionó correctamente:

Imagen 2

¿Qué tenemos aquí? ¿El sistema no tiene tiempo para escribir un nuevo valor en IndicatorCounted()? En otras palabras, ¿necesito hacer algo como sleep()? Sé que esto no es posible en el indicador)
¿O, cuando llega un nuevo tick, como el antiguo no ha terminado sus cálculos, recuerda que IndicatorCounte() sigue siendo igual a cero y cuando llega su momento, empieza a calcular desde el valor antiguo IndicatourCounted()=0?

¿Qué hacer? )

 
Expert:

¡Saludos! :)

Tengo más o menos el mismo código que el indicador:


Lo dice todo. A propósito de este código, a propósito de esta respuesta...para escribir?
 
peace1984:
Esta es mi primera experiencia, no juzgues con demasiada dureza:)
Para ser honesto, me parece que el probador recuerda el valor pasado de la variable - de la última prueba. Cómo - no lo sé, no tengo mucho tiempo para depurar. Tal vez sea un error de la terminal. Sólo pongo un comentario en el código y envío los valores al registro. Así que resulta que cada vez que ejecuto una nueva prueba el valor de la prueba anterior se almacena en la variable sys. Qué lío. Tal vez alguien más lo vea, tal vez mi ojo esté mojado...
Archivos adjuntos:
11_1.mq4  8 kb
 
AlexeyVik:
Esto lo dice todo. Para aproximadamente este código, aproximadamente esta respuesta...¿Escribir?


La cuestión es que el resto del código es irrelevante. La esencia del error se describe en este artículo.
Por lo general, tenía miedo de asustar a la gente con un gran post. Así que lo hinché.

En resumen, se puede formular de la siguiente manera: si un indicador se calcula para un tiempo largo (más de un minuto), IndicatorCounted() siempre devuelve 0.

 
artmedia70:
Para ser honesto, me parece que el probador recuerda el valor pasado de la variable - de la última prueba. Cómo... no lo sé, no hay mucho tiempo para informar. Tal vez un error en el terminal. Sólo pongo un comentario en el código y envío los valores al registro. Así que resulta que cada vez que ejecuto una nueva prueba el valor de la prueba anterior se almacena en la variable sys. Qué lío. Tal vez alguien más lo vea, tal vez mi ojo esté mojado...

Es sólo que olvidaste que la línea

int       sys=(Sys<0)?0:Sys;

Cuando se recuperan las propiedades del indicador, no se ejecutan.

No lo he investigado a fondo, pero tal vez esto logre el resultado deseado.

extern int Sys=0;
int       sys;    // изменено
double    opb;
double    ops;
double    cb;
double    cs;
double    lot;
double    next_order;
int       i=0;
int       x;
double    max;
double    min;
int       ticket;
int       tip;
int       count;
bool      res;
double    bal;
double    sl;
datetime  d;
double    N;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   sys=(Sys<0)?0:Sys;  // добавлено
   bal=AccountBalance();
   return(0);
  }
 
AlexeyVik:

Simplemente se olvidó de que la cadena

Cuando se recuperan las propiedades del indicador, no se ejecutan.

No lo he investigado a fondo, pero tal vez esto logre el resultado deseado.



En general, un asesor. Pero HZ, no hay tiempo para experimentar. Tengo todos los EAs trabajando de la manera que he escrito. Tendré que rastrear esta mierda en el probador. Cuando tenga suficiente tiempo.
 
Expert:


La cuestión es que el resto del código es irrelevante. La esencia del error se describe en este artículo.
Por lo general, tenía miedo de asustar a la gente con un gran post. Así que lo hinché.

En resumen, se puede formular de la siguiente manera: si un indicador se calcula durante un tiempo prolongado (más de un minuto), IndicatorCounted() siempre devuelve 0.


Esa no es la cuestión. Nadie necesita su código secreto completo. Escribe un código de prueba completo con ese malentendido. Y por aquí.

bool busy=false;

int start()
{
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;
   
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   //if(busy=false) return(0);
   for (i=0; i<limit; i++)
   { 
      busy=true;
      FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), DoubleToStr(i, 0), DoubleToStr(IndicatorCounted(), 0));
      FileFlush(han);
      Здесь идут сложные вычисления которые занимают минуты 3
   }

   busy=false;
}

¿cuándo borraste la línea resaltada? Los telépatas no ayudarán, los simples mortales aún menos...

Luego está esta parte.

   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;

No sé de qué programador procede, pero hay algo mal escrito... No es tu culpa. Usted, como muchos otros, acaba de tomar el código y tratar de arreglarlo...

Si la variable counted_bars es igual al número de barras que permanecen sin cambios desde la última llamada al indicador (la primera línea)

Cómo puede llegar a ser menor que cero que se compruebe if(counted_bars < 0) nunca podré entenderlo...

El resto también es una tontería, pero me da pereza analizarlo...

 
AlexeyVik:

Simplemente se olvidó de que la cadena

las propiedades del indicador no se ejecutarán cuando se recuperen las propiedades.

No lo he investigado a fondo, pero tal vez esto logre el resultado deseado.




Lo he intentado... no funciona...
 
artmedia70:
En general, un asesor. Pero HZ, no hay tiempo para experimentar. Tengo todos los EAs trabajando de la manera que he escrito. Tendré que rastrear esta mierda en el probador. Cuando tenga suficiente tiempo.

Bueno, sí, por supuesto, el Asesor Experto. Entonces surge otra pregunta: ¿por qué se ha colocado el EA en el gráfico como un indicador de base? Pero no cambia el asunto, al reiniciar tanto el indicador como el EA, las variables de nivel global no se reinicializan y la línea int sys=(Sys<0)?0:Sys; no se ejecuta.
 
peace1984:

Lo he intentado... no funciona...
Probablemente no es exactamente como lo intenté.
Acabo de recompilar el código en EA y lo he ejecutado. Cuando cambio el parámetro Sys en el comentario este valor cambia.