【MT4/MQL4】分割決済したポジションの新しいチケット番号を取得する方法

分割決済後のチケット番号

MT4(MetaTrader4)ではポジションの一部を決済することができますが、残ったポジションのチケット番号は以前とは異なります。イメージしやすいよう具体例をあげてみます。図1は分割決済前で0.02ロットのポジションを保有しています。図2では図1のポジションを0.01ロットだけ決済した後になります。赤枠のチケット番号(注文番号)に注目するとチケット番号が異なることがわかります。

図1: 分割決済前
図1: 分割決済前
図2: 分割決済後
図2: 分割決済後

 

新しいチケット番号を取得する方法の検討

さて、MQL4ではポジションを決済する関数としてOrderClose関数が提供されています。この関数が新しいチケット番号を返してくれれば楽なのですが、この関数が返すのは決済処理が成功したかどうかのbool値です。したがって分割決済したポジションの新しいチケット番号が欲しい場合は、そのやり方を検討しないといけません。

その方法として決済前のチケット番号より大きいチケット番号を検索する間接的な方法がネットで紹介されているのをよく目にしますが、もっと直接的な方法があります。図3は分割決済後のポジションにコメント欄を表示したものですが、赤枠のコメントをご覧ください。実はコメントに決済前ポジションのチケット番号が自動で追記されているのがわかります。このコメントを利用すれば新しく採番されたチケット番号を取得できそうです。

図3: 分割決済後のコメント
図3: 分割決済後のコメント

 

新しいチケット番号を取得する関数の実装

下記のコードは分割決済前ポジションのチケット番号を渡すと新しいチケット番号を返す関数になります。全体的な処理内容は全注文内容をループで回してコメントに分割決済前のチケット番号が含まれているものを探索しています。ポイントは赤字の部分です。この赤字部分でコメントに決済前のチケット番号が含まれているかをチェックしています。

int GetNewTicketNum(int preTicketNum) {
   for(int i = 0; i < OrdersTotal(); i++) {
      if(OrderSelect(i, SELECT_BY_POS) == false) break;
      
      // コメントに分割決済前のチケット番号が含まれない場合はcontinue
      if(StringFind(OrderComment(), IntegerToString(preTicketNum)) == -1) continue;

      return OrderTicket();
   }
   
   return -1;
}
sponsor