Preguntas sobre POO en MQL5 - página 78

 

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Preguntas frecuentes sobre MQL5

Vladimir Simakov, 2020.06.10 19:06

#define  LOG(dText) CLog::Ptr().Log((string)__LINE__,__FUNCSIG__,dText)

class CLog{
   int cHndl;
   CLog():cHndl(FileOpen(MQLInfoString(MQL_PROGRAM_NAME)+_Symbol+(string)(int)TimeCurrent()+".log",FILE_TXT|FILE_WRITE)){}
  ~CLog() {FileClose(cHndl);}
public:
   static CLog* Ptr() {static CLog _log; return &_log;}
   void Log(string line,string sig,string text){
      string _text=StringFormat("Line: %s. Signature: %s. %s",line,sig,text);
      PrintFormat(_text);
      FileWrite(cHndl,_text);}
};


¿Alguna vez has hecho que el objeto no sea directamente accesible en lugar del resaltado, como en el caso de abajo?

#define  LOG(dText) CLog::_log.Log((string)__LINE__,__FUNCSIG__,dText)

class CLog{
   int cHndl;
   CLog():cHndl(FileOpen(MQLInfoString(MQL_PROGRAM_NAME)+_Symbol+(string)(int)TimeCurrent()+".log",FILE_TXT|FILE_WRITE)){}
  ~CLog() {FileClose(cHndl);}
public:
   static CLog _log;  
   void Log(string line,string sig,string text){
      string _text=StringFormat("Line: %s. Signature: %s. %s",line,sig,text);
      PrintFormat(_text);
      FileWrite(cHndl,_text);}
};

static CLog CLog::_log;


Este diseño no es muy útil, ya que no puede aplicarse ampliamente.

int f() { return(1); }

if (LOG(LOG(f()) -1) || LOG(LOG(f()) + 1))
  LOG(f());


He hecho el perfil de las llamadas necesarias de la misma manera.

 
Vladimir Simakov:

¡Bien hecho! ¡Así es! ¿Y esto?

Hay que reconocer que es un poco más complicado).

¿Qué pasa si un usuario abre un archivo en algún editor desconocido y comienza una nueva prueba? Buscará un error en el código, lo arreglará, mirará el registro, pero el registro no cambia...

¿Y qué pasa si hay un gran accidente y el terminal se bloquea? Lo más interesante es que no se guardará en el registro.

 
Dmitry Fedoseev:

¿Qué pasa si el usuario abre el archivo en algún editor desconocido y comienza una nueva prueba? Buscará el error en el código, lo arreglará, mirará en el registro, pero el registro no cambia...

¿Y qué pasa si hay un gran accidente y el terminal se bloquea? Lo más interesante es que no se guarda en el registro.

¿Y quién le impide hacer FileFlush? Este es un prototipo como ejemplo, luego cada uno hace su propia suerte, y suelen pedir una cuota por las soluciones terminadas)))) Así que ábrelo en cualquier cosa))) En esta implementación, cada lanzamiento tiene su propio archivo)))

UPD: He puesto un ejemplo en el que la POO facilita la vida, y luego escribe como quieras, nadie anuló el dicho de la mano de obra)))).
 
Vladimir Simakov:

¿Quién le impide hacer FileFlush? Esto es un prototipo como ejemplo, luego cada uno hace su propia suerte, y por las soluciones terminadas suelen pedir dinero)))) Así que ábrelo en cualquier cosa))) En esta implementación, cada lanzamiento tiene su propio archivo))))

UPD: He mostrado un ejemplo, cuando OOP hace la vida más fácil, y además, escribir como quieras, nadie canceló diciendo sobre el trabajo manual)))).

Ouch, no me di cuenta de que el nombre del archivo es nuevo cada vez. LuegoañadeFileFlush() y con la cerveza tirará.

 
Dmitry Fedoseev:

Ouch, no me di cuenta de que el nombre del archivo es nuevo cada vez. Luegoagrega FileFlush() y la cerveza hará el truco.

Que yo recuerde, FileFlush en MQL está vacío desde hace mucho tiempo, es inútil llamarlo.
 
Alexey Navoykov:
Que yo recuerde, FileFlush en MQL está vacío desde hace mucho tiempo, es inútil llamarlo.

HZ. No se puede saber sin pruebas.

 
SinFileFlush y sin FileClose al reinicio del disco. Cierre del terminal a través del administrador de tareas.
 
Alexey Navoykov:
Que yo recuerde, FileFlush en MQL es un archivo vacío desde hace mucho tiempo, es inútil llamarlo.

no vacío, en MQL4 sé de hecho que sin FileFlush no se pueden hacer gráficos offline online (offline...online...¡grande y poderoso es el idioma ruso! ))) )

hasta que no se restablezcan los nuevos datos en el historial, no habrá nada nuevo en el gráfico fuera de línea

otra cosa es que el terminal se reinicie automáticamente y cierre el archivo si el usuario no lo ha hecho.... en el probador a principios de año, incluso después de cerrar el archivo es imposible abrir....


He comprobado por si acaso en MQL5 - escribir una línea cada 3 seg. e imprimir el contador en el registro. si la configuración es falsa, entonces el archivo estará vacío después de abrir con el bloc de notas. si es verdadera, entonces el contenido del archivo se puede leer en cualquier momento

es decir, FileFlush funciona como se ha declarado

#property script_show_inputs
#include <Files\FileTxt.mqh>

input bool UseFileFlush = true;
//+------------------------------------------------------------------+
void OnStart()
{
   CFileTxt f;
   f.Open("tstFileFlush.txt", FILE_WRITE | FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_COMMON);
   int cnt = 0;
   while(!IsStopped())
   {
      f.WriteString(string(++cnt) + " : QWERTY\n");
      if(UseFileFlush) f.Flush();
      printf("cnt = %i", cnt);
      Sleep(3000);
   }
}
//+------------------------------------------------------------------+
 

para el tema

¿cómo funciona el casting de un puntero de clase a un tipo padre?

¿o se hace en tiempo de compilación y se coteja una tabla de llamadas a funciones (métodos)?

 
Igor Makanu:

para el tema

¿cómo funciona el casting de un puntero de clase a un tipo padre?

o se hará en tiempo de compilación y se cotejará una tabla de llamadas a funciones (métodos)?

En este caso, no es nada caro. Es costoso (por desreferenciación) llamar a métodos virtuales.