Domande su OOP in MQL5 - pagina 78

 

Forum sul trading, sistemi di trading automatico e test di strategia

FAQ su 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);}
};


Non so, perché non rendi l'oggetto direttamente accessibile invece di quello evidenziato?

#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;


Questo disegno non è molto utile, dato che non può essere ampiamente applicato.

int f() { return(1); }

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


Faccio la profilazione delle chiamate necessarie in questo modo.

 
Vladimir Simakov:

Ben fatto! Proprio così! E questo?

Bisogna ammettere che è un po' più complicato).

Cosa succede se un utente apre un file in qualche editor sconosciuto e inizia un nuovo test? Lui/lei cercherà un errore nel codice, lo correggerà, guarderà nel log, ma il log non cambia...

E se c'è un grande incidente e il terminale si blocca? La cosa più interessante è che non sarà salvato nel registro.

 
Dmitry Fedoseev:

Cosa succede se l'utente apre il file in qualche editor sconosciuto e inizia un nuovo test? Cercherà l'errore nel codice, lo correggerà, guarderà nel log, ma il log non cambia...

E se c'è un grande incidente e il terminale si blocca? La cosa più interessante è che non si salva nel registro.

E chi vi impedisce di fare FileFlush? Questo è un prototipo come esempio, poi ognuno fa la sua fortuna, e di solito chiedono una tassa per le soluzioni completate)))) Quindi aprirlo in qualsiasi cosa))) In questa implementazione, ogni lancio ha il suo file))

UPD: ho fatto un esempio in cui OOP rende la vita più facile, e poi scrivi come vuoi, nessuno ha cancellato il detto sulla manipolazione)))).
 
Vladimir Simakov:

Chi vi impedisce di fare FileFlush? Questo è un prototipo come esempio, poi ognuno fa la sua fortuna, e per le soluzioni completate di solito chiedono soldi)))) Quindi aprirlo in qualsiasi cosa))) In questa implementazione, ogni lancio ha il proprio file))))

UPD: Ho mostrato un esempio, quando OOP rende la vita più facile, e inoltre, scrivete come volete, nessuno ha cancellato dicendo di handwork)))).

Ahi, non ho notato che il nome del file è nuovo ogni volta. PoiaggiungeteFileFlush() e con la birra tirerà.

 
Dmitry Fedoseev:

Ahi, non ho notato che il nome del file è nuovo ogni volta. Poiaggiungete FileFlush() e la birra farà il trucco.

Per quanto mi ricordo, FileFlush in MQL è vuoto da molto tempo, è inutile chiamarlo.
 
Alexey Navoykov:
Per quanto mi ricordo, FileFlush in MQL è vuoto da molto tempo, è inutile chiamarlo.

HZ. Non si può dire senza test.

 
SenzaFileFlush e senza FileClose per resettare il disco. Terminale chiuso tramite task manager.
 
Alexey Navoykov:
Per quanto mi ricordo, FileFlush in MQL è un file vuoto da molto tempo, è inutile chiamarlo.

non vuoto, in MQL4 so per certo che senza FileFlush non puoi fare grafici offline online (offline...online...grande e potente è la lingua russa! ))) )

finché non si reinseriscono i nuovi dati nella cronologia, non ci sarà nulla di nuovo sul grafico offline

un'altra cosa è che il terminale resetta e chiude automaticamente il file se l'utente non l'ha fatto.... nel tester all'inizio dell'anno, anche dopo aver chiuso il file è impossibile aprire....


Ho controllato solo nel caso in MQL5 - scrivere una linea ogni 3 secondi e stampare il contatore nel registro. se l'impostazione è falsa, allora il file sarà vuoto dopo l'apertura con il blocco note. se vero, allora il contenuto del file può essere letto in qualsiasi momento

cioè FileFlush funziona come dichiarato

#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);
   }
}
//+------------------------------------------------------------------+
 

per il soggetto

come funziona il casting di un puntatore di classe su un tipo genitore?

o è fatto al momento della compilazione e una tabella di chiamate di funzioni (metodo) sarà abbinata?

 
Igor Makanu:

per il soggetto

come funziona il casting di un puntatore di classe su un tipo genitore?

o sarà fatto a tempo di compilazione e una tabella di chiamate di funzione (metodo) sarà abbinata?

In questo caso, non è affatto costoso. È costoso (per dereferenziazione) chiamare metodi virtuali.