
② MT5 におけるポジション履歴の取得方法について
ポジション・注文・約定の関係
1つのポジションには、2つ以上の注文履歴データ、および約定履歴データが存在する。
たいていは、1つのポジションにつき、2つの注文履歴データ、および2つの約定履歴データが存在する。
ただし、分割決済のばあいは、注文履歴データと約定履歴データが3つ以上存在するばあいがある。
分割決済のばあい、そうでないばあいとは処理をわける必要がある。
たとえば、決済した際の日時を求めるには、通常パターンのばあい、注文履歴データから取得するが、通常パターンではないばあい、注文履歴データでは正しい値がとれず、約定履歴データから取得する必要がある。
MT5には、ポジションの履歴データを取得するための関数がない(現在のポジションを取得するための関数はある)。
かわりに、ポジションIDをパラメータに渡すことで、そのポジションIDに該当する注文履歴データと約定履歴データを取得するためのHistorySelectByPosition()関数が存在する。
この関数を実行するためのポジションIDの取得は、HistoryOrdersTotal()関数で取得する。
ただし、上の図をみればわかるように、1つのポジションデータには複数の注文データが存在するため、注文データからポジションIDを取得すると、ポジションIDが重複してしまうので注意が必要。
その他備忘録
・決済した日時については、分割決済ではないばあいは注文履歴データのOUTから取得することができるが、分割決済のばあい、約定履歴データから取得する。
・決済した金額については、分割決済ではないばあいは約定履歴データのOUTから取得することができるが、分割決済のばあい、注文履歴データのOUTのClosePriceに約定履歴データのLotを乗算して平均値を求めると、合致する。
・スワップおよび利益に関しては、約定履歴データのすべてのスワップおよび利益を集計すると値が合致する。
ポジション履歴では取得できないもの
・StopLossとTakeProfitは、
HistorySelectByPosition()関数実行後の
HistoryOrderGetDouble(ticket, ORDER_SL)
HistoryOrderGetDouble(ticket, ORDER_TP)
では取得できない。上記2つの関数の結果は、空っぽとなってしまう。
そのため、
HistoryOrderGetString(ticket, ORDER_COMMENT)
で取得できるコメントに文字列として含まれているStopLossおよびTakeProfitを抽出する。
しかし、これでもまだ、抜けが出る。