文章 "编写"EA 交易"时,MQL5 标准交易类库的使用" - 页 3

 

COrderInfo 类中也有几行字

return(FormatType(str,Type()));
...
FormatType(type,Type())
...
if(m_type==Type() && m_state==State() &&

但该类中没有 Type() 函数。

 

文章第 1.4 节介绍了COrderInfo 类的功能,从描述来看,该类旨在处理活动挂单。建议如下:"要使用该类获取挂单的属性,我们首先要请求订单总数,然后按订单票号选择订单"。

//选择指定时间段内的所有历史订单
if (HistorySelect(0,TimeCurrent()))   // 所有订单
   {    
     // 获得订单总数
     int o_total = OrdersTotal();
   }
但如果HistorySelect() 函数是用来查询"交易和订单历史记录",即查询历史订单,为什么在查询有效挂单总数时要使用该函数呢?
 
Yedelkin:

在 COrderInfo 类中 ...

但该类中没有 Type() 函数。

CDealInfo 和 CPositionInfo 的情况也一样
 

谁能解释一下?下面是 CDealInfo 类的一段代码:

//+------------------------------------------------------------------+
//|DealInfo.mqh | |
//+------------------------------------------------------------------+
#include <Object.mqh>
#include "SymbolInfo.mqh"
//+------------------------------------------------------------------+
//| 类 CDealInfo。|
//| 预约:用于访问历史交易信息的类。
//| 从 CObject 类派生。|
//+------------------------------------------------------------------+
class CDealInfo : public CObject
  {
   ...
public:
   ...
   //--- 快速访问字符串位置属性的方法
   string            Symbol()           const;
   ...
  };
...
//+------------------------------------------------------------------+
//| 获取属性值 "DEAL_SYMBOL"。
//| INPUT: no.|
//| 输出:属性值 "DEAL_SYMBOL"。
//|| 备注:没有。|
//+------------------------------------------------------------------+
string CDealInfo::Symbol() const
  {
   return(HistoryDealGetString(m_ticket,DEAL_SYMBOL));                           //愚蠢地返回
  }
...
//+------------------------------------------------------------------+
//| 将交易参数转换为文本。
//| INPUT:str - 接收字符串、|
//| deal - 类实例指针。
//| 输出:格式化字符串。|
//|| 备注:没有。|
//+------------------------------------------------------------------+
string CDealInfo::FormatDeal(string& str) const
  {
   string type,volume,price,date;
   CSymbolInfo symbol;                                                    
//--- 设置
   symbol.Name(Symbol());
   int digits=symbol.Digits();
//--- 形成交易说明
   switch(Type())
     {
      ...
     }
//--- 返回结果
   return(str);
  }
...
//+------------------------------------------------------------------+

这里的函数 CDealInfo::FormatDeal(string& str) 包含这一行:

   symbol.Name(Symbol());
反过来,Symbol() 函数既定义在 CDealInfo 类本身中,也定义在客户端的标准函数 中。哪个函数作为参数传递给 symbol.Name() 函数?根据什么规则?
 
Yedelkin:

谁能解释一下?下面是 CDealInfo 类的一段代码:

这里的函数 CDealInfo::FormatDeal(string& str) 包含这一行:

反过来,Symbol() 函数既定义在 CDealInfo 类本身中,也定义在客户端的标准函数 中。哪个函数作为参数传递给 symbol.Name() 函数?根据什么规则?

与变量作用域的规则相同。如果一个变量在全局和局部范围内以同一个名称声明,那么在局部范围内,名称将指向局部变量,而在全局范围外,名称将指向全局变量。

事实证明,如果在类中重载了一个标准函数,重载的主体将在类本身中调用,而标准函数的主体将在全局级别调用。重载函数的主体可以通过类指针在全局级别调用。

 
Urain:

这里的规则与变量作用域的 规则相同。如果一个变量在全局和局部范围内以相同的名称声明,那么在局部范围内,该名称将指向局部变量,而在全局范围外,则指向全局变量。

事实证明,如果在类中重载了一个标准函数,重载的主体将在类本身中调用,而标准函数的主体将在全局级别调用。重载函数的主体可以通过类指针在全局级别调用。

非常感谢!非常清晰易懂!
 
感谢塞缪尔撰写如此深入的文章。非常感谢。
 
漂亮易懂
[删除]  
非常好的文章!我将以此为参考。
 
第 1.4 章使用订单历史记录来描述COrderInfo,对吗?