Perguntas sobre OOP em MQL5 - página 78

 

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

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


Você já tornou o objeto não diretamente acessível em vez do objeto destacado, como abaixo?

#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 projeto não é muito útil, uma vez que não pode ser amplamente aplicado.

int f() { return(1); }

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


Eu fiz o perfil das chamadas necessárias da mesma forma.

 
Vladimir Simakov:

Muito bem feito! Isso mesmo! E isto?

Você tem que admitir que é um pouco mais complicado).

E se um usuário abrir um arquivo em algum editor desconhecido e iniciar um novo teste? Ele/ela buscará um erro no código, consertará, olhará através do log, mas o log não muda...

E se houver um grande acidente e acidentes terminais? O mais interessante é que não será salvo no tronco.

 
Dmitry Fedoseev:

E se o usuário abrir o arquivo em algum editor desconhecido e iniciar um novo teste? Ele procurará por erro no código, consertará, olhará no log, mas o log não muda...

E se houver um grande acidente e acidentes terminais? O mais interessante é que não vai economizar no tronco.

E quem o impede de fazer FileFlush? Este é um protótipo como exemplo, então cada um faz sua própria sorte, e normalmente pedem uma taxa para soluções completas)))) Portanto, abra-o em qualquer coisa)))) Nesta implementação, cada lançamento tem seu próprio arquivo)))

UPD: Dei um exemplo onde o OOP facilita a vida, e depois escreva como quiser, ninguém cancelou o ditado sobre o hand-jobbery)))).
 
Vladimir Simakov:

Quem o impede de fazer FileFlush? Este é um protótipo como exemplo, então cada um faz sua própria sorte, e para soluções completas eles normalmente pedem dinheiro)))) Portanto, abra-o em qualquer coisa)))) Nesta implementação, cada lançamento tem seu próprio arquivo))))

UPD: Eu mostrei um exemplo, quando o OOP facilita a vida, e além disso, escreva como quiser, ninguém cancelou dizendo sobre trabalho manual)))).

Ai, não percebi que o nome do arquivo é sempre novo. DepoisacrescenteFileFlush() e com a cerveja puxará.

 
Dmitry Fedoseev:

Ai, não percebi que o nome do arquivo é sempre novo. Entãoadicione FileFlush() e a cerveja fará o truque.

Até onde me lembro, FileFlush em MQL está vazio há muito tempo. É inútil chamá-lo assim.
 
Alexey Navoykov:
Até onde me lembro, FileFlush em MQL está vazio há muito tempo. É inútil chamá-lo assim.

HZ. Não dá para saber sem testes.

 
SemFileFlush e sem FileClose para reiniciar o disco. Terminal fechado via gerenciador de tarefas.
 
Alexey Navoykov:
Até onde me lembro, FileFlush em MQL é um arquivo vazio há muito tempo. É inútil chamá-lo assim.

não vazio, na MQL4 eu sei de fato que sem FileFlush você não pode fazer gráficos offline online (offline...online...grande e poderoso é o idioma russo! )) )

até que você reinicialize os novos dados para o histórico, não haverá nada de novo no gráfico offline

outra coisa é que o terminal automaticamente reinicia e fecha o arquivo se o usuário não o tiver feito.... no testador no início do ano, mesmo após o fechamento do arquivo é impossível abrir....


eu verifiquei apenas no caso de MQL5 - escrever uma linha a cada 3 segundos, imprimir o contador no log. se a configuração for falsa, então o arquivo estará vazio após a abertura com bloco de notas, se verdadeiro, então o conteúdo do arquivo pode ser lido a qualquer momento

ou seja, FileFlush funciona como 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 o assunto

como funciona o lançamento de um apontador de classe para um tipo de pai?

ou isso é feito em tempo de compilação e uma tabela de chamadas de função (método) será correspondida?

 
Igor Makanu:

para o assunto

como funciona o lançamento de um apontador de classe para um tipo de pai?

ou isso será feito em tempo de compilação e uma tabela de chamadas de função (método) será correspondida?

Neste caso, não é nada caro. É caro (por desreferenciamento) chamar métodos virtuais.