Questions sur la POO dans MQL5 - page 78

 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

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


Avez-vous déjà fait en sorte que l'objet qui n'est pas directement accessible soit remplacé par l'objet en surbrillance, comme ci-dessous ?

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


Cette conception n'est pas très utile, car elle ne peut être appliquée à grande échelle.

int f() { return(1); }

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


J'ai fait le profilage des appels nécessaires de la même manière.

 
Vladimir Simakov:

Bien joué ! C'est vrai ! Et ça ?

Il faut admettre que c'est un peu plus compliqué).

Que se passe-t-il si un utilisateur ouvre un fichier dans un éditeur inconnu et commence un nouveau test ? Il/elle va chercher une erreur dans le code, la corriger, regarder dans le journal, mais le journal ne change pas...

Et s'il y a un gros crash et que le terminal se plante ? Le plus intéressant est qu'il ne sera pas enregistré dans le journal.

 
Dmitry Fedoseev:

Et si l'utilisateur ouvre le fichier dans un éditeur inconnu et commence un nouveau test ? Il va chercher une erreur dans le code, la corriger, regarder dans le journal, mais le journal ne change pas...

Et s'il y a un gros crash et que le terminal se plante ? Le plus intéressant est qu'il ne s'enregistre pas dans le journal.

Et qui vous empêche de faire FileFlush ? Il s'agit d'un prototype à titre d'exemple, ensuite chacun fait sa propre chance, et ils demandent généralement une rémunération pour les solutions achevées)))). Alors, ouvrez-le dans n'importe quel sens))) Dans cette implémentation, chaque lancement a son propre fichier))))

UPD : J'ai donné un exemple où la POO rend la vie plus facile, et puis écrivez comme vous voulez, personne n'a annulé le dicton sur le bricolage)))).
 
Vladimir Simakov:

Qui vous empêche de faire FileFlush ? Il s'agit d'un prototype à titre d'exemple, puis chacun fait sa propre chance, et pour les solutions achevées, on demande généralement de l'argent)))). Alors, ouvrez-le dans n'importe quel sens))) Dans cette implémentation, chaque lancement a son propre fichier)))).

UPD : J'ai montré un exemple, quand la POO rend la vie plus facile, et en plus, écrivez comme vous voulez, personne ne s'est décommandé en parlant de travail manuel)))).

Aïe, je n'ai pas remarqué que le nom du fichier est nouveau à chaque fois. Ensuite,ajoutezFileFlush() et avec la bière va tirer.

 
Dmitry Fedoseev:

Aïe, je n'ai pas remarqué que le nom du fichier est nouveau à chaque fois.Ajoutez ensuiteFileFlush() et la bière fera l'affaire.

Autant que je me souvienne, FileFlush dans MQL est vide depuis longtemps. Il est inutile de l'appeler.
 
Alexey Navoykov:
Autant que je me souvienne, FileFlush dans MQL est vide depuis longtemps. Il est inutile de l'appeler.

HZ. On ne peut pas le savoir sans tests.

 
SansFileFlush et sans FileClose pour la réinitialisation du disque. Fermé le terminal via le gestionnaire de tâches.
 
Alexey Navoykov:
Autant que je me souvienne, FileFlush dans MQL est un fichier vide depuis longtemps. Il est inutile de l'appeler.

pas vide, dans MQL4 je sais pertinemment que sans FileFlush vous ne pouvez pas mettre en ligne des graphiques hors ligne (hors ligne...en ligne...grande et puissante est la langue russe ! )))) )

tant que vous n'aurez pas réinitialisé les nouvelles données dans l'historique, il n'y aura rien de nouveau sur le graphique hors ligne.

une autre chose est que le terminal réinitialise et ferme automatiquement le fichier si l'utilisateur ne l'a pas fait..... dans le testeur au début de l'année, même après avoir fermé le fichier, il est impossible d'ouvrir.....


j'ai vérifié juste au cas où dans MQL5 - écrire une ligne toutes les 3 secondes et imprimer le compteur dans le journal. si le paramètre est faux, alors le fichier sera vide après ouverture avec le bloc-notes. si vrai, alors le contenu du fichier peut être lu à tout moment.

c'est-à-dire que FileFlush fonctionne comme déclaré

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

pour le sujet

comment fonctionne le casting d'un pointeur de classe vers un type parent ?

ou cela se fait-il au moment de la compilation et un tableau d'appels de fonctions (méthodes) sera mis en correspondance ?

 
Igor Makanu:

pour le sujet

comment fonctionne le casting d'un pointeur de classe vers un type parent ?

ou cela se fera-t-il au moment de la compilation et un tableau d'appels de fonctions (méthodes) sera-t-il mis en correspondance ?

Dans ce cas, ce n'est pas cher du tout. Il est coûteux (par déréférencement) d'appeler des méthodes virtuelles.

Raison: