OrdersTotal HistoryDealsTotal HistoryOrdersTotal HistoryOrderGetTicket PositionGetTicket OrderGetTicket HistoryDealGetTicket
OrderSelect PositionSelect PositionSelectByTicket HistorySelect HistorySelectByPosition HistoryDealSelect HistoryOrderSelect PositionGetSymbol PositionGetDouble PositionGetInteger PositionGetString OrderGetDouble OrderGetInteger OrderGetString HistoryOrderGetDouble HistoryOrderGetInteger HistoryOrderGetString HistoryDealGetDouble HistoryDealGetInteger HistoryDealGetString
これらすべての関数の使い方を解説した記事です。
MQL5 には オーダー(orders)、ディール(deals)、ポジション(positions) に関する情報を取得するために 28 個もの関数がありますが、
これらは基本的に単体で使うのではなく組み合わせて使うので、どの組み合わせと順番で使えばいいかという「全体像」を理解する必要があります。
検索しても出てくるのは個別の関数を解説した情報ばかりでMT5に移行した際に少し苦労した気がするので、ここでまとめておきます。
この記事を読めば
MT5 に記録された個別の「オーダー」「ディール」「ポジション」に関する情報を取得するために、大量にある関数を「どの組み合わせと、順番で使えば」いいのか
がすぐに理解できます。
公式サイトの「日本語ページ」を見ると、「オーダー=注文」「ディール=約定」などと非常に不自然に翻訳されてますがわかりにくいので、ここではそのまま order, position, deal と呼びます。
大前提として、
(1) order, deal, position の厳密な違い
(2) Order から Position, Deal ができる一連の流れ
(3) ticket 番号とPositionID の役割と、これらが推移していく流れ
の3点をしっかりと理解していなければこの記事の内容は理解できません。
これらの点の理解が少しでも不十分な人は、まずは下記の記事を読んでください。
⇒ [MQL5] オーダー・ディール・ポジションの厳密な分類を解説!
Contents
【確認】オーダー、ディール、ポジション の違いに関して
確認のためですが、
- “Order” とは エントリー・エグジットしたいときに、自分のMT5ターミナルからサーバーに送る取引リクエスト のことです。
- “Position” とはエントリーの order が約定して、エグジットされるまでの間の 建玉を保有している状態 です。トレーディングにおける一般的な意味の「ポジション」と同義です。
- “Deal” とは order が受理される際に「どの価格で約定されたか」という「記録」です。
またこれら order, position, deal には固有の ticket 番号 と positionID があり、それらの役割と推移には決まりがあります。(こちらの記事にて詳しく説明しています)
【はじめに】関数を特徴別に分類します
オーダー、ポジション、ディールに関する関数はたくさんあるので、その特徴によって分類します。
「何個あるのか」を教えてくれる [Total系]、Ticket 番号を取得する [Ticket取得系]、条件を満たす “取引” を選択する [Select系]、具体的な詳細情報を取得する [情報取得系] に分けます。
[Total 系]
OrdersTotal, PositionsTotal, HistoryDealsTotal, HistoryOrdersTotal
[Ticket 取得]
PositionGetTicket, OrderGetTicket, HistoryOrderGetTicket, HistoryDealGetTicket
[Select]
OrderSelect, PositionSelectByTicket, HistorySelect, HistorySelectByPosition, HistoryDealSelect, HistoryOrderSelect, PositionSelect, PositionGetSymbol
[情報取得系]
- PositionGet系 (PositionGetDouble , PositionGetInteger, PositionGetString)
- OrderGet系 (OrderGetDouble, OrderGetInteger, OrderGetString)
- HistoryOrderGet系 (HistoryOrderGetDouble, HistoryOrderGetInteger, HistoryOrderGetString)
- HistoryDealGet系 (HistoryDealGetDouble, HistoryDealGetInteger, HistoryDealGetString)
関数の使い方は、実行中なのか・履歴(History)にあるのかで全く流れが異なる
まず理解するべきことがあります。
「orders, deals, positions は2パターンに分けられ、そのどちらに属すかによって情報取得までの流れが全くが異なる」という点です。
具体的に言うと orders, deals, positions の処理状況は
① まだ実行途中なのか(order なら「未約定」、position なら「現在保有中 = 未決済」)
② (すでに実行済みで) 履歴・History に入っているのか
の2通りがあり、どちらなのかによって特性が分けられます。
① の「実行途中」というのは、
order の場合なら「取引リクエストの送信は完了したが、実行は完了していない」という状況、position なら「現在ポジションを保有中で、未決済である」という意味です。
ちなみに deal はそもそも「約定の結果」として生じるものなので、History に入っているものしか存在しません。
この2通りの分類を踏まえた上で、order, deal, position のうち情報を取得できるのは以下にあてはまる物です。
つまり、Position の情報で取得できるのは「未決済のものだけ」であり、決済済みのポジションに関する情報は取得できません。
決済済みの Position に関して知りたいならば、その Position と関連している Deal と order をチェックする必要があります。
この画像から、情報を取得可能なのは、以下の4通りであることがわかります。
① 「未約定」の order
② 履歴 History にある order
③ 「未決済」の position
④ 履歴 History にある deal
①と③は実行中で、②と④は履歴・Historyにあります。
「実行中なのか or 履歴にあるのか」で分けて解説します。
[I] 実行中の場合の情報取得方法
① 「未約定」の order
③ 「未決済」の position(=保有中のポジション)
がこれに当たります。この場合の大きな流れとしては簡単で、以下の3ステップしかありません。
▼
▼
1) の「Ticket番号の取得」に関しては ”いつもの流れ” です。
「OrdersTotal() あるいは PositionsTotal() から “全部で何個あるか” がわかる」
⇒ (for文でループ処理をさせて)「OrderGetTicket(index) あるいは PositionGetTicket(index) で index に対応した Ticket が返ってくる」
という流れです。
なお、OrderGetTicket(index) は特殊な関数で、1) 「Ticket番号の取得」と 2)「Ticketを使って Select する」のを両方を同時に行います。
2) の「取得したTicket番号を使って Select する」に関しては
となります。直前に OrderGetTicket(index)を実行した場合には、Select の方も済んでいるので 2) は不要になります。
あとは 3) において
- PositionGet系 (PositionGetDouble , PositionGetInteger, PositionGetString)
- OrderGet系 (OrderGetDouble, OrderGetInteger, OrderGetString)
を実行すれば取得したい情報が手に入ります。
[II] 履歴の場合の情報取得方法
① 履歴 History にある order
③ 履歴 History にある deal
がこれに当たります。この場合の大きな流れは若干複雑です。2回の Select が必要になるためです。
▼
▼
▼
となります。要は、
(複数のorderとdealをまとめて)複数Select → 個別 Ticket 取得 → Ticket により個別 Select
という流れになります。
1)「複数の履歴をまとめて Select 」 には 2通りの方法があります。
- position ID を指定する方法( HistorySelectByPosition() )
- 開始日・終了日を指定する方法( HistorySelect(from_date,to_date) )
です。なお、この段階では履歴の order と deal は区別しません。
2) 「1つずつ、Ticket 番号を取得」 は “いつもの流れ” ですね。
「 HistoryDealsTotal() あるいは HistoryOrdersTotal() から ”全部で何個あるか” がわかる」
⇒ (for文で index 番号を1つずつ順にループ処理をさせ、)
「HistoryOrderGetTicket(index) あるいは HistoryDealGetTicket(index) で index に対応した Ticket が返ってくる」
となります。注意するべきなのは、
HistoryDealsTotal() と HistoryOrdersTotal() は口座履歴全体ではなく、1) で作成した履歴のリストの中に deal や order がいくつあるのかを返すという点です。
3) 「Ticket 番号を使って、個別Selectする」は
を使うだけです。あとは 4) において
- HistoryOrderGet系 (HistoryOrderGetDouble, HistoryOrderGetInteger, HistoryOrderGetString)
- HistoryDealGet系 (HistoryDealGetDouble, HistoryDealGetInteger, HistoryDealGetString)
を実行すれば取得したい情報が手に入ります。
[まとめ] 情報取得方法をまとめた図
これだけだと結構わかりにくいと思うので、一連の流れをまとめてみます。
まずは [I] 実行中 の場合です。① → ② → ③ の順番で行います。
次に [II] 履歴 の場合です。① → ② → ③ → ④ の順番で行います。
番外編:ネッティング口座専用関数
ネッティング口座は両建てができず、同じ銘柄の場合すべてのポジションが1つにまとめられる口座です。
ネッティング口座のみで使えるのは以下の関数になります。
PositionSelect(symbol), PositionGetSymbol(index)
- PositionSelect(symbol) は銘柄名を引数として、未決済のポジションをSelect 選択します。
- PositionGetSymbol(index) は引数が index のバージョンで、銘柄名を返し、未決済のポジションをSelect 選択します。銘柄名の取得とSelectを同時に行えるのが特徴です。
これら2つの関数はともに「未決済のポジション」を選択するものです。
ネッティングの場合は 1つの銘柄で1つのポジションしかないので、「1) Ticket 取得」をせずに、いきなり「2) Select を行う」ことが可能になります。
結論
本記事では MQL5 の「オーダー」「ディール」「ポジション」の情報を取得する際に、
関連するどの関数を、どの順番で使うべきか を図なども用いてわかりやすく解説しました。
もし理解できていない部分があった人は、「オーダー」「ディール」「ポジション」の違いを正しく理解していないことが要因かもしれません。復習も含めて下記の記事を読んでみましょう。
⇒ [MQL5] オーダー・ディール・ポジションの厳密な分類を解説!
なお下記の記事では「MQL4 から MQL5 に移行する際の全体像」を網羅的に解説しています。
具体的にどういった内容をどういった順番で学習していけばよいか知りたい方はご覧ください。
⇒ MQL4(MT4) → MQL5(MT5) に移行する際に勉強すべき内容まとめ!
今回の記事に関して、わかりにくい部分や疑問点があったら ↓ のコメント欄に残してください(もちろん匿名でも平気です)。
全てしっかりと回答させていただきます。
とても分かりやすくまとめられていて大変参考になりました。
今後ともぜひ続けていってください!ありがとうございます。
コメント嬉しく思います。ありがとうございます。
もし他に何か解説してほしい内容などございましたら、お気軽にお申し付けください。