ポジション情報の取得方法
MT5 で現在の口座のポジション情報を取得するには、下記のような関数に取得したい情報の enum 値を渡します。
- long PositionGetInteger(ENUM_POSITION_PROPERTY_INTEGER)
戻り値が整数(あるいは bool や enum 値)のポジション情報 - double PositionGetDouble(ENUM_POSITION_PROPERTY_DOUBLE)
戻り値が浮動小数点数のポジション情報 - string PositionGetString(ENUM_POSITION_PROPERTY_STRING)
戻り値が文字列のポジション情報
あと後述しますが、これらの関数には、戻り値が bool
型になった別バージョンも用意されています。
これらの関数を呼び出す前に、どのポジションの情報を取得するかを、次のような関数を使って選択しておく必要があります。 これらの関数を呼び出した瞬間に、内部的にそのポジションの情報がコピーされ、上記の参照関数で取得できるようになるようです。
- string PositionGetSymbol(int index)
ポジションの インデックス番号 を指定してポジションを選択します。指定可能なインデックスの範囲は0
〜PositionsTotal() - 1
です。この関数は、ついでに選択したポジションのシンボル名を返します。ポジションを選択できなかった場合は、空文字列 (""
) を返します。 - bool PositionSelect(string symbol)
シンボル名 でポジションを選択します。主にシンボルごとにポジションが集約されるネットアカウントで使われますが、ヘッジアカウントで使用すると、そのシンボルのポジションのうち、最小インデックスのポジションが選択されます。 - bool PositionSelectByTicket(ulong ticket)
ポジションの チケット番号 を指定してポジションを選択します。通し番号ではなく、ポジションごとに割り当てられたユニークな ID であることに注意してください。
☝️ ポジションの選択という煩わしさ
ポジションに関する情報を取得する場合、「ポジションの選択 → そのポジションの情報取得」 という手順を踏まないといけないため、コーディングが非常に煩わしくなってしまいます。
非同期処理があたり前の昨今では、このような API 体系は設計が悪いとしか言いようがないのですが、こうなっている以上、これを使ってがんばるしかないです。
多くの EA では独自のラッパー関数を作成して、ポジションの選択と情報取得をまとめて行うようにしているようです。
戻り値が bool 型のバージョン
PositionGetInteger
、PositionGetDouble
、PositionGetString
関数には、戻り値が bool 型になった次のようなオーバーロードが用意されています。
このバージョンを使うと、戻り値の真偽値によって、情報取得に成功したかどうかを判断できます。
取得した値は、2 つ目の引数で参照渡しした変数に格納されます。
ポジション情報を取得できなかったときのエラーチェックを入れる場合は、こちらのバージョンを使うとコードの意味が伝わりやすくなるかもしれません。 とはいえ、戻り値が数値や文字列のバージョンでも、値の取得に失敗した場合は 0 や空文字列を返すようになっているので、エラーチェックを行えないということはありません。
大して変わらないので、好きな方を使えばよさそうです。
サンプルコード(ポジション情報を表示する)
次のサンプルスクリプトは、現在保有しているポジションの情報をメッセージボックスで表示します。 ポジションの数だけ表示されるので注意してください。 メッセージボックスのタイトルバーに、現在表示中のポジションのインデックス番号が表示されます。
関連記事
- MetaTrader/MQL: 注文情報を取得する (OrderXxx) (MT5)
- MetaTrader/MQL: 成行注文の 4 つの注文執行方式 (Request Execution Type) を理解する
- MetaTrader/MQL: OrderSend で注文を出す (MT4)
- MetaTrader/MQL: アカウント情報(口座情報)を取得する (AccountInfo*) (MT5)
- MetaTrader/MQL: GitHub で MetaTrader 用のプログラムを管理する
- MetaTrader/MQL: 基本データ型一覧
- MetaTrader/MQL: EA のマジックナンバーについて理解する