OrderSelect

작업할 주문을 선택합니다. 함수가 성공적으로 완료되었으면 true를 반환합니다. 함수 완료에 실패한 경우 false를 반환합니다. 오류에 대한 정보를 얻으려면 GetLastError()를 호출하십시오.

bool  OrderSelect(
   ulong   ticket      // 주문 티켓 
   );

매개 변수

ticket

[in]  주문 티켓.

반환값

bool 유형의 값.

참고

현재 보류 주문을 클라이언트 터미널의 "도구 상자"의 "거래" 탭에도 표시되는 포지션과 혼동하지 마십시오.

포지션 (ACCOUNT_MARGIN_MODE_RETAIL_NETTINGACCOUNT_MARGIN_MODE_EXCHANGE)의 "netting" 해석의 경우, 언제든지 하나의 포지션이 하나의 심볼에 대해 존재할 수 있습니다. 이 포지션은 하나 이상의 거래의 결과입니다. Toolbox 창의 Trading 탭에도 표시되는 유효한 보류 주문과 포지션을 혼동하지 마십시오

개별 포지션이 허용되는 경우 (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING), 하나의 심볼로 여러 포지션을 오픈할 수 있습니다.

함수 OrderSelect()는 주문에 대한 데이터를 프로그램 환경으로 복사하고, 추가로 OrderGetDouble(), OrderGetInteger(), OrderGetString()를 호출하면 이전에 복사된 데이터가 반환됩니다. 즉, 주문 자체가 더 이상 존재하지 않을 수 있지만(또는 오픈 프라이스, 스탑 로스/이익 실현 수준 또는 만료일 변경) 이 주문의 데이터는 여전히 얻을 수 있습니다. 주문에 대한 새로운 데이터를 수신하려면 OrderSelect()을 호출하여 해당 주문을 참조하는 것이 좋습니다.

예:

#define   EXPERT_MAGIC  123456
#define   OFFSET        50                      // offset from the current price to place the order, in points
#define   DIRECTION     ORDER_TYPE_BUY_LIMIT    // order type
#define   VOLUME        1.0                     // volume
#define   DEVIATION     2                       // allowed deviation from the price
 
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함수                                          |
//+------------------------------------------------------------------+
void OnStart()
  {
//-- 거래 요청, 결과 및 변수를 선언하고 초기화
   MqlTradeRequest request={};
   MqlTradeResult  result ={};
   double          order_price=0;
   
//--- 펜딩 주문 접수 매개 변수들
   request.action    = TRADE_ACTION_PENDING;                               // 주문 동작 유형
   request.symbol    = _Symbol;                                            // 심볼
   request.volume    = VOLUME;                                             // 볼륨
   request.deviation = DEVIATION;                                          // 가격으로 부터 허용된 편차
   request.magic     = EXPERT_MAGIC;                                       // 주문 매직넘버
   
//--- 동작 유형 확인
   switch(DIRECTION)
     {
      case ORDER_TYPE_BUY_LIMIT :
        request.type = ORDER_TYPE_BUY_LIMIT;                               // 주문 유형
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_ASK)-OFFSET*_Point;// 시가 
        request.priceNormalizeDouble(order_price_Digits);              // 노멀라이즈된 주문 가격
        break;
      case ORDER_TYPE_SELL_LIMIT :
        request.type = ORDER_TYPE_SELL_LIMIT;                              // 주문 유형
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_BID)+OFFSET*_Point;// 시가 
        request.priceNormalizeDouble(order_price,_Digits);               // 노멀라이즈된 시가
        break;
      case ORDER_TYPE_BUY_STOP :
        request.type = ORDER_TYPE_BUY_STOP;                                // 주문 유형
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_ASK)+OFFSET*_Point;// 시가 
        request.priceNormalizeDouble(order_price,_Digits);               // 노멀라이즈된 시가
        break;
      case ORDER_TYPE_SELL_STOP :
        request.type = ORDER_TYPE_SELL_STOP;                               // 주문 유형
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_BID)-OFFSET*_Point;// 시가 
        request.priceNormalizeDouble(order_price,_Digits);               // 노멀라이즈된 시가
        break;
      default// 만약 펜딩이 아니 주문 혹은 스탑리밋 주문이 선택된 경우
        Alert("This example is only for placing pending orders BuyLimit, SellLimit, BuyStop and SellStop");
        break;
     }
 
//--- 요청 전송 요청 전송에 실패한 경우 오류 코드를 표시하고 작업을 완료
   if(!OrderSend(requestresult))
     {
      Print("OrderSend error "GetLastError());
      return;
     }
     
//--- 작동 데이터 표시
   PrintFormat("Trade request result: retcode=%u, order=%I64u"result.retcoderesult.order);
   
//--- 거래 수행 결과에서 주문 티켓을 가져와 티켓별로 주문을 선택
   ulong ticket=result.order;
   ResetLastError();
   if(!OrderSelect(ticket))
     {
      PrintFormat("OrderSelect(%I64u) failed. Error %d"ticketGetLastError());
      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            volumeOrderGetDouble(ORDER_VOLUME_CURRENT);
   string            symbolOrderGetString(ORDER_SYMBOL);
   int               digits= (int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   PrintFormat("Current selected order: %s %.2f %s #%I64u at %.*f, %s",
               symbolvolumeOrderTypeDescription(type), ticketdigitspriceTimeMscToString(time));
   /*
   결과:
   Trade request resultretcode=10009order=2811006719
   Current selected orderEURUSD 1.00 Buy Limit #2811006719 at 1.105502024.09.04 10:38:28.563
   */
  }
//+------------------------------------------------------------------+
//| 말리세컨드로 시간을 반환                                            |
//+------------------------------------------------------------------+
string TimeMscToString(const long time_mscint flags=TIME_DATE|TIME_MINUTES|TIME_SECONDS)
  {
   return(TimeToString(time_msc/1000flags) + "." + IntegerToString(time_msc %10003, '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(), Order Properties