文章 "研究PrintFormat()并应用现成的示例"

 

新文章 研究PrintFormat()并应用现成的示例已发布:

这篇文章对初学者和有经验的开发人员都很有用。我们将研究PrintFormat()函数,分析字符串格式的示例,并编写用于在终端日志中显示各种信息的模板。

在日志或监视器屏幕上显示数值是一种简单而熟悉的操作,除非您需要显示比“你好,世界”更复杂的内容。但是,当您需要对不经常需要的值或属性进行格式化输出时,迟早会出现这种情况。当然,您可以查看MQL5的帮助。

但有时你想要一个现成的资料集合,用于显示MetaTrader 5终端提供的各种信息。在本文中,我们将尝试理解调用PrintFormat函数的复杂性,并编写现成的模板,您只需将其插入代码即可。

作者:Artyom Trishkin

 

谢谢。信息量很大,但不是一读就懂......))))))

在编写代码时阅读帮助是一件痛苦而费时的事情。我希望这篇文章能帮助我更好地理解 PrintFormat() 和 StringFormat() 的精妙之处。

 
也许帮助中唯一不明显的一点没有被提及--在什么情况下指定数据大小指定符(h | l | ll | I32 | I64)才真正有用,如果没有它一切都无法正常工作。
 
JRandomTrader #:
也许帮助中唯一没有涉及的非显而易见的一点是,如果不指定数据大小指定符 (h | l | ll | I32 | I64) 也能正常工作,那么指定数据大小指定符(h | l | ll | I32 | I64)就会非常有用。

请看下面的示例

//+------------------------------------------------------------------+
//| 脚本程序启动功能|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long x = (long)0xFFFFFFFF * 1000;

   Print("\nDEC: ",  typename(x)," x=",x,"\n---------");
   Print("%hu: ",  StringFormat("%hu",x));
   Print("%u: ",   StringFormat("%u",x));
   Print("%I64u: ",StringFormat("%I64u",x));
   Print("%llu: ", StringFormat("%llu",x));
   Print("\nHEX: ",  typename(x)," x=",StringFormat("%llx",x),"\n---------");
   Print("%hx: ",  StringFormat("%hx",x));
   Print("%x: ",   StringFormat("%x",x));
   Print("%I64x: ",StringFormat("%I64x",x));
   Print("%llx: ", StringFormat("%llx",x));

  }

结果

2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  DEC: long x=4294967295000
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  ---------
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %hu: 64536
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %u: 4294966296
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %I64u: 4294967295000
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %llu: 4294967295000
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  HEX: long x=3 e7fffffc18
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  ---------
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %hx: fc18
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %x: fffffc18
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %I64x: 3 e7fffffc18
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %llx: 3 e7fffffc18
 
JRandomTrader #:
也许帮助中唯一不明显的一点没有涉及到--在什么情况下指定数据大小指定符(h | l | ll | I32 | I64)才是真正有用的,如果不指定数据大小指定符也能正常工作。

当然有用。但就在几个小时前,我还在思考同样的问题,并产生了一个想法:如果我们只向函数传递双数值,然后在函数内部,基于某些标准,我们认为这些双数据应该是长数据。这就是我们指定其大小的地方。这只是我的一个想法。我还没有验证过。

 

没有打印格式,我是怎么活了这么多年的?我可能会继续这么做。

 
Dmitry Fedoseev #:

没有打印格式,我是怎么活了这么多年的?我可能会继续这么做。

也许

 

Artem,我不明白这从何而来?

   uint w=(header_width==0 ? header.Length()+1 : header_width);

我没有插入任何图书馆。还是我完全瞎了眼?

 
Alexey Viktorov #:

Artem,我不明白这句话从何而来

我没有插入任何图书馆。还是我完全瞎了眼?

这已经成为字符串变量和数组的标准功能。

 
Artyom Trishkin #:

这是字符串变量和数组的标准功能。

谢谢。但文档中完全没有相关说明。它返回什么样的数字?是否与 StringLen() 重复?

 
Alexey Viktorov #:

谢谢。但文档中完全没有相关说明。它返回什么样的数字?是否与 StringLen() 重复?

是的