前回第83回では、「OriginalCPositions」クラスに以下のメンバ関数を追加しました。
- ChangeArraySize関数(ポジション情報が格納された配列の、配列サイズ変更を担うアクセスレベル=protectedの内部関数)
- GetBuyPosCount関数(買いポジションの数を取得して返すアクセスレベル=publicの関数)
- GetSellPosCount関数(売りポジションの数を取得して返すアクセスレベル=publicの関数)
- GetTotalPosCount関数(買いと売り、合計のポジション数を取得して返すアクセスレベル=publicの関数)
- GetBuyPosNum関数(買いポジションのポジション番号情報を取得するアクセスレベル=publicの関数)
- GetSellPosNum関数(売りポジションのポジション番号情報を取得するアクセスレベル=publicの関数)
- GetTotalPosNum関数(買いと売り両方のポジションの、ポジション番号情報を取得するアクセスレベル=publicの関数)
今回は、引き続きポジション情報を取得する為の関数を追加していきます。
今回の関数は、クラスのメンバ関数に組み込まなくても、機能できる関数なので、独立関数として宣言・定義していきます。
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関数の引数構成と戻り値は以下の通りです。
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」を返します
今回追加・解説した関数のまとめ
今回の記事では、以下の関数の処理実装記述を解説しました
- PositionComment関数(ポジションに付与されているコメントを取得する事オリジナル関数)
- PositionType関数(ポジションタイプを取得するオリジナル関数)
- PositionOpenTime関数(注文が出された時刻を取得する事を想定したオリジナル関数)
- PositionOpenPrice関数(ポジションを持った時の価格を取得するオリジナル関数)
- PositionVolume関数(ポジションのロット数を取得するオリジナル関数)
- PositionStopLoss関数(ポジションの損切り値を取得するオリジナル関数)
- PositionTakeProfit関数(ポジションの利益確定値を取得するオリジナル関数)
- PositionProfit関数(ポジションの損益情報を取得するオリジナル関数)
- PositionMagicNumber関数(ポジションのマジックナンバーを取得するオリジナル関数)
今回追加・解説した関数の記述をまとめると以下のようになります↓
//+------------------------------------------------------------------+
//|ポジション情報を取得する関数群 |
//+------------------------------------------------------------------+
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クラスは省略していますが、すべて同じ
に入っています。
今回は以上とさせていただきます。
最後までお読みいただきありがとうございました<m(__)m>
コメント