記事"Expert Advisorプログラミングにおける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.|
//| Appointment: 取引履歴情報にアクセスするためのクラス。
//| クラス CObject から派生しています。|
//+------------------------------------------------------------------+
class CDealInfo : public CObject
  {
   ...
public:
   ...
   //--- 文字列位置プロパティへの高速アクセス・メソッド
   string            Symbol()           const;
   ...
  };
...
//+------------------------------------------------------------------+
//| プロパティ値 "DEAL_SYMBOL "を取得する。
//| INPUT: いいえ。|
//| OUTPUT: プロパティ値 "DEAL_SYMBOL"。
//|| REMARK: No.|
//+------------------------------------------------------------------+
string CDealInfo::Symbol() const
  {
   return(HistoryDealGetString(m_ticket,DEAL_SYMBOL));                           //馬鹿なリターン
  }
...
//+------------------------------------------------------------------+
//| 取引パラメータをテキストに変換する。
//| INPUT:str - 受信文字列、|
//| deal - クラス・インスタンスへのポインタ。
//| OUTPUT: フォーマットされた文字列。|
//|| REMARK: No.|
//+------------------------------------------------------------------+
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()関数の引数として渡される関数はどれですか?どのようなルールですか?

変数のスコープと同じ規則が、ここでも働きます。ある変数がグローバルレベルとローカルレベルで1つの名前で宣言されている場合、ローカルスコープ内ではその名前はローカル変数を指し、外ではグローバル変数を指します。

標準関数がクラス内でオーバーロードされた場合、オーバーロードされた関数本体はクラス内で呼び出され、標準関数本体はグローバル・レベルで呼び出される。オーバーロードされた関数本体は、クラス・ポインタを通してグローバル・レベルで呼び出すことができる。

 
Urain:

ここでも変数のスコープと 同じルールが働く。ある変数がグローバルレベルとローカルレベルで同じ名前で宣言されている場合、ローカルスコープ内ではその名前はローカル変数を指し、外ではグローバル変数を指すことになる。

標準関数がクラス内でオーバーロードされた場合、オーバーロードされた関数本体はクラス内で呼び出され、標準関数本体はグローバル・レベルで呼び出される。オーバーロードされた関数の本体は、クラスポインタを通してグローバルレベルで呼び出すことができます。

ありがとうございました!明快で理解しやすかったです!
 
サミュエル、このような詳細な記事を書いてくれてありがとう。感謝している。
 
わかりやすくていい
削除済み  
とてもいい記事だ!参考にしている。
 
1.4章では、COrderInfoの 記述に注文履歴を使っているが、正しいか?