Обсуждение статьи "Как использовать торговые классы Стандартной библиотеки при написании советника" - страница 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"
//+------------------------------------------------------------------+
//| Class CDealInfo.                                                 |
//| Appointment: Class for access to history deal info.              |
//|              Derives from class CObject.                         |
//+------------------------------------------------------------------+
class CDealInfo : public CObject
  {
   ...
public:
   ...
   //--- fast access methods to the string position propertyes
   string            Symbol()           const;
   ...
  };
...
//+------------------------------------------------------------------+
//| Get the property value "DEAL_SYMBOL".                            |
//| INPUT:  no.                                                      |
//| OUTPUT: the property value "DEAL_SYMBOL".                        |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
string CDealInfo::Symbol() const
  {
   return(HistoryDealGetString(m_ticket,DEAL_SYMBOL));                           //тупо return
  }
...
//+------------------------------------------------------------------+
//| Converts the deal parameters to text.                            |
//| INPUT:  str  - receiving string,                                 |
//|         deal - pointer at the class instance.                    |
//| OUTPUT: formatted string.                                        |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
string CDealInfo::FormatDeal(string& str) const
  {
   string type,volume,price,date;
   CSymbolInfo symbol;                                                    
//--- set up
   symbol.Name(Symbol());
   int digits=symbol.Digits();
//--- form the description of the deal
   switch(Type())
     {
      ...
     }
//--- return the result
   return(str);
  }
...
//+------------------------------------------------------------------+

 Здесь функция CDealInfo::FormatDeal(string& str) содержит вот такую строчку:

   symbol.Name(Symbol());
В свою очередь, функция Symbol() определена как в самом классе CDealInfo, так и среди стандартных функций клиентского терминала. Какая именно функция передаётся в качестве аргумента в функцию symbol.Name()? По какому правилу? 
 
Yedelkin:

Может кто объяснит? Вот есть такой кусочек кода из класса CDealInfo:

 Здесь функция CDealInfo::FormatDeal(string& str) содержит вот такую строчку:

В свою очередь, функция Symbol() определена как в самом классе CDealInfo, так и среди стандартных функций клиентского терминала. Какая именно функция передаётся в качестве аргумента в функцию symbol.Name()? По какому правилу? 

Тут работает тоже правило что и с областью видимости переменных. Если под одним именем объявлена переменная на глобальном и локальном уровне, то внутри локальной области имя будет указывать на локальную переменную, а во вне на глобальную.

Получается если внутри класса перегружена стандартная функция, то в самом классе будет вызываться тело перегрузки а на глобальном уровне тело стандартной функции. Тело же перегруженной функции, на глобальном уровне можно вызвать через указатель класса.

 
Urain:

Тут работает тоже правило что и с областью видимости переменных. Если под одним именем объявлена переменная на глобальном и локальном уровне, то внутри локальной области имя будет указывать на локальную переменную, а во вне на глобальную.

Получается если внутри класса перегружена стандартная функция, то в самом классе будет вызываться тело перегрузки а на глобальном уровне тело стандартной функции. Тело же перегруженной функции, на глобальном уровне можно вызвать через указатель класса.

Спасибо огромное! Чётко и понятно!
Причина обращения: