見出し画像

② MT5 におけるポジション履歴の取得方法について

五十嵐貴之

ポジション・注文・約定の関係

 1つのポジションには、2つ以上の注文履歴データ、および約定履歴データが存在する。
たいていは、1つのポジションにつき、2つの注文履歴データ、および2つの約定履歴データが存在する。
ただし、分割決済のばあいは、注文履歴データと約定履歴データが3つ以上存在するばあいがある。

MT5におけるポジション履歴の取得方法について

分割決済のばあい、そうでないばあいとは処理をわける必要がある。
たとえば、決済した際の日時を求めるには、通常パターンのばあい、注文履歴データから取得するが、通常パターンではないばあい、注文履歴データでは正しい値がとれず、約定履歴データから取得する必要がある。

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を抽出する。
しかし、これでもまだ、抜けが出る。

この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
五十嵐貴之

よろしければサポートをお願いします!サポートで頂いた費用は、コンテンツのための設備費等のために使わせていただきます!

五十嵐貴之
東京情報大学経営情報学部情報学科卒業。 令和元年より、東京情報大学校友会信越ブロック支部長。 プログラマー、システムエンジニア、ITコンサルタント。 IT著書多数。 近著、「SQL Server Transact-SQLプログラミング 実践開発ガイド」。