ポジションのクローズは反対売買
MT5 においてポジションのクローズ(決済)を行うには、OrderSend
で逆方向のポジションを追加する注文を行います。
つまり、現在のポジションと相殺するように買い注文 or 売り注文を出します。
現在の口座が、両建て可能な「ヘッジアカウント」の場合、反対注文を出すときは、対象のポジションを特定するためのチケット番号 (MqlTradeRequest.position
) を指定しなければいけないことに注意してください。
「ネットアカウント」を使用している場合は、シンボル(銘柄)だけを指定すれば OK です(ポジションのチケット番号を指定しても無視されます)。
ネットアカウントにおけるポジションクローズ
ネットアカウントにおいて既存のポジションをクローズするには、シンボル名を指定して OrderSend
で成行注文 (action == TRADE_ACTION_DEAL
) あるいは、指値注文 (action == TRADE_ACTION_PENDING
) を入れます。
成行注文でも指値注文でも決済タイミングが異なるだけで同様です。
あるシンボルのポジションをすべて閉じるには、反対方向に同じボリュームだけ売買注文を入れる必要があります。
そのため、まずは現在のポジションの量を調べます。
見つかったポジションのタイプが POSITION_TYPE_BUY
であれば、ロングポジション(買いポジ)を持っているので、同じボリュームの売り注文を出せば、すべてのポジションをクローズできることになります。
ネットアカウント(両建てなし口座)において、上記のスクリプトを実行すると、カレントシンボルのポジションをすべて決済します。
ただし、ヘッジアカウント(両建てあり口座)で実行すると、最初に見つかったポジションと同量の反対ポジションが新規にオープンされることに注意してください。
なぜなら、ヘッジアカウントで各ポジションのロット数を増減させるときは、対象のポジションを示すチケット番号 (MqlTradeRequest.position
) を指定しなければいけないからです。
ヘッジアカウントでポジションのチケット番号を指定せずに注文すると、新規にポジションが作られ、新しいチケット番号が割り当てられます。
ヘッジアカウントでも、次のように取得したポジションのチケット番号を MqlTradeRequest.position
に指定してやれば、反対方向の売買注文がそのポジションのクローズ(ロット数削減)として扱われます。
ただし、ヘッジアカウントにおいて PositionSelect
関数(シンボル指定)でポジションを選択すると、そのシンボル内で一番古いポジションが 1 つだけ選択されることになります。
つまり、上記のように取得したチケット番号でポジションをクローズしようとすると、一番古いポジションだけがクローズされることになります。
次に説明する、ポジションチケット単位でクローズする処理は、ネットアカウントとヘッジアカウントの両方で動作します。
ヘッジアカウントにおけるポジションクローズ(ネットアカウントでも利用可)
ヘッジアカウント(両建て可能口座)では、1 つのシンボルにつき複数のポジションを同時保有することができます。
そのため、ヘッジアカウントにおいて、あるシンボルのポジションをすべてクローズするには、複数のポジションをループ処理して順番にクローズしていく必要があります。
すべてのポジションをループ処理するには、PositionGetTicket
あるいは PositionGetSymbol
にインデックスを指定してポジション情報を 1 つずつ取得していきます。
ポイントは、ポジションクローズ時に残りのポジションのインデックスがずれてしまわないように、後ろのインデックスのものからクローズしていく ところです。
ちなみに、ネットアカウントにおいても、ポジションのチケット番号の取得や、チケット番号ベースでの情報取得が可能です。
なので、上記の closeAllPositions
関数は、ネットアカウントでも動作します(OrderSend
関数はあくまでシンボル名に従って売買処理を行います)。
マジックナンバーの一致をチェックする
ヘッジアカウントで動作させる EA において、その EA がオープンしたポジションだけを決済対象にしたいときは、PositionGetInteger
関数でポジションのマジックナンバーを取得して、自分自身がオープンしたポジションかどうかをチェックします。
関連記事