【超入門】MQL5 EA講座 第84回「ポジション情報を取得する独立関数を作る」【MT5用EAの作り方】

MQL5でEA作ろう講座

前回第83回では、「OriginalCPositionsクラスに以下のメンバ関数を追加しました。

今回は、引き続きポジション情報を取得する為の関数を追加していきます。

今回の関数は、クラスのメンバ関数に組み込まなくても、機能できる関数なので、独立関数として宣言・定義していきます。

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

PositionComment関数について

PositionComment関数ポジションに付与されているコメントを取得する事を想定して作るオリジナル関数です。

※組み込み関数であるComment関数とは違うので注意してください。Comment関数は、チャートの左上に任意の文字列を表示させる関数です。今回作るPositionComment関数は、あくまでもポジションに付与されているコメントを取得する為のものです。

Comment関数については↓の記事をご覧ください。

PositionComment関数の引数構成と戻り値

PositionComment関数引数構成と戻り値は以下の通りです。

string PositionComment(ulong parTicket = 0)

引数parTicketにはポジション番号が記述される想定です。

ポジション番号は、OriginalCPositions クラスのメンバ関数であるGetBuyPosNum関数GetSellPosNum関数GetTotalPosNum関数などを使って取得します。

「コメント」という文字情報を取得して、戻り値として返すので、必然的にデータ型string型になります。

PositionComment関数の処理実装記述

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


{//ポジション選択可否を格納する変数
	bool select = false;
	//ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、コメント情報を取得して戻り値として返す
	if(select == true) return(PositionGetString(POSITION_COMMENT));
	//選択ができなかった場合は、事前定義された値を返す
	else return(NULL);
}

bool型変数「select」は、PositionSelectByTicket関数の処理結果を受け取る変数です。初期値はfalseとしておきます。

if(parTicket > 0)がtrueの場合、変数「parTicket 」にポジション番号が格納されていることを意味しますから、PositionSelectByTicket関数引数変数「parTicket 」を記述して、ポジション選択を行います。選択の結果を変数「select」に格納するのは、先に説明した通りです。

変数「select」の結果がtrueであれば、ポジション選択に成功したことを意味するので、PositionGetString関数引数定数値「POSITION_COMMENT」を記述することによって、コメント情報を取得します。

変数「select」の結果がfalseであれば、ポジション選択に失敗したことを意味するので、else文で「NULL」を返します。

NULLについて

NULL」というのは、何のデータも含まれない状態のことを指し示す用語で、MQL5においては事前定義された値を返す定数値です。

シンプルに言えば、NULLは「空っぽ」や「ない」を意味する特別な値で、値が設定されていないまたは適用されない場合に使われます。

コメントは、元々は「何も書かれていない」のが事前定義された状態ですから、ポジション選択に失敗した場合は、空白状態のコメントを返します。

NULLの語源は、これはラテン語の「nullus」から来ており、「無い」、「何もない」、あるいは「無効」を意味します。

PositionType関数について

PositionType関数ポジションタイプを取得する事を想定して作るオリジナル関数です。

ポジションタイプというのは、要は買いポジションを持っているのか、売りポジションを持っているのか、というポジションの方向に関する情報の事です。

PositionType関数の引数構成と戻り値

PositionType関数引数構成と戻り値は以下の通りです。

long PositionType(ulong parTicket = 0)

引数parTicketにはポジション番号が記述される想定です。

ポジション番号は、OriginalCPositions クラスのメンバ関数であるGetBuyPosNum関数GetSellPosNum関数GetTotalPosNum関数などを使って取得します。

ポジション番号を取得し、戻り値として返すのでデータ型long型になります。

PositionType関数の処理実装記述

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

long PositionType(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、ポジションタイプを取得して戻り値として返す
	if(select == true) return(PositionGetInteger(POSITION_TYPE));
	else return(WRONG_VALUE);
}

bool型変数「select」は、PositionSelectByTicket関数の処理結果を受け取る変数です。初期値はfalseとしておきます。

if(parTicket > 0)がtrueの場合、変数「parTicket 」にポジション番号が格納されていることを意味しますから、PositionSelectByTicket関数引数変数「parTicket 」を記述して、ポジション選択を行います。

変数「select」の結果がtrueであれば、ポジション選択に成功したことを意味するので、

PositionGetInteger関数引数定数値「POSITION_TYPE」を記述することによって、ポジションタイプ情報を取得します。

ポジションタイプはENUM_POSITION_TYPEで定義されており、

POSITION_TYPE_BUY戻り値として返ってくれば買いポジション

POSITION_TYPE_SELL戻り値として返ってくれば売りポジション

という事になります。

変数「select」の結果がfalseであれば、ポジション選択に失敗したことを意味するので、else文で「WRONG_VALUE」を返します。

WRONG_VALUEについて

WRONG_VALUEは、処理が正しく行われなかった事を知らせる時に使われる定数値で、主にエラーハンドリングのために使う値です。定数の値としては「-1」を返します

※エラーハンドリングとは、プログラムが予期せぬ状況に遭遇した時に、それをどう処理するかを決めるプロセスのことです。

WRONG_VALUEは「不正な値」または「不適切な値」として理解できます。

プログラム内でWRONG_VALUEを使うことによって「入力された値が正しくないよ」と伝え、適切な値の入力を促す等の、他のアクションを取ることができます。

PositionOpenTime関数について

PositionOpenTime関数は、注文が出された時刻を取得する事を想定したオリジナル関数です。

PositionOpenTime関数の引数構成と戻り値について

PositionOpenTime関数引数構成と戻り値は以下のようになっています。

long PositionOpenTime(ulong parTicket = 0)

引数parTicketにはポジション番号が記述される想定です。

ポジション番号は、OriginalCPositions クラスのメンバ関数であるGetBuyPosNum関数GetSellPosNum関数GetTotalPosNum関数などを使って取得します。

「1970年1月1日からの経過秒」という形でデータを取得し、戻り値として返すのでデータ型long型になります。

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

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

long PositionOpenTime(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、ポジションタイプを取得して戻り値として返す
	if(select == true) return(PositionGetInteger(POSITION_TIME));
	else return(WRONG_VALUE);
}

bool型変数「select」は、PositionSelectByTicket関数の処理結果を受け取る変数です。初期値はfalseとしておきます。

if(parTicket > 0)がtrueの場合、変数「parTicket 」にポジション番号が格納されていることを意味しますから、PositionSelectByTicket関数引数変数「parTicket 」を記述して、ポジション選択を行います。

変数「select」の結果がtrueであれば、ポジション選択に成功したことを意味するので、

PositionGetInteger関数引数定数値「POSITION_TIME」を記述することによって、ポジションがオープンした時間を取得し、それを戻り値として返します。

変数「select」の結果がfalseであれば、ポジション選択に失敗したことを意味するので、else文で「WRONG_VALUE」を返します。

PositionOpenPrice関数について

PositionOpenPrice関数は、

ポジションを持った時の価格を取得する事を想定して作るオリジナル関数です。

PositionOpenPrice関数の引数構成と戻り値

PositionOpenPrice関数引数構成と戻り値は以下の通りです。

double PositionOpenPrice(ulong parTicket = 0)

引数parTicketにはポジション番号が記述される想定です。

ポジション番号は、OriginalCPositions クラスのメンバ関数であるGetBuyPosNum関数GetSellPosNum関数GetTotalPosNum関数などを使って取得します。

ポジション価格は、小数点を含んだ数になるので、戻り値データ型は必然的にdouble型になります。

PositionOpenPrice関数の処理実装記述

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

{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、ポジションを持った時の価格を取得して戻り値として返す
	if(select == true) return(PositionGetDouble(POSITION_PRICE_OPEN));
	else return(WRONG_VALUE);
}

bool型変数「select」は、PositionSelectByTicket関数の処理結果を受け取る変数です。初期値はfalseとしておきます。

if(parTicket > 0)がtrueの場合、変数「parTicket 」にポジション番号が格納されていることを意味しますから、PositionSelectByTicket関数引数変数「parTicket 」を記述して、ポジション選択を行います。

変数「select」の結果がtrueであれば、ポジション選択に成功したことを意味するので、

PositionGetDouble関数引数定数値「POSITION_PRICE_OPEN」を記述することによって、ポジションのオープン価格情報を取得します。

変数「select」の結果がfalseであれば、ポジション選択に失敗したことを意味するので、else文で「WRONG_VALUE」を返します。

PositionVolume関数について

PositionVolume関数はポジションのロット数を取得する事を前提としたオリジナル関数です。

PositionVolume関数の引数構成と戻り値

PositionVolume関数引数構成と戻り値は以下の通りです。

double PositionVolume(ulong parTicket = 0)

引数parTicketにはポジション番号が記述される想定です。

ポジション番号は、OriginalCPositions クラスのメンバ関数であるGetBuyPosNum関数GetSellPosNum関数GetTotalPosNum関数などを使って取得します。

ロット数は、小数点を含んだ情報となるので、戻り値データ型double型になります。

PositionVolume関数の処理実装記述

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

{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、ロット数を取得して戻り値として返す
	if(select == true) return(PositionGetDouble(POSITION_VOLUME));
	else return(WRONG_VALUE);
}

bool型変数「select」は、PositionSelectByTicket関数の処理結果を受け取る変数です。初期値はfalseとしておきます。

if(parTicket > 0)がtrueの場合、変数「parTicket 」にポジション番号が格納されていることを意味しますから、PositionSelectByTicket関数引数変数「parTicket 」を記述して、ポジション選択を行います。

変数「select」の結果がtrueであれば、ポジション選択に成功したことを意味するので、

PositionGetDouble関数引数定数値「POSITION_VOLUME」を記述することによって、ロット数情報を取得します。

変数「select」の結果がfalseであれば、ポジション選択に失敗したことを意味するので、else文で「WRONG_VALUE」を返します。

PositionStopLoss関数について

PositionStopLoss関数は、ポジションの損切り値を取得する事を想定したオリジナル関数です

PositionStopLoss関数の引数構成と戻り値

PositionStopLoss関数引数構成と戻り値は以下の通りです。

double PositionStopLoss(ulong parTicket = 0)

引数parTicketにはポジション番号が記述される想定です。

ポジション番号は、OriginalCPositions クラスのメンバ関数であるGetBuyPosNum関数GetSellPosNum関数GetTotalPosNum関数などを使って取得します。

損切り価格は、小数点を含んだ数になるので、戻り値データ型は必然的にdouble型になります。

PositionStopLoss関数の処理実装記述

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

{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、損切り値を取得して戻り値として返す
	if(select == true) return(PositionGetDouble(POSITION_SL));
	else return(WRONG_VALUE);
}

bool型変数「select」は、PositionSelectByTicket関数の処理結果を受け取る変数です。初期値はfalseとしておきます。

if(parTicket > 0)がtrueの場合、変数「parTicket 」にポジション番号が格納されていることを意味しますから、PositionSelectByTicket関数引数変数「parTicket 」を記述して、ポジション選択を行います。

変数「select」の結果がtrueであれば、ポジション選択に成功したことを意味するので、

PositionGetDouble関数引数定数値「POSITION_SL」を記述することによって、損切り価格情報を取得します。

変数「select」の結果がfalseであれば、ポジション選択に失敗したことを意味するので、else文で「WRONG_VALUE」を返します。

PositionTakeProfit関数について

PositionTakeProfit関数は、ポジションの利益確定値を取得する事を想定したオリジナル関数です

PositionTakeProfit関数の引数構成と戻り値

PositionTakeProfit関数引数構成と戻り値は以下の通りです。

double PositionTakeProfit(ulong parTicket = 0)

引数parTicketにはポジション番号が記述される想定です。

ポジション番号は、OriginalCPositions クラスのメンバ関数であるGetBuyPosNum関数GetSellPosNum関数GetTotalPosNum関数などを使って取得します。

利益確定価格は、小数点を含んだ数になるので、戻り値データ型double型になります。

PositionTakeProfit関数の処理実装記述

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

{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、利益確定値を取得して戻り値として返す
	if(select == true) return(PositionGetDouble(POSITION_TP));
	else return(WRONG_VALUE);
}

bool型変数「select」は、PositionSelectByTicket関数の処理結果を受け取る変数です。初期値はfalseとしておきます。

if(parTicket > 0)がtrueの場合、変数「parTicket 」にポジション番号が格納されていることを意味しますから、PositionSelectByTicket関数引数変数「parTicket 」を記述して、ポジション選択を行います。

変数「select」の結果がtrueであれば、ポジション選択に成功したことを意味するので、

PositionGetDouble関数引数定数値「POSITION_TP」を記述することによって、利益確定価格情報を取得します。

変数「select」の結果がfalseであれば、ポジション選択に失敗したことを意味するので、else文で「WRONG_VALUE」を返します

PositionProfit関数について

PositionProfit関数は、ポジションの損益情報(いくら利益が、あるいは損失が出ているか)を取得する事を想定したオリジナル関数です

PositionProfit関数の引数構成と戻り値

PositionProfit関数引数構成と戻り値は以下の通りです。

double PositionProfit(ulong parTicket = 0)

引数parTicketにはポジション番号が記述される想定です。

ポジション番号は、OriginalCPositions クラスのメンバ関数であるGetBuyPosNum関数GetSellPosNum関数GetTotalPosNum関数などを使って取得します。

損益に関する情報は、小数点を含んだ数になるので、戻り値データ型double型になります。

PositionProfit関数の処理実装記述

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

{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、損益情報を取得して戻り値として返す
	if(select == true) return(PositionGetDouble(POSITION_PROFIT));
	else return(WRONG_VALUE);
}

bool型変数「select」は、PositionSelectByTicket関数の処理結果を受け取る変数です。初期値はfalseとしておきます。

if(parTicket > 0)がtrueの場合、変数「parTicket 」にポジション番号が格納されていることを意味しますから、PositionSelectByTicket関数引数変数「parTicket 」を記述して、ポジション選択を行います。

変数「select」の結果がtrueであれば、ポジション選択に成功したことを意味するので、

PositionGetDouble関数引数定数値「POSITION_PROFIT」を記述することによって、ポジションの損益情報を取得します。

変数「select」の結果がfalseであれば、ポジション選択に失敗したことを意味するので、else文で「WRONG_VALUE」を返します

PositionMagicNumber関数について

PositionMagicNumber関数は、ポジションに付与されているマジックナンバーを取得する事を想定したオリジナル関数です

PositionMagicNumber関数の引数構成と戻り値

PositionMagicNumber関数引数構成と戻り値は以下の通りです。

double PositionMagicNumber(ulong parTicket = 0)

引数parTicketにはポジション番号が記述される想定です。

ポジション番号は、OriginalCPositions クラスのメンバ関数であるGetBuyPosNum関数GetSellPosNum関数GetTotalPosNum関数などを使って取得します。

マジックナンバーは、整数データになるので、戻り値データ型long型になります。

PositionMagicNumber関数の処理実装記述

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

{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、マジックナンバーを取得して戻り値として返す
	if(select == true) return(PositionGetInteger(POSITION_MAGIC));
	else return(NULL);
}

bool型変数「select」は、PositionSelectByTicket関数の処理結果を受け取る変数です。初期値はfalseとしておきます。

if(parTicket > 0)がtrueの場合、変数「parTicket 」にポジション番号が格納されていることを意味しますから、PositionSelectByTicket関数引数変数「parTicket 」を記述して、ポジション選択を行います。

変数「select」の結果がtrueであれば、ポジション選択に成功したことを意味するので、

PositionGetInteger関数引数定数値「POSITION_MAGIC」を記述することによって、マジックナンバーを取得します。

変数「select」の結果がfalseであれば、ポジション選択に失敗したことを意味するので、else文で「WRONG_VALUE」を返します

今回追加・解説した関数のまとめ

今回の記事では、以下の関数の処理実装記述を解説しました

今回追加・解説した関数の記述をまとめると以下のようになります↓

//+------------------------------------------------------------------+
//|ポジション情報を取得する関数群                                         |
//+------------------------------------------------------------------+


string PositionComment(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
	bool select = false;
	//ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、コメント情報を取得して戻り値として返す
	if(select == true) return(PositionGetString(POSITION_COMMENT));
	//選択ができなかった場合は、事前定義された値を返す
	else return(NULL);
}


long PositionType(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、ポジションタイプを取得して戻り値として返す
	if(select == true) return(PositionGetInteger(POSITION_TYPE));
	else return(WRONG_VALUE);
}


long PositionOpenTime(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、ポジションタイプを取得して戻り値として返す
	if(select == true) return(PositionGetInteger(POSITION_TIME));
	else return(WRONG_VALUE);
}

double PositionOpenPrice(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、ポジションを持った時の価格を取得して戻り値として返す
	if(select == true) return(PositionGetDouble(POSITION_PRICE_OPEN));
	else return(WRONG_VALUE);
}

double PositionVolume(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、ロット数を取得して戻り値として返す
	if(select == true) return(PositionGetDouble(POSITION_VOLUME));
	else return(WRONG_VALUE);
}


double PositionStopLoss(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、損切り値を取得して戻り値として返す
	if(select == true) return(PositionGetDouble(POSITION_SL));
	else return(WRONG_VALUE);
}


double PositionTakeProfit(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、利益確定値を取得して戻り値として返す
	if(select == true) return(PositionGetDouble(POSITION_TP));
	else return(WRONG_VALUE);
}


double PositionProfit(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
	bool select = false;
	//ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、損益情報を取得して戻り値として返す
	if(select == true) return(PositionGetDouble(POSITION_PROFIT));
	else return(WRONG_VALUE);
}

long PositionMagicNumber(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、マジックナンバーを取得して戻り値として返す
	if(select == true) return(PositionGetInteger(POSITION_MAGIC));
	else return(NULL);
}

今回解説した関数は、クラスのメンバ関数ではありませんが、ポジション情報を取得する関数群なので、同じファイル内にあるのが望ましいです。

従って、「OriginalCPositionsクラスの下にこれらの関数群を追加します。↓

//ポジション情報を管理するクラス------------------------------
class OriginalCPositions
{
   protected:
      ulong BuyPosNum[];
      ulong SellPosNum[];
      ulong PosNum[];
      
      int BuyPosCount;
      int SellPosCount;
      int TotalPosCount;
      
      void GetPosInfo(ulong parMagicNum = 0);
      int ChangeArraySize(ulong &parArray[]); 
      
   public:
      int GetBuyPosCount(ulong parMagicNum);
      int GetSellPosCount(ulong parMagicNum);
      int GetTotalPosCount(ulong parMagicNum);
      
      
      void GetBuyPosNum(ulong parMagicNum,ulong &parTickets[]);
      void GetSellPosNum(ulong parMagicNum,ulong &parTickets[]);
      void GetTotalPosNum(ulong parMagicNum,ulong &parTickets[]);

};

// ポジション情報を取得・振り分けする関数
void OriginalCPositions::GetPosInfo(ulong parMagicNumber = 0)
{  
    //ポジション数を格納する変数の初期化
   BuyPosCount = 0;
   SellPosCount = 0;
   TotalPosCount = 0;
   
   //ポジション番号格納配列の初期化とリサイズ
   ArrayResize(BuyPosNum, 1);
   ArrayInitialize(BuyPosNum, 0);
   
   ArrayResize(SellPosNum, 1);
   ArrayInitialize(SellPosNum, 0);
   
   ArrayResize(PosNum, 1);
   ArrayInitialize(PosNum, 0);
  
   
   for(int i = 0; i < PositionsTotal(); i++)//未決済ポジション内を一番古いポジからチェック
	{
	   ulong posNumber = PositionGetTicket(i);//ポジションプール内からインデックス順にポジション番号を取得
	   PositionSelectByTicket(posNumber);//ポジション選択
	   
	   if(PositionGetInteger(POSITION_MAGIC) != parMagicNumber && parMagicNumber > 0) continue;
	   //当該EAからの注文でなければスキップ
	   
	   if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
	   {  //買いポジションの数を1増加させる
	      BuyPosCount++;
	      int arrayIndex = ChangeArraySize(BuyPosNum);//配列をリサイズし、インデックスを戻り値として返す
	      BuyPosNum[arrayIndex] = PositionGetInteger(POSITION_TICKET);//Buy ポジション番号情報を配列に格納
	     
	   }
	   else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
	   {  ////売りポジションの数を1増加させる
	      SellPosCount++;
	      int arrayIndex = ChangeArraySize(SellPosNum);//配列をリサイズし、インデックスを戻り値として返す
	      
	      SellPosNum[arrayIndex] = PositionGetInteger(POSITION_TICKET);//Sell ポジション番号情報を配列に格納
	      
	   }
	   //全体のポジション数を1増加させる
	   TotalPosCount++; 
      int arrayIndex = ChangeArraySize(PosNum);//配列をリサイズし、インデックスを戻り値として返す
      PosNum[arrayIndex] = PositionGetInteger(POSITION_TICKET);//全てのポジションの ポジション番号情報を配列に格納
      
	}// for(int i = 0; i < PositionsTotal(); i++)の終端
	
	//各種ポジカウント変数とポジション番号格納配列に必要な情報を振り分けて作業を終える
}

//配列サイズを変更し、配列インデックスを返す関数
int OriginalCPositions::ChangeArraySize(ulong &parArray[])
{
  //配列の新しいサイズを計算
  int newSize = ArraySize(parArray) + 1;
  
//リサイズに失敗した場合に、ログ出力する
  if(ArrayResize(parArray, newSize) == -1)
    {
     //リサイズに失敗した場合のエラーハンドリング
     Print("配列のリサイズに失敗しました.");
     return -1; // 適切なエラーコードを返す
    }
  //配列の最後のインデックスを計算
  int arrayIndex = newSize - 1;

  //変数「arrayIndex」の値を戻り値として返す
  return arrayIndex;
}

//買いポジションの数を取得する関数
int OriginalCPositions::GetBuyPosCount(ulong parMagicNum)
{
   GetPosInfo(parMagicNum);//各種ポジカウント変数とポジション番号格納配列に、必要な情報を振り分けるprotected関数
   
   //protected変数の「BuyPosCount」を呼び出し、戻り値として返す
   return BuyPosCount;
}


//売りポジションの数を取得する関数
int OriginalCPositions::GetSellPosCount(ulong parMagicNum)
{
   GetPosInfo(parMagicNum);//各種ポジカウント変数とポジション番号格納配列に、必要な情報を振り分けるprotected関数
   
   //protected変数の「BuyPosCount」を呼び出し、戻り値として返す
   return SellPosCount;
}


//買いと売りの合計ポジションの数を取得する関数
int OriginalCPositions::GetTotalPosCount(ulong parMagicNum)
{
   GetPosInfo(parMagicNum);//各種ポジカウント変数とポジション番号格納配列に、必要な情報を振り分けるprotected関数
   
   //protected変数の「BuyPosCount」を呼び出し、戻り値として返す
   return TotalPosCount;
}


void OriginalCPositions::GetBuyPosNum(ulong parMagicNum,ulong &parTickets[])
{
   GetPosInfo(parMagicNum);//各種ポジカウント変数とポジション番号格納配列に、必要な情報を振り分けるprotected関数
   ArrayCopy(parTickets,BuyPosNum);
   return;
}



void OriginalCPositions::GetSellPosNum(ulong parMagicNum,ulong &parTickets[])
{
   GetPosInfo(parMagicNum);//各種ポジカウント変数とポジション番号格納配列に、必要な情報を振り分けるprotected関数
   ArrayCopy(parTickets,SellPosNum);
   return;
}

void OriginalCPositions::GetTotalPosNum(ulong parMagicNum,ulong &parTickets[])
{
  GetPosInfo(parMagicNum);//各種ポジカウント変数とポジション番号格納配列に、必要な情報を振り分けるprotected関数
   ArrayCopy(parTickets,PosNum);
   return;
}

//+------------------------------------------------------------------+
//|ポジション情報を取得する関数群                                         |
//+------------------------------------------------------------------+


string PositionComment(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
	bool select = false;
	//ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、コメント情報を取得して戻り値として返す
	if(select == true) return(PositionGetString(POSITION_COMMENT));
	//選択ができなかった場合は、事前定義された値を返す
	else return(NULL);
}


long PositionType(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、ポジションタイプを取得して戻り値として返す
	if(select == true) return(PositionGetInteger(POSITION_TYPE));
	else return(WRONG_VALUE);
}


long PositionOpenTime(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、ポジションタイプを取得して戻り値として返す
	if(select == true) return(PositionGetInteger(POSITION_TIME));
	else return(WRONG_VALUE);
}

double PositionOpenPrice(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、ポジションを持った時の価格を取得して戻り値として返す
	if(select == true) return(PositionGetDouble(POSITION_PRICE_OPEN));
	else return(WRONG_VALUE);
}

double PositionVolume(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、ロット数を取得して戻り値として返す
	if(select == true) return(PositionGetDouble(POSITION_VOLUME));
	else return(WRONG_VALUE);
}


double PositionStopLoss(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、損切り値を取得して戻り値として返す
	if(select == true) return(PositionGetDouble(POSITION_SL));
	else return(WRONG_VALUE);
}


double PositionTakeProfit(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、利益確定値を取得して戻り値として返す
	if(select == true) return(PositionGetDouble(POSITION_TP));
	else return(WRONG_VALUE);
}


double PositionProfit(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
	bool select = false;
	//ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、損益情報を取得して戻り値として返す
	if(select == true) return(PositionGetDouble(POSITION_PROFIT));
	else return(WRONG_VALUE);
}

long PositionMagicNumber(ulong parTicket = 0)
{//ポジション選択可否を格納する変数
   bool select = false;
   //ポジション番号を選択する
   if(parTicket > 0) select = PositionSelectByTicket(parTicket);
	//ポジション選択ができていれば、マジックナンバーを取得して戻り値として返す
	if(select == true) return(PositionGetInteger(POSITION_MAGIC));
	else return(NULL);
}

今回はOriginalCTradeクラスは省略していますが、すべて同じ

OriginalTrade.mqhファイル

に入っています。

今回は以上とさせていただきます。

最後までお読みいただきありがとうございました<m(__)m>

【超入門】MQL5 EA講座 第83回「ポジション情報管理クラスを作る-その2」

         →MQL5 EA講座 第85回「ポジションを決済する関数を作る」

コメント

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