PositionSelectByTicket

指定したチケットによって今後の作業で使用する保有ポジションを選択します。関数の実行に成功した場合、trueを返します。関数の実行に失敗した場合、falseを返します。エラーに関する情報を取得するには、GetLastError()関数を呼び出す必要があります。

bool  PositionSelectByTicket(
  ulong  ticket     // ポジションチケット
  );

パラメータ

ticket

[in]  ポジションチケット。

戻り値

bool型の値。

注意事項

PositionSelectByTicket()関数はソフトウェア環境でのポジションについての情報をコピーし、後続のPositionGetDouble()PositionGetInteger()PositionGetString()の呼び出しは前にコピーしたデータを返します。これはつまり、ポジション自体はすでになくても(またはポジションのボリュームや方向が変わったなど)、このポジションのデータは取得できるということを意味しています。ポジションの最新データの取得を確実なものにする為には、直接PositionSelectByTicket()関数を適用前に呼び出すことをお勧めします。

例:

#define   EXPERT_MAGIC 123456   // マジックナンバー
 
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                              |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- リクエストおよび結果の構造体を宣言して初期化する
  MqlTradeRequest request={};
  MqlTradeResult result ={};
 
//--- ロング(買い)注文を出す際のパラメータを入力する
  request.action    = TRADE_ACTION_DEAL;                     // 取引操作の種類
  request.symbol    = Symbol();                               // 銘柄
  request.volume    = 0.1;                                   // 0.1ロットの数量
  request.type      = ORDER_TYPE_BUY;                         // 注文の種類
  request.price     = SymbolInfoDouble(Symbol(), SYMBOL_ASK); // 始値
  request.deviation = 5;                                     // 価格から許容される偏差
  request.magic     = EXPERT_MAGIC;                           // 注文のマジックnアンバー
 
//--- リクエストを送信する。リクエストの送信に失敗した場合、エラーコードを表示し、操作を完了する
  if(!OrderSend(request, result))
    {
    PrintFormat("OrderSend error ", GetLastError());
    return;
    }
     
//--- 操作データを表示する
  PrintFormat("Trade request result: retcode: %u, deal: %I64u, order: %I64u", result.retcode, result.deal, result.order);
 
//--- 取引操作の結果からポジションチケットを取得し、チケットでポジションを選択する
//--- 新しく開かれたポジションのチケットは、その取引を生成した注文のチケットに対応する
  ulong ticket=result.order;
  ResetLastError();
  if(!PositionSelectByTicket(ticket))
    {
    PrintFormat("PositionSelectByTicket(%I64u) failed. Error %d", ticket, GetLastError());
    return;
    }
 
//--- チケットで選択されたポジションのデータを操作ログに表示する
  ENUM_POSITION_TYPE type  = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
  long               time  = PositionGetInteger(POSITION_TIME_MSC);
  double             price = PositionGetDouble(POSITION_PRICE_OPEN);
  double             volume= PositionGetDouble(POSITION_VOLUME);
  string             symbol= PositionGetString(POSITION_SYMBOL);
  int               digits= (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);
  PrintFormat("Current selected position: %s %.2f %s #%I64u at %.*f, %s",
              symbol, volume, (type==POSITION_TYPE_BUY ? "Buy" : "Sell"), ticket, digits, price, TimeMscToString(time));
  /*
   結果:
  Trade request result: retcode: 10009, deal: 2778100901, order: 2803905975
  Current selected position: EURUSD 0.10 Buy #2803905975 at 1.10672, 2024.09.02 12:09:51.239
  */
 }
//+------------------------------------------------------------------+
//| ミリ秒で時間を返す                                                    |
//+------------------------------------------------------------------+
string TimeMscToString(const long time_msc, int flags=TIME_DATE|TIME_MINUTES|TIME_SECONDS)
 {
  return(TimeToString(time_msc/1000, flags) + "." + IntegerToString(time_msc %1000, 3, '0'));
 }

参照

PositionGetSymbol(), PositionsTotal(), ポジションプロパティ