MQL5中的OOP问题 - 页 78

 

关于交易、自动交易系统和策略测试的论坛

关于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);}
};


你是否曾让不直接访问的对象代替高亮的对象,就像下面这样?

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


这种设计不是很有用,因为它不能被广泛地应用。

int f() { return(1); }

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


我以同样的方式对必要的调用进行了剖析。

 
Vladimir Simakov:

干得好!这就对了!那这个呢?

你不得不承认,这有点复杂)。

如果用户在某个未知的编辑器中打开一个文件,并开始一个新的测试怎么办?他/她会寻找代码中的错误,修复它,翻看日志,但日志没有变化......

而如果出现大的崩溃,终端崩溃怎么办?最有趣的是,它不会被保存在日志中。

 
Dmitry Fedoseev:

如果用户在某个未知的编辑器中打开文件 并开始一个新的测试呢?他将寻找代码中的错误,修复它,查看日志,但日志没有变化......

而如果出现大的崩溃,终端崩溃怎么办?最有趣的是,它不会保存在日志中。

又是谁阻止你做FileFlush?这是以原型为例,那么每个人都会有自己的运气,他们通常会对完成的解决方案要求收费))))。因此,在任何情况下都可以打开它)))在这个实现中,每个发射都有自己的文件)))

UPD:我举了一个例子,OOP使生活更容易,然后随心所欲地写,没有人取消关于手淫的格言)))。
 
Vladimir Simakov:

谁阻止你做FileFlush?这是以原型为例,然后每个人都做出自己的运气,对于完成的解决方案,他们通常会要钱))))。因此,在任何情况下都可以打开它)))在这个实现中,每个发射都有自己的文件))))。

UPD:我已经展示了一个例子,当OOP使生活更容易,进一步说,按照你的意愿来写,没有人取消说关于手工作业))))。

哎哟,没注意到每次的文件名都是新的。然后添加FileFlush(),用啤酒就可以拉。

 
Dmitry Fedoseev:

哎哟,没注意到每次的文件名都是新的。然后添加FileFlush(),啤酒就能起到作用

在我的印象中,MQL中的FileFlush 已经空了很久了。 调用它是没有用的。
 
Alexey Navoykov:
在我的印象中,MQL中的FileFlush已经空了很久了。 调用它是没有用的。

HZ。没有测试,你就无法判断。

 
没有FileFlush,也没有FileClose到磁盘重置通过任务管理器关闭终端
 
Alexey Navoykov:
在我的印象中,MQL中的FileFlush已经是一个空文件了。 调用它是没用的。

不是空的,在MQL4中,我知道如果没有FileFlush,就不能使离线图表在线(离线......在线......伟大而强大的是俄罗斯语言!)) )

直到你将新的数据重置到历史上,离线图表上将没有新的数据。

另一件事是,如果用户没有这样做,终端会自动重置并关闭文件....。在年初的测试器中,即使在关闭文件后,也不可能打开....。


我检查了MQL5中的情况--每3秒写一行,在日志中打印计数器。如果设置为假,那么用记事本打开后文件将是空的,如果是真的,那么文件内容可以在任何时候被读取。

也就是说,FileFlush的工作原理与声明的一样

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

为主题

如何将一个类的指针转换为一个父类型?

还是在编译时完成,并将匹配一个函数(方法)调用表?

 
Igor Makanu:

为主题

如何将一个类的指针转换为一个父类型?

还是会在编译时完成,并匹配一个函数(方法)调用表?

在这种情况下,它一点都不贵。调用虚拟方法的成本很高(按解读计算)。