OrderSelect

操作に使用する注文を選択します。関数実行が成功した場合は true を返します。関数実行が失敗した場合 false を返します。更なるエラー情報を取得するには、GetLastError() が呼ばれます。

bool  OrderSelect(
  ulong  ticket      // 注文チケット
  );

パラメータ

ticket

[in]  注文チケット

戻り値

bool 型の値

注意事項

現在の未決注文はクライアント端末の「ツールボックス」の「取引」タブに表示されているポジションと混乱されてはなりません。

ポジションの『ネッティング』計算時(ACCOUNT_MARGIN_MODE_RETAIL_NETTINGACCOUNT_MARGIN_MODE_EXCHANGE)各シンボルにつき常に一つのポジションのみ(1つ以上の取引の結果である)保有することができます。ポジションと『ツールボックス』パネルの『取引』タブに表示される有効な未決注文と混同しないようにしてください。

ポジションに制限がない場合(ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)各シンボルごとに同時に複数のポジションを保有することができます。

OrderSelect() 関数は、注文に関するデータをプログラム環境にコピーし、OrderGetDouble()OrderGetInteger()OrderGetString() の呼び出しは既に複製されたデータを返します。つまり、注文自体はもはや存在しなくても(または始値、決済逆指及び決済指レベルまたは期限が変更されても)、注文に関するデータはまだ取得することが出来ます。取得した注文情報が最新であるように、OrderGetTicket() を参照直前に呼び出すことが推奨されています。

例:

#define   EXPERT_MAGIC 123456
#define   OFFSET       50                     // 注文を出すための現在の価格からのオフセット(ポイント単位)
#define   DIRECTION     ORDER_TYPE_BUY_LIMIT   // 注文タイプ
#define   VOLUME       1.0                     // 数量
#define   DEVIATION     2                       // 価格から許容される偏差
 
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                              |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- 取引リクエスト、結果、変数を宣言して初期化する
  MqlTradeRequest request={};
  MqlTradeResult result ={};
  double         order_price=0;
 
//--- 未決注文パラメータ
  request.action    = TRADE_ACTION_PENDING;                               // trading operation type
  request.symbol    = _Symbol;                                           // symbol
  request.volume    = VOLUME;                                             // volume
  request.deviation = DEVIATION;                                         // allowed deviation from the price
  request.magic     = EXPERT_MAGIC;                                       // order MagicNumber
 
//--- 操作タイプを確認する
  switch(DIRECTION)
    {
    case ORDER_TYPE_BUY_LIMIT :
      request.type = ORDER_TYPE_BUY_LIMIT;                               // order type
      order_price  = SymbolInfoDouble(_Symbol, SYMBOL_ASK)-OFFSET*_Point;// open price
      request.price= NormalizeDouble(order_price, _Digits);             // normalized open price
      break;
    case ORDER_TYPE_SELL_LIMIT :
      request.type = ORDER_TYPE_SELL_LIMIT;                             // order type
      order_price  = SymbolInfoDouble(_Symbol, SYMBOL_BID)+OFFSET*_Point;// open price
      request.price= NormalizeDouble(order_price,_Digits);               // normalized open price
      break;
    case ORDER_TYPE_BUY_STOP :
      request.type = ORDER_TYPE_BUY_STOP;                               // order type
      order_price  = SymbolInfoDouble(_Symbol, SYMBOL_ASK)+OFFSET*_Point;// open price
      request.price= NormalizeDouble(order_price,_Digits);               // normalized open price
      break;
    case ORDER_TYPE_SELL_STOP :
      request.type = ORDER_TYPE_SELL_STOP;                               // order type
      order_price  = SymbolInfoDouble(_Symbol, SYMBOL_BID)-OFFSET*_Point;// open price
      request.price= NormalizeDouble(order_price,_Digits);               // normalized open price
      break;
    default: // if non-pending or StopLimit order is selected
      Alert("This example is only for placing pending orders BuyLimit, SellLimit, BuyStop and SellStop");
      break;
    }
 
//--- リクエストを送信する。リクエストの送信に失敗した場合、エラーコードを表示し、操作を完了する
  if(!OrderSend(request, result))
    {
    Print("OrderSend error ", GetLastError());
    return;
    }
   
//--- 操作データを表示する
  PrintFormat("Trade request result: retcode=%u, order=%I64u", result.retcode, result.order);
 
//--- 取引操作の結果から注文チケットを取得し、チケットで注文を選択する
  ulong ticket=result.order;
  ResetLastError();
  if(!OrderSelect(ticket))
    {
    PrintFormat("OrderSelect(%I64u) failed. Error %d", ticket, GetLastError());
    return;
    }
 
//--- チケットで選択された注文のデータを操作ログに表示する
  ENUM_ORDER_TYPE   type  = (ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
  long             time  = OrderGetInteger(ORDER_TIME_SETUP_MSC);
  double           price = OrderGetDouble(ORDER_PRICE_OPEN);
  double           volume= OrderGetDouble(ORDER_VOLUME_CURRENT);
  string           symbol= OrderGetString(ORDER_SYMBOL);
  int               digits= (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);
  PrintFormat("Current selected order: %s %.2f %s #%I64u at %.*f, %s",
              symbol, volume, OrderTypeDescription(type), ticket, digits, price, TimeMscToString(time));
  /*
   結果:
  Trade request result: retcode=10009, order=2811006719
  Current selected order: EURUSD 1.00 Buy Limit #2811006719 at 1.10550, 2024.09.04 10:38:28.563
  */
 }
//+------------------------------------------------------------------+
//| ミリ秒で時間を返す                                                    |
//+------------------------------------------------------------------+
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'));
 }
//+------------------------------------------------------------------+
//| 注文タイプの説明を返す                                                |
//+------------------------------------------------------------------+
string OrderTypeDescription(const ENUM_ORDER_TYPE type)
 {
  switch(type)
    {
    case ORDER_TYPE_BUY              : return("Buy");
    case ORDER_TYPE_SELL             : return("Sell");
    case ORDER_TYPE_BUY_LIMIT        : return("Buy Limit");
    case ORDER_TYPE_SELL_LIMIT       : return("Sell Limit");
    case ORDER_TYPE_BUY_STOP         : return("Buy Stop");
    case ORDER_TYPE_SELL_STOP        : return("Sell Stop");
    case ORDER_TYPE_BUY_STOP_LIMIT   : return("Buy Stop Limit");
    case ORDER_TYPE_SELL_STOP_LIMIT  : return("Sell Stop Limit");
    default                          : return("Unknown order type");
    }
 }

参照

OrderGetInteger()OrderGetDouble()OrderGetString()OrderCalcProfit()OrderGetTicket()注文プロパティ