【MT5のワンティップ】メソッドを作成して説明を追加

①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点です。

  1. プログラムを読みやすくするために、プロセスをそれぞれの方法に分けます。
  2. 何度も出てくるプロセスをメソッド化することで、プログラムを短縮します。

メソッドの二部構成

  1. コンポーネント化された処理を行うメソッドの本体部分
  2. 作成したメソッドを呼び出す部分

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

ABOUTこの記事をかいた人

当サイトは、システムトレードに関する専門的な知識、技術、経験を皆様と共有することで、真剣なトレーダーの方々にインスピレーション(アイデアの源泉)の供給をいたします。トレーダーの競争力強化に焦点をあて、トレーディングシステムの構築を目的としてその普及に貢献します。 詳細は「概要とサービス内容」をご覧下さい。 ご要望はこちらで承ります。