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

 
Slava:

Cuando se recibe un mensaje sobre una fuga de memoria, significa que no hubo un comando explícito para liberar esa memoria.

Cuando el programa termina (que es cuando se reciben estos mensajes), libera toda la memoria, incluida la memoria filtrada, de todos modos.

Puede que haya utilizado el término "fuga" con demasiada ligereza. La cuestión es que se deja un recurso colgado en la memoria, cuyo nombre ni siquiera es reconocible si se borra el objeto. Y si conoces su nombre, no puedes borrarlo en ningún sitio más que en el programa que creó el recurso.


Ahora es muy fácil escribir un script para Market que suspenda (no necesariamente de forma premeditada) el Terminal en el VPS, llenando toda la memoria con recursos que no se borran tras la ejecución del script.

 

Algunos servidores de negociación pueden albergar más de un tipo de cuenta a la vez. Por ejemplo, ECN y estándar. En este caso los símbolos pueden no tener prefijos, es decir, los nombres son los mismos.

En este caso, el historial de barras (incluido el valor actual de compra/venta/último en el gráfico) y el historial de ticks siempre se corresponden con un solo tipo de cuenta.

Y los datos de Market Watch corresponden a los que están conectados.


Debido a esto, es fácil observar que el Market Watch es completamente inconsistente con los gráficos y el historial de ticks.

 

Varias veces me he encontrado con un cambio accidental (manual) del símbolo de la carta donde se encuentra un consejero de combate.

Protección contra el cambio de símbolos.

int OnInit()
{
  static const string Symb = _Symbol;  
  const bool Res = (_Symbol != Symb);
  
  if (Res)
    Alert("Symbol is change!");
  
  return(Res); // Защита от смены символа.
}
 
Al iniciar un EA, a menudo hay que decidir el momento a partir del cual se debe obtener el historial de precios. Para evitar tener que introducirlo manualmente cada vez, lo hice así.
#define  WEEK (7 * 24 * 3600)
input datetime temp = __DATE__ - WEEK;

En consecuencia, tomo la historia una semana antes de la compilación. Es conveniente.

 
fxsaber:
Al iniciar un EA, a menudo hay que decidir el momento a partir del cual se debe obtener el historial de precios. Para evitar tener que introducirlo manualmente cada vez, lo hice así.

En consecuencia, tomo la historia una semana antes de la compilación. Conveniente.

¿Por qué hay que confiar demasiado en el optimizador? Es mejor:

#define SEMANA 604800

 

Función de interrupción de emergencia, parece funcionar bien

#define  EXIT (STD_CExit(__LINE__,__FUNCTION__)).Exit

class STD_CExit{
   string function;
   int line;
public:
   STD_CExit(int _line,string _func):line(_line),function(_func){}
   void Exit(string reason=NULL);
};
//--------------------------------------------------------------------------
void STD_CExit::Exit(string reason=NULL){
   Alert(StringFormat("Abort in line %i, function %s.\nReason: %s.",line,function,reason==NULL||reason==""?"Unknow":reason));
   int a=0;
   int b=1/a;}

void OnStart()
{
   Test();
}

void Test(){
   EXIT("Some reason");
}
 
Vladimir Simakov:

Función de interrupción de emergencia, parece que funciona bien

es lo que hay que hacer - me alegré de que pasara..., lo solucionamos con@Victhttps://www.mql5.com/ru/forum/318246/page10#comment_12651569

pero esto:

- noSalir http://www.delphibasics.ru/Exit.php

- noAbortar http://www.delphibasics.ru/Abort.php

esHalt http://www.delphibasics.ru/Halt.php

UPD: un guión así es muy necesario

void OnTick()
{
   if(!getData()) EXIT("No data");
}
bool getData()
{
   return(false);
}
 
No hay manera de que eso funcione todavía(((
 
Vladimir Simakov:
Este no ha funcionado todavía(((.

No veo por qué lo necesito.

Si los desarrolladores hubieran dado exit / abort como estándar, entonces sería posible terminar correctamente el procesamiento de datos, si, por ejemplo, TF no está listo - datos OHLC, también sería útil para el procesamiento de envío de órdenes al servidor... sería conveniente interrumpir el código en cualquier lugar y salir antes del siguiente tick sin necesidad de un interminable return() para salir de OnTick()

 
Igor Makanu:

No veo por qué lo necesito.

Si los desarrolladores hubieran dado exit / abort como estándar, entonces sería posible terminar correctamente el procesamiento de datos, si, por ejemplo, TF no está listo - datos OHLC, también sería útil para el procesamiento de envío de órdenes al servidor... sería conveniente interrumpir el código en cualquier lugar y salir antes del siguiente tick sin necesidad de un interminable return() para salir de OnTick()

Bueno, no podía, todavía no...