【超入門】MQL5 EA講座 第89回「待機注文情報取得用クラスにpublic関数を実装する」

MQL5でEA作ろう講座

前回待機注文の情報取得・管理用のクラス関数を集約する事を目的としたインクルードファイル「OriginalPending.mqh」を作り、そこにOriginalCpendingクラスを作りました。

そして宣言したアクセスレベルprivate,publicそれぞれのメンバのうちOrderCount関数の処理実装記述について主に解説してきました。

クラスアクセスレベルについては↓の記事をご覧ください。

今回は、このOrderCount関数にメインプログラムからアクセスできるようにする、publicレベル関数の処理実装記述を解説していきたいと思います。

スポンサーリンク
スポンサーリンク

BuyLimitNum関数について

BuyLimitNum関数は買いリミット待機注文の数を取得するアクセスレベル=public関数です。

BuyLimitNum関数の戻り値と仮引数について

BuyLimitNum関数戻り値引数は以下の通りです。

// 買いのリミット注文数を取得する
int OriginalCpending::BuyLimitNum(string parSymbol)

引数「parSymbol」には取引銘柄が記述される想定です。買いリミット待機注文数を返す想定なので戻り値int型です。

BuyLimitNum関数の処理実装記述について

BuyLimitNum関数の処理実装記述は以下の通りです。

int OriginalCpending::BuyLimitNum(string parSymbol)
{
	OrderCount(parSymbol);
	return(CountBuyLimit);
}

BuyLimitNum関数の処理実装記述は極めてシンプルで、前回作ったOrderCount関数を{}内で呼び出して、privateレベルの変数である「CountBuyLimit」を呼び出して、戻り値としてreturnを使って返すだけです。

private関数であるOrderCount関数は、待機注文の種類に応じて待機注文の数を各種privateレベルの変数に振り分ける働きをしていますから、ここでは買いのリミット待機注文の数を格納している変数「CountBuyLimit」を呼び出せば、買いのリミット待機注文の数を取得する関数の完成です。

SellLimitNum関数について

SellLimitNum関数は売りリミット待機注文の数を取得するアクセスレベル=public関数です。

SellLimitNum関数の戻り値と仮引数について

SellLimitNum関数戻り値引数は以下の通りです。

// 売りのリミット注文数を取得する
int OriginalCpending::SellLimitNum(string parSymbol)

引数「parSymbol」には取引銘柄が記述される想定です。売りのリミット待機注文数を返す想定なので戻り値int型です。

SellLimitNum関数の処理実装記述について

SellLimitNum関数の処理実装記述は以下の通りです。

// 売りのリミット注文数を取得する
int OriginalCpending::SellLimitNum(string parSymbol)
{
	OrderCount(parSymbol);
	return(CountSellLimit);
}

SellLimitNum関数の処理実装記述もBuyLimitNum関数と構造は同様で、前回作ったOrderCount関数を{}内で呼び出して、privateレベルの変数である「CountSellLimit」を呼び出して、戻り値としてreturnを使って返すだけです。

private関数であるOrderCount関数は、待機注文の種類に応じて待機注文の数を各種privateレベルの変数に振り分ける働きをしていますから、ここでは売りのリミット待機注文の数を格納している変数「CountSellLimit」を呼び出せば、売りのリミット待機注文の数を取得する関数の完成です。

BuyStopNum関数について

BuyStopNum関数は買いストップ待機注文の数を取得するアクセスレベル=public関数です。

BuyStopNum関数の戻り値と仮引数について

BuyStopNum関数戻り値引数は以下の通りです。

// 買いのストップト注文数を取得する
int OriginalCpending::BuyStopNum(string parSymbol)

引数「parSymbol」には取引銘柄が記述される想定です。買いのストップ待機注文数を返す想定なので戻り値int型です。

BuyStopNum関数の処理実装記述について

BuyStopNum関数の処理実装記述は以下の通りです。

int OriginalCpending::BuyStopNum(string parSymbol)
{
	OrderCount(parSymbol);
	return(CountBuyStop);
}

前回作ったOrderCount関数を{}内で呼び出して、privateレベルの変数である「CountBuyStop」を呼び出して、戻り値としてreturnを使って返すだけです。

privateレベルの関数であるOrderCount関数は、待機注文の種類に応じて待機注文の数を各種privateレベルの変数に振り分ける働きをしていますから、ここでは買いのストップ待機注文の数を格納している「CountBuyStop」を呼び出せば、買いのストップ待機注文の数を取得する関数の完成です。

SellStopNum関数について

SellStopNum関数は売りのストップ待機注文の数を取得するアクセスレベル=public関数です。

SellStopNum関数の戻り値と仮引数について

SellStopNum関数戻り値引数は以下の通りです。

// 売りのストップト注文数を取得する
int OriginalCpending::SellStopNum(string parSymbol)

引数「parSymbol」には取引銘柄が記述される想定です。売りのストップ待機注文数を返す想定なので戻り値int型です。

SellStopNum関数の処理実装記述について

SellStopNum関数の処理実装記述は以下の通りです。

int OriginalCpending::SellStopNum(string parSymbol)
{
	OrderCount(parSymbol);
	return(CountSellStop);
}

前回作ったOrderCount関数を{}内で呼び出して、privateレベルの変数である「CountSellStop」を呼び出して、戻り値としてreturnを使って返すだけです。

privateレベルの関数であるOrderCount関数は、待機注文の種類に応じて待機注文の数を各種privateレベルの変数に振り分ける働きをしていますから、ここでは売りのストップ待機注文の数を格納している変数「CountSellStop」を呼び出せば、売りのストップ待機注文の数を取得する関数の完成です。

BuyStopLimitNum関数について

BuyStopLimitNum関数は買いストップリミット待機注文の数を取得するアクセスレベル=public関数です。

BuyStopLimitNum関数の戻り値と仮引数について

BuyStopLimitNum関数戻り値引数は以下の通りです。買いのストップリミット待機注文数を返す想定なので戻り値int型です。

ストップリミット注文については

講座記事第86回の「ストップリミットオーダーとは?」セクションをご覧ください。

// 買いのストップトリミット注文数を取得する
int OriginalCpending::BuyStopLimitNum(string parSymbol)

引数「parSymbol」には取引銘柄が記述される想定です。

BuyStopLimitNum関数の処理実装記述について

BuyStopLimitNum関数の処理実装記述は以下の通りです。

int OriginalCpending::BuyStopLimitNum(string parSymbol)
{
	OrderCount(parSymbol);
	return(CountBuyStopLimit);
}

前回作ったOrderCount関数を{}内で呼び出して、privateレベルの変数である「CountBuyStopLimit」を呼び出して、戻り値としてreturnを使って返すだけです。

private関数であるOrderCount関数は、待機注文の種類に応じて待機注文の数を各種privateレベルの変数に振り分ける働きをしていますから、ここでは買いストップリミット待機注文の数を格納している変数「CountBuyStopLimit」を呼び出せば、買いストップリミット待機注文の数を取得する関数の完成です。

SellStopLimitNum関数について

SellStopLimitNum関数は売りストップリミット待機注文の数を取得するアクセスレベル=public関数です。

SellStopLimitNum関数の戻り値と仮引数について

SellStopLimitNum関数戻り値引数は以下の通りです。

// 売りのストップトリミット注文数を取得する
int OriginalCpending::SellStopLimitNum(string parSymbol)

引数「parSymbol」には取引銘柄が記述される想定です。売りストップリミット待機注文数を返す想定なので戻り値int型です。

SellStopLimitNum関数の処理実装記述について

SellStopLimitNum関数の処理実装記述は以下の通りです。

int OriginalCpending::SellStopLimitNum(string parSymbol)
{
	OrderCount(parSymbol);
	return(CountSellStopLimit);
}

前回作ったOrderCount関数を{}内で呼び出して、privateレベルの変数である「CountSellStopLimit」を呼び出して、戻り値としてreturnを使って返すだけです。

privateレベルの関数であるOrderCount関数は、待機注文の種類に応じて待機注文の数を各種privateレベルの変数に振り分ける働きをしていますから、ここでは売りストップリミット待機注文の数を格納している「CountSellStopLimit」を呼び出せば、売りストップリミット待機注文の数を取得する関数の完成です。

TotalPendingNum関数について

TotalPendingNum関数待機注文全体の数を取得するアクセスレベル=public関数です。

TotalPendingNum関数の戻り値と仮引数について

TotalPendingNum関数引数は以下の通りです。

//待機注文全体の数を取得する
int OriginalCpending::TotalPendingNum(string parSymbol)

引数「parSymbol」には取引銘柄が記述される想定です。待機注文全体の数を返す想定なので戻り値int型です。

TotalPendingNum関数の処理実装記述について

TotalPendingNum関数の処理実装記述は以下の通りです。

int OriginalCpending::TotalPendingNum(string parSymbol)
{
	OrderCount(parSymbol);
	return(CountTotalPending);
}

前回作ったOrderCount関数を{}内で呼び出して、privateレベルの変数である「CountTotalPending」を呼び出して、戻り値としてreturnを使って返すだけです。

privateレベルの関数であるOrderCount関数は、待機注文の種類に応じて待機注文の数を各種privateレベルの変数に振り分ける働きをしていますから、ここでは待機注文全体の数を格納している変数「CountTotalPending」を呼び出せば、待機注文全体の数を取得する関数の完成です。

GetOrderTickets関数について

GetOrderTickets関数待機注文オーダー番号を取得するpublicレベルの関数です。

MQL5ではオーダー番号ポジション番号約定番号(ディール番号)という概念が存在します。

それぞれの違いについては各用語のアンカーテキストリンクから該当の記事をご参照ください。

GetOrderTickets関数の戻り値と仮引数について

GetOrderTickets関数戻り値引数は以下の通りです。

//オーダー番号を取得する
void OriginalCpending::GetOrderTickets(string parSymbol,ulong &parTickets[])

第1引数には取引銘柄、第2引数にはメインプログラムで待機注文オーダー番号を格納する配列を記述する想定になっています。配列returnで返すことはできないので、戻り値void型です。

参照渡しで第2引数配列に返します。

<参考リンク>

参照渡し 値渡し引数引数配列void型return演算子

GetOrderTickets関数の処理実装記述について

GetOrderTickets関数の処理実装記述は以下の通りです。

void OriginalCpending::GetOrderTickets(string parSymbol,ulong &parTickets[])
{
	OrderCount(parSymbol);//注文種別の振り分けと、各種配列各種格納配列へのオーダー番号代入を行う
	ArrayCopy(parTickets,TicketsPending);//メインプラグラムで用意した待機注文格納配列にオーダー番号をコピー
	return;
}

OrderCount関数を呼び出すのは、今回の記事でこれまでに説明してきた関数と同じです。

OrderCount関数を呼び出す理由はprivateレベルの配列「TicketsPending」を使う為です。配列「TicketsPending」には待機注文オーダー番号が格納されています。

ArrayCopy関数は第2引数に指定した配列を第1引数配列に複製する関数です。

従って、コピー元の配列「TicketsPending」を第2引数に記述し、第1引数にはメインプログラムで用意するコピー先配列(=GetOrderTickets関数引数「parTickets」に記述される配列)を記述します。

この処理記述によって、GetOrderTickets関数をメインプログラムから使う事によって、待機注文オーダー番号を取得できるようになりました。

OriginalCpendingクラスの全体記述

今回の講座記事では以下の関数OriginalCpendingクラス関数として追加し、その処理実装記述を解説しました。

OriginalCpendingクラスの全体記述は以下の通りです↓

//+------------------------------------------------------------------+
//|                                             OriginalCpending.mqh |
//|                                                         MQL5ssei |
//|                                    https://mqlinvestmentlab.com/ |
//+------------------------------------------------------------------+
#property copyright "MQL5ssei"
#property link      "https://mqlinvestmentlab.com/"
#property version   "1.00"

class OriginalCpending
  {
      private:
		void OrderCount(string parSymbol);
		int CountBuyLimit, CountSellLimit, CountBuyStop, CountSellStop, CountBuyStopLimit, CountSellStopLimit, CountTotalPending;
		ulong TicketsPending[];
		
		public:
		int BuyLimitNum(string parSymbol);
		int SellLimitNum(string parSymbol);
		int BuyStopNum(string parSymbol);
		int SellStopNum(string parSymbol);
		int BuyStopLimitNum(string parSymbol);
		int SellStopLimitNum(string parSymbol);
		int TotalPendingNum(string parSymbol);
		
		void GetOrderTickets(string parSymbol, ulong &parTickets[]);
  };
  
  void OriginalCpending::OrderCount(string parSymbol)
{
   //ポジション数を格納する変数の初期化
	CountBuyLimit = 0; 
	CountSellLimit = 0;
	CountBuyStop = 0; 
	CountSellStop = 0; 
	CountBuyStopLimit = 0; 
	CountSellStopLimit = 0; 
	CountTotalPending = 0;
	
	//オーダー番号を格納する配列の初期化とリサイズ
	ArrayResize(TicketsPending, 1);
	ArrayInitialize(TicketsPending, 0);
	
	for(int i = 0; i < OrdersTotal(); i++)//注文数分チェック
	{
		ulong ticket = OrderGetTicket(i);
		if(OrderGetString(ORDER_SYMBOL) == parSymbol)
		{
			long type = OrderGetInteger(ORDER_TYPE);
			
			switch((int)type)
			{
				case ORDER_TYPE_BUY_STOP://ストップ買い待機注文なら
				CountBuyStop++;//インクリメント
				break;
				
				case ORDER_TYPE_SELL_STOP://ストップ売り待機注文なら
				CountSellStop++;//インクリメント
				break;
				
				case ORDER_TYPE_BUY_LIMIT://リミット買い待機注文なら
				CountBuyLimit++;//インクリメント
				 break;
				
				case ORDER_TYPE_SELL_LIMIT://リミット売り待機注文なら
				CountSellLimit++; //インクリメント
				break;
				
				case ORDER_TYPE_BUY_STOP_LIMIT://ストップリミット買い待機注文なら
				
				CountBuyStopLimit++;//インクリメント
				 break;
				
				case ORDER_TYPE_SELL_STOP_LIMIT://ストップリミット売り待機注文なら
				CountSellStopLimit++; //インクリメント
				break;
			}//switch文の終わり
			
			//全体の待機注文数をインクリメント
			CountTotalPending++;
			
			ArrayResize(TicketsPending,CountTotalPending);
			TicketsPending[ArraySize(TicketsPending)-1] = ticket;
		}//if文の終わり
	}//for文の終わり
}//処理実装記述の終わり

// 買いのリミット注文数を取得する
int OriginalCpending::BuyLimitNum(string parSymbol)
{
	OrderCount(parSymbol);
	return(CountBuyLimit);
}


// 売りのリミット注文数を取得する
int OriginalCpending::SellLimitNum(string parSymbol)
{
	OrderCount(parSymbol);
	return(CountSellLimit);
}

// 買いのストップト注文数を取得する
int OriginalCpending::BuyStopNum(string parSymbol)
{
	OrderCount(parSymbol);
	return(CountBuyStop);
}

// 売りのストップト注文数を取得する
int OriginalCpending::SellStopNum(string parSymbol)
{
	OrderCount(parSymbol);
	return(CountSellStop);
}

// 買いのストップトリミット注文数を取得する
int OriginalCpending::BuyStopLimitNum(string parSymbol)
{
	OrderCount(parSymbol);
	return(CountBuyStopLimit);
}

// 売りのストップトリミット注文数を取得する
int OriginalCpending::SellStopLimitNum(string parSymbol)
{
	OrderCount(parSymbol);
	return(CountSellStopLimit);
}

//待機注文全体の数を取得する
int OriginalCpending::TotalPendingNum(string parSymbol)
{
	OrderCount(parSymbol);
	return(CountTotalPending);
}

//オーダー番号を取得する
void OriginalCpending::GetOrderTickets(string parSymbol,ulong &parTickets[])
{
	OrderCount(parSymbol);//注文種別の振り分けと、各種配列各種格納配列へのオーダー番号代入を行う
	ArrayCopy(parTickets,TicketsPending);//メインプラグラムで用意した待機注文格納配列にオーダー番号をコピー
	return;
}

今回は以上となります。

最後までお読みいただきありがとうございました。

※今回の内容がよくわからなかったという方は、ひょっとするとクラスに関しての基本的な理解が追い付いていない可能性があります。クラスについては以下のリンクをご参照ください。↓

MQL5 EA講座 第88回「待機注文情報取得用のクラスを追加する」

           →MQL5 EA講座 第90回「待機注文を修正する関数を実装する」

コメント

タイトルとURLをコピーしました