文章 "MQL5中的结构及其数据打印方法"

 

新文章 MQL5中的结构及其数据打印方法已发布:

在本文中,我们将研究MqlDateTime、MqlTick、MqlRates和MqlBookInfo结构,以及从它们打印数据的方法。为了打印结构的所有字段,有一个标准的ArrayPrint()函数,它以方便的表格格式显示数组中包含的数据以及处理结构的类型。

MqlParamMqlTradeRequest结构传输用于创建指标和向服务器发送交易请求的技术信息。我们根据完成的结构中发送数据的要求结果填写结构的要求字段。换句话说,这些结构并不特别需要打印这些结构的字段由程序员填充的数据
但剩下的结构返回查询结果,每个字段由终端子系统或交易服务器填写。从这些结构中获取数据,以编程方式分析结构的填充字段,或将其打印到日志中进行后续手动分析,对于以编程方式做出决策以及理解和查找逻辑错误的位置来说,都是非常方便和必要的。

为了打印结构的所有字段,有一个标准的ArrayPrint()函数,该函数以方便的表格格式显示数组中包含的数据以及处理的结构的类型。但有时我们需要以另一种格式打印结构中的数据,这可能比表格表示更方便。例如,我们可能需要在一行中显示结构的所有字段,包括标题和相应的数据。这对于分析大量数据可能更方便。同时,有时我们需要看到一个更详细的视图,包括结构字段的描述和相应数据的不同表示。

作者:Artyom Trishkin

 
从文章的标题我就能认出这位作者 :)))))
 

如果这些文章能成为一个系列,那就太棒了!!!!!

大约四年前,当我开始学习编写代码时,我是多么怀念这些文章啊。

现在,我仍然能在这些文章中找到我还不知道的东西。

尤其是前一篇关于StringFormatPrintFormat 的文章,内容非常丰富,而这些函数的帮助却非常贫乏。

感谢作者提供的有趣而必要的文章!

StringFormat(). Обзор, готовые примеры использования
StringFormat(). Обзор, готовые примеры использования
  • www.mql5.com
Статья является продолжением обзора функции PrintFormat(). Рассмотрим вкратце форматирование строк при помощи StringFormat() и их дальнейшее использование в программе. Напишем шаблоны для вывода информации о символе в журнал терминала. Статья будет полезна как новичкам, так и уже опытным разработчикам.
 
非常好的文章。我们可以在哪里下载 mqh 文件?
 
Zhongquan Jiang # :
非常好的文章。供我们下载的 mqh 文件在哪里?

文章不附带文件,因为它是一种扩展参考信息。您只需在 MetaEditor 代码编辑器中复制粘贴文章中的代码即可。

 
Artyom Trishkin #:

文章不附带文件,因为它是一种扩展参考信息。您只需在 MetaEditor 代码编辑器中复制粘贴文章中的代码即可。

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

外币 MT5

Vladimir Karputov, 2016.10.15 08:38 AM

请在论坛的俄语部分用俄语写作。

 
本文中缺少 MqlRatesPrint 函数
 
Fokus24 #:
本文中没有 MqlRatesPrint 函数

我想是忘记了。谢谢。

//+------------------------------------------------------------------+
//| 记录 MqlRates 结构中所有字段的说明。
//+------------------------------------------------------------------+
void MqlRatesPrint(const string symbol,const ENUM_TIMEFRAMES timeframe,const MqlRates &rates,
                   const bool short_entry=true,const uint header_width=0,const uint indent=0,int index=WRONG_VALUE)
  {
//--- 声明一个变量来存储结果
   string res="";
//--- 获取时间范围的小数位数和字符串值
   int dg=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
   string tf=StringSubstr(EnumToString(timeframe==PERIOD_CURRENT ? Period() : timeframe),7);
   string num=(index==WRONG_VALUE ? ":" : StringFormat("[%ld]:",index));
//--- 如果是短记录--以符号 TF[索引]格式向日志输出条形图数据:时间、O、H、L、C、S、V/VR
   if(short_entry)
     {
      res=StringFormat("%s %s%s %s, O: %.*f, H: %.*f, L: %.*f, C: %.*f, S: %2ld, V: %5lld, RV: %lld",
                       symbol,tf,num,(string)rates.time,dg,rates.open,dg,rates.high,dg,rates.low,dg,rates.close,rates.spread,rates.tick_volume,rates.real_volume);
      Print(res);
     }
   /* 输出示例:
 GBPUSD H1: 2023.07.21 08:00:00, O: 1.28794, H: 1.28848, L: 1.28772, C: 1.28772, S: 4, V: 448, RV: 0
 */
//--- 否则。
   else
     {
      //--- 创建一个字符串,描述结构中的所有数据,带缩进并指定标题字段的宽度
      res=StringFormat("%s %s%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s",symbol,tf,num,
                       MqlRatesTime(rates,header_width,indent),
                       MqlRatesOpen(symbol,rates,header_width,indent),
                       MqlRatesHigh(symbol,rates,header_width,indent),
                       MqlRatesLow(symbol,rates,header_width,indent),
                       MqlRatesClose(symbol,rates,header_width,indent),
                       MqlRatesTickVolume(rates,header_width,indent),
                       MqlRatesSpread(rates,header_width,indent),
                       MqlRatesRealVolume(rates,header_width,indent)
                      );
      //--- 将接收到的字符串输出到日志中
      Print(res);
     }
   /* 输出示例(如果 Last 不为空):
 时间:2023.07.20 14:42:33
 出价: 1.28958
 Ask: 1.28962
 Last: 1.28947
 成交量: 33
 时间 msc: 2023.07.20 14:42:33.401
 标志:BID|ASK
 成交量:33。45
 
 输出示例(如果 Last 为空):
 时间:2023.07.20 14:42:33
 出价: 1.28958
 Ask: 1.28962
 Time msc: 2023.07.20 14:42:33.401
 Flags: BID|ASK
 */
  }
//+------------------------------------------------------------------+
 

我建议完成该功能。


string GetPrintSource( const string Source );

通过结构源返回打印函数的源。

 
fxsaber #:

我建议增加功能。


通过结构源返回打印函数的源。

能举个例子吗?我不明白。

 
Artyom Trishkin #:

能举个例子吗?我不明白。

string GetPrintSource( const string Source )
{
  return("string ToString( const STRUCT &Data ) { return(\"i = \" + (string)Data.i); }");
}

void OnStart()
{
  Print(GetPrintSource("struct STRUCT { int i; };"));
}
在这里 也做了类似的事情,不过是输入。
CheckInputs - нахождение аварийных проходов при Оптимизации советника
CheckInputs - нахождение аварийных проходов при Оптимизации советника
  • www.mql5.com
Во время Оптимизации советника некоторые проходы могут завершаться аварийно. Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий Новая версия платформы MetaTrader 5