①Defines.mqhに接続する「#include」を追加
前回、Defines.mqhファイルを作成いたしました。Order.mqhのCOrderクラスに、Defines.mqhに接続する「#include」の一行を追加し、privateセクションには注文/取引チケット(MQL5)を格納するクラスメンバー変数と、整数型、実数型、文字列型の注文プロパティを格納する3つの配列を作成します。
//+------------------------------------------------------------------+ //| Order.mqh | //| Copyright 2018, MetaQuotes Software Corp. | //| https://mql5.com/ja/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, MetaQuotes Software Corp." #property link "https://mql5.com/ja/users/artmedia70" #property version "1.00" #include <Object.mqh> #include "..\Defines.mqh" //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class COrder : public CObject { private: ulong m_ticket; // 選択された注文/取引チケット(MQL5) long m_long_prop[ORDER_PROP_INTEGER_TOTAL]; // 整数型プロパティ double m_double_prop[ORDER_PROP_DOUBLE_TOTAL]; // 実数型プロパティ string m_string_prop[ORDER_PROP_STRING_TOTAL]; // 文字列型プロパティ public: COrder(); ~COrder(); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ COrder::COrder() { } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ COrder::~COrder() { } //+------------------------------------------------------------------+
②デストラクタ削除とプライベートセクションに2つのメソッドを作成
同様に、プライベートセクションに2つのメソッドを作りましょう。
- 1つ目は、プロパティ配列内必須のプロパティの正確な位置を返すもの
- 2つ目は対応するプロテクトセクション内のプロテクトされたコンストラクタを返すもの
プロパティを初期化せずに空の注文オブジェクトを作成するデフォルトのコンストラクタは残し、デストラクタは削除します(不要、かつコンパイル時に自動的に作成される)
// ↓これがデストラクター
~COrder()
プロテクトされたコンストラクタは何もしません。オブジェクトを作成する際に、チケットはクラスのコンストラクタに渡され、注文プロパティすべてをすぐに初期化するために使用されます。「注文」はすでに選択されているので、選択された注文の必要なプロパティを取得し、オブジェクトのプロパティの配列に書き込むことができます。
//+------------------------------------------------------------------+ //| Order.mqh | //| Copyright 2018, MetaQuotes Software Corp. | //| https://mql5.com/ja/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, MetaQuotes Software Corp." #property link "https://mql5.com/ja/users/artmedia70" #property version "1.00" #include <Object.mqh> #include "..\Defines.mqh" //+------------------------------------------------------------------+ //| 抽象注文クラス | //+------------------------------------------------------------------+ class COrder : public CObject { private: ulong m_ticket; // 選択された注文/取引チケット(MQL5) long m_long_prop[ORDER_PROP_INTEGER_TOTAL]; // 整数プロパティ double m_double_prop[ORDER_PROP_DOUBLE_TOTAL]; // 実数プロパティ string m_string_prop[ORDER_PROP_STRING_TOTAL]; // 文字列プロパティ //--- 実数プロパティが実際に配置されている配列インデックスを返す int IndexProp(ENUM_ORDER_PROP_DOUBLE property) const { return (int)property-ORDER_PROP_INTEGER_TOTAL; } //--- 文字列プロパティが実際に配置されている配列インデックスを返す int IndexProp(ENUM_ORDER_PROP_STRING property) const { return (int)property-ORDER_PROP_INTEGER_TOTAL-ORDER_PROP_DOUBLE_TOTAL;} public: //--- デフォルトのコンストラクタ COrder(void){;} protected: //--- プロテクトされたコンストラクタのパラメータ COrder(ENUM_ORDER_STATUS order_status,const ulong ticket); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ COrder::COrder(ENUM_ORDER_STATUS order_status,const ulong ticket) { } //+------------------------------------------------------------------+
③メソッドの説明を追加
クロスプラットフォームのライブラリを構築するのが目的のため、注文プロパティを取得するためのメソッドを別に作成するほうが便利です。プロテクトされたセクションに、選択した注文の整数、実数、文字列プロパティを受け取るためのメソッドの説明を追加します。現在、プロパティを受け取るメソッドのみが宣言されています。メソッドはまだ実装されていませんが、クラスはエラーなくコンパイルされています。注文プロパティの配列は「クラスのコンストラクタ」で入力します。「クラスのコンストラクタ」では、先ほど追加したメソッドを使用します。準備ができたら、これらの配列を使って、プログラム内で要求に応じて任意のプロパティを取得できるようになります。
//+------------------------------------------------------------------+
//| Order.mqh |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://mql5.com/ja/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://mql5.com/ja/users/artmedia70"
#property version "1.00"
#include <Object.mqh>
#include "..\Defines.mqh"
//+------------------------------------------------------------------+
//| 抽象注文クラス |
//+------------------------------------------------------------------+
class COrder : public CObject
{
private:
ulong m_ticket; // 選択された注文/取引チケット(MQL5)
long m_long_prop[ORDER_PROP_INTEGER_TOTAL]; // 整数プロパティ
double m_double_prop[ORDER_PROP_DOUBLE_TOTAL]; // 実数プロパティ
string m_string_prop[ORDER_PROP_STRING_TOTAL]; // 文字列プロパティ
//--- 実数プロパティが実際に配置されている配列インデックスを返す
int IndexProp(ENUM_ORDER_PROP_DOUBLE property) const { return (int)property-ORDER_PROP_INTEGER_TOTAL; }
//--- 文字列プロパティが実際に配置されている配列インデックスを返す
int IndexProp(ENUM_ORDER_PROP_STRING property) const { return (int)property-ORDER_PROP_INTEGER_TOTAL-ORDER_PROP_DOUBLE_TOTAL;}
public:
//--- デフォルトのコンストラクタ
COrder(void){;}
protected:
//--- プロテクトされたコンストラクタのパラメータ
COrder(ENUM_ORDER_STATUS order_status,const ulong ticket);
//--- 選択した注文の整数プロパティをそのパラメータから取得して返す
long OrderMagicNumber(void) const;
long OrderTicket(void) const;
long OrderTicketFrom(void) const;
long OrderTicketTo(void) const;
long OrderPositionID(void) const;
long OrderPositionByID(void) const;
long OrderOpenTimeMSC(void) const;
long OrderCloseTimeMSC(void) const;
long OrderType(void) const;
long OrderTypeByDirection(void) const;
long OrderTypeFilling(void) const;
long OrderTypeTime(void) const;
long OrderReason(void) const;
long DealOrder(void) const;
long DealEntry(void) const;
bool OrderCloseByStopLoss(void) const;
bool OrderCloseByTakeProfit(void) const;
datetime OrderOpenTime(void) const;
datetime OrderCloseTime(void) const;
datetime OrderExpiration(void) const;
datetime PositionTimeUpdate(void) const;
datetime PositionTimeUpdateMSC(void) const;
//--- 選択した注文の実数プロパティをそのパラメータから取得して返す: (1) 始値、(2)終値、(3)利益
//--- (4)手数料、(5)スワップ、(6)ボリューム、(7)実行されていないボリューム、(8)ストップロス価格、(9)テイクプロフィット価格、(10)ストップリミット注文価格
double OrderOpenPrice(void) const;
double OrderClosePrice(void) const;
double OrderProfit(void) const;
double OrderCommission(void) const;
double OrderSwap(void) const;
double OrderVolume(void) const;
double OrderVolumeCurrent(void) const;
double OrderStopLoss(void) const;
double OrderTakeProfit(void) const;
double OrderPriceStopLimit(void) const;
//--- 選択した注文の文字列プロパティをパラメータから取得して返す: (1)銘柄、(2)コメント、(3)取引所でのID
string OrderSymbol(void) const;
string OrderComment(void) const;
string OrderExternalID(void) const;
//---
};
//+------------------------------------------------------------------+
//| Closedパラメトリックコンストラクタ |
//+------------------------------------------------------------------+
COrder::COrder(ENUM_ORDER_STATUS order_status,const ulong ticket)
{
}
//+------------------------------------------------------------------+
メソッドとは、プロセスを分割して必要に応じて使用する仕組みのことです。メソッドを使う理由は以下の2点です。
- プログラムを読みやすくするために、プロセスをそれぞれの方法に分けます。
- 何度も出てくるプロセスをメソッド化することで、プログラムを短縮します。
メソッドの二部構成
- コンポーネント化された処理を行うメソッドの本体部分
- 作成したメソッドを呼び出す部分
コメントを残す