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

 

1) ¿por qué no inicializar inmediatamente al declarar int err=0 ?

2) no lo he comprobado, pero según la documentación err se almacena en alguna variable, que se pone a cero automáticamente cuando se utiliza la función GetLastError(),

y también cambia siempre cuando se utilizan algunas funciones (sobre todo las terminales)

3) Esta es la razón por la que GetLastError() dio un valor de 0 después de referirse a un número de ticket inexistente en OrderSelect:

"Las otras funciones no cambian el valor de la variable last_error bajo ninguna condición. ................., OrderSelect, ...................."

 
hoz:

A menudo declaraba una variable como esta dentro de las funciones:

Más adentro, en alguna condición ya lo llamo para ver si hay un error. Bueno, no soy sólo yo, sino muchos otros lugares en el código que he encontrado. Por lo tanto, es una situación típica. Hoy he pensado que no es lógico declarar la misma variable cada vez en cada función en la que quieras controlar los errores. Lo pensé y llegué a la conclusión de que es más fácil declarar globalmente una vez e inicializarlo en el init. Es así:

Y además, cuando se necesita llamar a la variable err en funciones de usuario, sabiendo que ya tiene un valor. De hecho, GetLastError() emite el código del último error, así que si esta variable err es llamada en cada función al final de todos los cálculos, que es responsable de emitir el código de error, y llama a GetLastError(), entonces todo será correcto, ¿verdad?

Pero si no se llama a esta variable al final de alguna función (siguiendo la cadena de ejecución del código), no se reiniciará, y podría ser una ejecución errónea, en caso de que hubiera un error en la cadena de ejecución anterior, pero no en la actual, pero el código de error se devuelve en último lugar... Y para restablecerlo, hay que llamar a esta función GetLastError(). Es decir, aquí todo depende de si se ha convocado o no. Si no estás seguro de que vaya a estar en todas partes, es más fácil reasegurar y reajustar cada vez, ¿no?

Puedes declararlo globalmente, y luego en start() antes de llamar a GetLastError() reiniciarlo, por ejemplo

int err;
//------------------
int init() 
{
  // ...
  return(0);
}
//------------------
int start() 
{ 
  // ...
  RefreshRates();
  OrderClose(...);
  err=0;     // обнуление
  err=GetLastError();
  SomeErrFunction(err);
  // ...
return(0);
}
 
ALXIMIKS:

1) ¿por qué no inicializar inmediatamente al declarar int err=0 ?


¡Inténtalo!:) A mí no me ha funcionado. Según he entendido, no se permite la inicialización mediante funciones especiales en variables globales. Aunque la documentación no parece mencionarlo.
ALXIMIKS:

2) no lo he comprobado, pero según la documentación err se almacena en alguna variable, que se pone a cero automáticamente cuando se utiliza la función GetLastError(),

y también cambia siempre cuando se utilizan algunas funciones (sobre todo las terminales)

Acerca de la puesta a cero y escribió anteriormente, pero ahí va, si después de que el valor se pone en LastError variable(), entonces, para restablecerlo, tenemos que llamar a la función GetLastError() para devolver el código del último error y restablecer la variable LastError . De lo contrario, el código del último error se almacenará permanentemente hasta que llame a GetLastError() y, en consecuencia, puede devolver el código del último error donde ya no existe. (es decir, en otra función para dificultar la lectura del registro o la impresión).
ALXIMIKS:

3) Esta es la razón por la que GetLastError() dio un valor de 0 después de referirse a un número de ticket inexistente en OrderSelect:

"Las otras funciones no cambian el valor de la variable last_error bajo ninguna condición. ................., OrderSelect, ...................."

Lo más probable es que esto no se deba a OrderSelect(), sino que algo más esté mal (junto a él en la misma función). Sobre todo, suele verse afectada por muchas otras cosas.
 
paladin80:

Puedes declarar err globalmente, y luego ponerlo a cero en start() antes de llamar a GetLastError(), por ejemplo

Si lo declaras al principio y luego hay más de un error en el código, entonces la lógica ya está desajustada. A menos que se llame constantemente a GetLastError()(teóricamente al final de cada función de usuario).
 
hoz:
entonces ya hay un problema lógico. A menos que se llame constantemente a GetLastError()(teóricamente al final de cada función de usuario).

A veces hay que llamar más a menudo
 

Víctor (hoz), no entiendo tu alboroto con el último error.

Declare la función para el manejo de errores y llámela cuando sea necesario. Todo será local y podrá utilizarse en cualquier lugar.

// Объявление:
void CommentError(int nLastCodeError, string sComment)
 {
  if (nLastCodeError != 0) Print(sComment, "  ", ErrorDescription(nLastCodeError));
 }

// Вызов:
void start()
 {
  CommentError(GetLastError(), "Ошибка в функции start()!");
 }
 
Zhunko:

Víctor (hoz), no entiendo tu alboroto con el último error.

Declare la función para el manejo de errores y llámela cuando sea necesario. Todo será local y podrá utilizarse en cualquier lugar.


Es comprensible. Pero esta función será llamada cuando la necesite, es decir, cuando quiera comprobar si hay un error. Pero si hubo un error en algún lugar antes y no hay ningún error en este momento, devolverá el error anterior... Porque en tu función Vadim, la variable LastError no se pone a cero , al llamar a GetLastError(). Esta es la cuestión...
 
hoz:

Es comprensible. Pero esta función será llamada cuando la necesite, es decir, cuando quiera comprobar si hay un error. Pero si hubo un error en algún lugar antes, y en este momento no hay ningún error, devolverá el error anterior... Porque en tu función Vadim, la variable LastError no se pone a cero , al llamar a GetLastError(). Esa es la cuestión...

No debe ponerse a cero. Debería existir el hábito de comprobar los errores en todas partes después de las funciones. También debes hacer que la llamada se desactive. Para que no se ralentice en el modo de combate. Es decir, es un depurador de este tipo.

La excepción, por supuesto, son los errores que hay que analizar, para tomar una decisión.

 
hoz:

Eso es comprensible. Pero esta función será llamada cuando la necesite, es decir, cuando quiera comprobar si hay un error. Pero si hubo un error en algún lugar antes y no hay ningún error en este momento, devolverá el error anterior... Porque en tu función Vadim, la variable LastError no se pone a cero , al llamar a GetLastError(). Este es el punto...
Lo que impide que primero se ponga a cero (err=0;), luego se llame a la acción, luego se asigne err=GetLastError(), se maneje, y err=0 de nuevo.
 
Cómo calcular el factor de beneficio con diferentes t/p y s/l. Está claro, si el take y el stop son de 20 pips cada uno, calculemos el número de operaciones rentables y deficitarias y dividámoslas. ¿Cómo calculo si tomo un TP de 40 pips y el stop de 30 pips? Lo usaremos de la misma manera que lo usamos en el mismo lugar.
Razón de la queja: