Fragen zu OOP in MQL5 - Seite 78

 

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

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


Haben Sie schon einmal das nicht direkt zugängliche Objekt anstelle des hervorgehobenen Objekts wie unten dargestellt?

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


Dieser Entwurf ist nicht sehr nützlich, da er nicht allgemein anwendbar ist.

int f() { return(1); }

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


Ich habe das Profiling der notwendigen Aufrufe auf dieselbe Weise durchgeführt.

 
Vladimir Simakov:

Gut gemacht! Das ist richtig! Und das?

Sie müssen zugeben, dass es ein bisschen komplizierter ist.)

Was passiert, wenn ein Benutzer eine Datei in einem unbekannten Editor öffnet und einen neuen Test startet? Er/sie wird nach einem Fehler im Code suchen, ihn beheben, das Protokoll durchsehen, aber das Protokoll ändert sich nicht...

Und was ist, wenn es einen großen Crash gibt und das Terminal abstürzt? Das Interessanteste daran ist, dass es nicht im Protokoll gespeichert wird.

 
Dmitry Fedoseev:

Was passiert, wenn der Benutzer die Datei in einem unbekannten Editor öffnet und einen neuen Test startet? Er sucht nach Fehlern im Code, behebt sie, schaut in das Protokoll, aber das Protokoll ändert sich nicht...

Und was ist, wenn es einen großen Crash gibt und das Terminal abstürzt? Das Interessanteste daran ist, dass es nicht im Protokoll gespeichert wird.

Und wer hindert Sie daran, FileFlush zu machen? Dies ist ein Prototyp als Beispiel, dann macht jeder sein eigenes Glück, und sie fragen in der Regel für eine Gebühr für fertige Lösungen)))) Also öffnen Sie es in allem))) Bei dieser Implementierung hat jeder Start seine eigene Datei)))

UPD: Ich habe ein Beispiel gegeben, wo OOP das Leben einfacher macht, und dann schreiben Sie, wie Sie wollen, niemand hat den Spruch über Handarbeit aufgehoben)))).
 
Vladimir Simakov:

Wer hindert Sie daran, FileFlush durchzuführen? Dies ist ein Prototyp als Beispiel, dann macht jeder sein eigenes Glück, und für fertige Lösungen verlangen sie meist Geld)))) Also öffnen Sie es in allem))) Bei dieser Implementierung hat jeder Start seine eigene Datei))))

UPD: Ich habe ein Beispiel gezeigt, wenn OOP das Leben einfacher macht, und weiter, schreiben Sie, wie Sie wollen, niemand abgebrochen sagen über Handarbeit)))).

Autsch, ich habe nicht bemerkt, dass der Dateiname jedes Mal neu ist. Dannfügen SieFileFlush() hinzu und mit Bier wird gezogen.

 
Dmitry Fedoseev:

Autsch, ich habe nicht bemerkt, dass der Dateiname jedes Mal neu ist.Fügen Sie dannFileFlush() hinzu, und das Bier wird den Zweck erfüllen.

Soweit ich mich erinnere, ist FileFlush in MQL schon seit langem leer. Es ist sinnlos, es aufzurufen.
 
Alexey Navoykov:
Soweit ich mich erinnere, ist FileFlush in MQL schon seit langem leer. Es ist sinnlos, es aufzurufen.

HZ. Das kann man ohne Tests nicht sagen.

 
OhneFileFlush und ohne FileClose auf Platte zurücksetzen. Terminal über den Task-Manager geschlossen.
 
Alexey Navoykov:
Soweit ich mich erinnere, ist FileFlush in MQL schon seit langem eine leere Datei. Es ist sinnlos, sie aufzurufen.

nicht leer, in MQL4 weiß ich mit Sicherheit, dass man ohne FileFlush keine Offline-Diagramme online stellen kann (offline...online...groß und mächtig ist die russische Sprache! ))) )

bis Sie die neuen Daten in den Verlauf zurücksetzen, gibt es keine neuen Daten in der Offline-Karte

ein weiterer Punkt ist, dass das Terminal die Datei automatisch zurücksetzt und schließt, wenn der Benutzer dies nicht getan hat.... im Tester zu Beginn des Jahres, ist es auch nach dem Schließen der Datei nicht möglich,....


ich habe vorsichtshalber in MQL5 überprüft - schreiben Sie eine Zeile alle 3 Sek. und drucken Sie den Zähler im Protokoll. wenn die Einstellung falsch ist, dann wird die Datei nach dem Öffnen mit notepad leer sein. wenn wahr, dann kann der Dateiinhalt jederzeit gelesen werden

d.h. FileFlush arbeitet wie deklariert

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

für das Thema

Wie funktioniert das Casting eines Klassenzeigers auf einen übergeordneten Typ?

oder erfolgt dies zur Kompilierzeit, und es wird eine Tabelle mit Funktionsaufrufen (Methoden) abgeglichen?

 
Igor Makanu:

für das Thema

Wie funktioniert das Casting eines Klassenzeigers auf einen übergeordneten Typ?

oder erfolgt dies zur Kompilierzeit, und es wird eine Tabelle mit Funktionsaufrufen (Methoden) abgeglichen?

In diesem Fall ist es überhaupt nicht teuer. Der Aufruf virtueller Methoden ist kostspielig (per Dereferenzierung).