Discussão do artigo "O uso de bibliotecas de classe de negócio padrão MQL5 ao escrever um Expert Advisor" - página 3

 

Também há linhas na classe COrderInfo

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

Mas a função Type() não está presente na classe.

 

A seção 1.4 do artigo fornece os recursos da classe COrderInfo, que, a julgar pela descrição, foi projetada para trabalhar com pedidos pendentes ativos. Sugere-se fazer o seguinte:"Para usar essa classe para obter as propriedades das ordens pendentes, primeiro solicitamos o número total de ordens e as selecionamos por tíquete de ordem"

/Selecionar todos os pedidos históricos para o período de tempo especificado
if (HistorySelect(0,TimeCurrent()))   // todos os pedidos
   {    
     // obter o número total de pedidos
     int o_total = OrdersTotal();
   }
Mas se a função HistorySelect() foi criada para consultaro "histórico de transações e ordens", ou seja, para consultar o histórico de ordens, por que usar essa função ao consultar o número total de ordens pendentes ativas?
 
Yedelkin:

Na classe COrderInfo ...

Mas a função Type() está ausente na classe.

A mesma situação com as classes CDealInfo e CPositionInfo
 

Alguém pode me explicar? Aqui está um trecho de código da classe CDealInfo:

//+------------------------------------------------------------------+
//|DealInfo.mqh
//+------------------------------------------------------------------+
#include <Object.mqh>
#include "SymbolInfo.mqh"
//+------------------------------------------------------------------+
//| Classe CDealInfo.|
//| Nomeação: Classe para acesso às informações do histórico do negócio.
//| Deriva da classe CObject.|
//+------------------------------------------------------------------+
class CDealInfo : public CObject
  {
   ...
public:
   ...
   //--- métodos de acesso rápido às propriedades de posição da string
   string            Symbol()           const;
   ...
  };
...
//+------------------------------------------------------------------+
//| Obtenha o valor da propriedade "DEAL_SYMBOL."
//| INPUT: não.|
//| OUTPUT: o valor da propriedade "DEAL_SYMBOL". ||
//|| OBSERVAÇÃO: não.|
//+------------------------------------------------------------------+
string CDealInfo::Symbol() const
  {
   return(HistoryDealGetString(m_ticket,DEAL_SYMBOL));                           //retorno estúpido
  }
...
//+------------------------------------------------------------------+
//| Converte os parâmetros do negócio em texto.
//| INPUT:str - string de recepção,|
//| deal - ponteiro na instância da classe. ||
//| OUTPUT: string formatada.|
//|| OBSERVAÇÃO: não.|
//+------------------------------------------------------------------+
string CDealInfo::FormatDeal(string& str) const
  {
   string type,volume,price,date;
   CSymbolInfo symbol;                                                    
//--- configuração
   symbol.Name(Symbol());
   int digits=symbol.Digits();
//--- formar a descrição da transação
   switch(Type())
     {
      ...
     }
//--- retornar o resultado
   return(str);
  }
...
//+------------------------------------------------------------------+

Aqui, a função CDealInfo::FormatDeal(string& str) contém essa linha:

   symbol.Name(Symbol());
Por sua vez, a função Symbol() é definida na própria classe CDealInfo e entre as funções padrão do terminal do cliente. Qual função é passada como argumento para a função symbol.Name()? Por qual regra?
 
Yedelkin:

Alguém pode me explicar? Aqui está um trecho de código da classe CDealInfo:

Aqui, a função CDealInfo::FormatDeal(string& str) contém essa linha:

Por sua vez, a função Symbol() é definida na própria classe CDealInfo e entre as funções padrão do terminal do cliente. Qual função é passada como argumento para a função symbol.Name()? Por qual regra?

A mesma regra do escopo das variáveis funciona aqui. Se uma variável for declarada com um nome nos níveis global e local, dentro do escopo local o nome apontará para a variável local e, fora dele, para a global.

Acontece que, se uma função padrão for sobrecarregada dentro de uma classe, o corpo da sobrecarga será chamado na própria classe e o corpo da função padrão será chamado no nível global. O corpo da função sobrecarregada pode ser chamado em nível global por meio do ponteiro da classe.

 
Urain:

A mesma regra funciona aqui como no escopo das variáveis. Se uma variável for declarada com o mesmo nome nos níveis global e local, então, dentro do escopo local, o nome apontará para a variável local e, fora dele, para a global.

Acontece que, se uma função padrão for sobrecarregada dentro de uma classe, o corpo da sobrecarga será chamado na própria classe e o corpo da função padrão será chamado no nível global. O corpo da função sobrecarregada pode ser chamado em nível global por meio do ponteiro da classe.

Muito obrigado! Está claro e compreensível!
 
Obrigado, Samuel, por escrever um artigo tão detalhado. Ele é muito apreciado.
 
Agradável e fácil de entender
[Excluído]  
Artigo muito bom! Estou usando-o como referência.
 
O capítulo 1.4 usa o histórico de pedidos para descrever o COrderInfo, certo?