OrderSend

OrderSend() 함수는 거래 작업을 실행하는 데 요청을 거래 서버로 전송하도록 사용됩니다.

bool  OrderSend(
   MqlTradeRequest&  request,      // 쿼리 구조
   MqlTradeResult&   result        // 답변 구조
   );

Parameter

request

[in]  클라이언트의 거래 활동을 설명하는 MqlTradeRequest 유형의 구조에 대한 포인터.

result

[in,out]  완료 시 거래 작업의 결과를 설명하는 MqlTradeResult 유형의 구조에 대한 포인터(참이 반환되는 경우).

반환값

구조의 기본 검사(지수 검사)에 성공하면 true를 반환합니다. 그러나, 이것은 거래 작업의 성공적인 실행의 징후는 아닙니다.. 함수 실행 결과에 대한 자세한 설명은 결과 구조의 필드를 분석합니다.

참고

거래 요청은 거래 서버에서 확인하는 여러 단계를 거칩니다. 먼저 요청 매개 변수의 모든 필수 필드가 올바르게 작성되었는지 확인합니다. 오류가 없으면 서버는 추가 처리를 위해 주문을 수락합니다. 거래 서버에서 주문이 성공적으로 수락되면 OrderSend() 함수가 true를 반환합니다.

거래 서버로 전송하기 전에 요청을 확인하는 것이 좋습니다. 요청을 확인하려면, OrderCheck() 함수를 사용하십시오. 또한 거래 운영을 실행하기에 충분한 자금이 있는지 확인하고 거래 요청 확인 결과에 다음과 같은 많은 유용한 매개 변수를 반환합니다:

  • 반환 코드(선택한 요청의 오류에 대한 정보를 포함);
  • 거래 작업 실행 후 나타나는 잔액 값;
  • 거래 작업 실행 후 나타날 순 가치;
  • 거래 작업 실행 후 표시될 floating 소수점 값;
  • 거래 작업에 요구되는 마진;
  • 거래 작업 실행 후 유지되는 자유 자본의 금액;
  • 거래 작업 실행 후 설정될 마진 수준;
  • 응답 코드에 대한 설명, 오류 설명에 대한 코멘트.

마켓 오더(MqlTradeRequest.action=TRADE_ACTION_DEAL)을 보낼 때, OrderSend() 함수의 성공적 결과가 꼭 주문이 실행(적절한 거래 수행)되었다는 것을 의미하지는 않습니다. 이 경우, 'true'는 추가적 실행을 위해 거래 시스템에 성공적으로 주문되었음을 의미합니다. 거래 서버는 딜 또는 주문 필드 값결과 구조에서 채울 수 있는데, OrderSend() 호출에 응답할 때 이러한 데이터를 알고 있는 경우에 그러합니다. 일반적으로 주문에 해당하는 거래를 실행하는 이벤트는 OrderSend() 호출에 응답을 보낸 후에 발생할 수 있습니다. 따라서 어떠한 거래 요청 유형에서도 OrderSend() 실행 결과를 받을 때, retcode 거래 서버 응답 코드와 retcode_external 외부 시스템 응답 코드 (필요시)를 먼저 확인해야 하며, 이는 획득한 결과 구조에서 사용 가능합니다.

수락된 각 주문은 실행 조건 중 하나가 발생할 때까지 처리 대기 중인 거래 서버에 저장됩니다:

  • 만료,
  • 반대의 청탁,
  • 실행 가격이 표시될 때 실행을 명령,
  • 주문 취소 요청 접수.

주문 처리 순간, 거래 서버는 Trade 이벤트 발생에 대한 메시지를 단말기에 전송하며, 이는 OnTrade() 함수로 처리할 수 있습니다.

OrderSend() 함수로 전송된 서버에서 거래 요청을 실행한 결과는 OnTradeTransaction 핸들러로 추적할 수 있습니다. OnTradeTransaction 핸들러는 하나의 거래 요청을 실행할 때 여러 번 호출됩니다.

예를 들어, 시장 구매 주문서를 보낼 때, 주문이 처리되고, 계정에 대해 적절한 구매 주문서가 생성되고, 주문이 실행되어 보류 주문 목록에서 제거되며, 주문 기록에 적절한 거래가 추가되고, 새 포지션이 생성됩니다. 이러한 각 이벤트에 대해 OnTradeTransaction 함수가 호출됩니다.

예:

//--- ORDER_MAGIC 값
input long order_magic=55555;
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함수                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 계정이 데모인지 확인
   if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_REAL)
     {
      Alert("라이브 계정에서는 스크립트 작업이 허용되지 않습니다!");
      return;
     }
//--- 주문 또는 주문 삭제
   if(GetOrdersTotalByMagic(order_magic)==0) 
     {
      //--- no current orders - place an order
      uint res=SendRandomPendingOrder(order_magic);
      Print("거래 서버의 반환 코드 ",res);
     }
   else // 주문 - 주문 삭제 가 있습니다
     {
      DeleteAllOrdersByMagic(order_magic);
     }
//---
  }
//+------------------------------------------------------------------+
//| 지정된 ORDER_MAGIC가 있는 현재 주문 수를 수신합니다 |
//+------------------------------------------------------------------+
int GetOrdersTotalByMagic(long const magic_number)
  {
   ulong order_ticket;
   int total=0;
//--- 모든 보류 주문 살펴보기
   for(int i=0;i<OrdersTotal();i++)
      if((order_ticket=OrderGetTicket(i))>0)
         if(magic_number==OrderGetInteger(ORDER_MAGIC)) total++;
//---
   return(total);
  }
//+------------------------------------------------------------------+
//| 지정된 ORDER_MAGIC을 사용하여 보류 주문을 모두 삭제            |
//+------------------------------------------------------------------+
void DeleteAllOrdersByMagic(long const magic_number)
  {
   ulong order_ticket;
//--- 모든 보류 주문 살펴보기
   for(int i=OrdersTotal()-1;i>=0;i--)
      if((order_ticket=OrderGetTicket(i))>0)
         //--- 적합한 ORDER_MAGIC로 주문
         if(magic_number==OrderGetInteger(ORDER_MAGIC))
           {
            MqlTradeResult result={0};
            MqlTradeRequest request={0};
            request.order=order_ticket;
            request.action=TRADE_ACTION_REMOVE;
            OrderSend(request,result);
            //--- 로그에 서버 응답을 기록
            Print(__FUNCTION__,": ",result.comment," reply code ",result.retcode);
           }
//---
  }
//+------------------------------------------------------------------+
//| 보류 중인 순서를 임의 방식으로 설정                             |
//+------------------------------------------------------------------+
uint SendRandomPendingOrder(long const magic_number)
  {
//--- 요구 준비
   MqlTradeRequest request={0};
   request.action=TRADE_ACTION_PENDING;         // 보류 주문 설정
   request.magic=magic_number;                  // ORDER_MAGIC
   request.symbol=_Symbol;                      // symbol
   request.volume=0.1;                          // 볼륨 0.1 롯
   request.sl=0;                                // 스탑 로스가 명시되지 않았습니다
   request.tp=0;                                // 이익 실현이 명시되지 않았습니다     
//--- 주문 유형 형성
   request.type=GetRandomType();                // 주문 유형
//--- 보류 주문에 대한 가격 형성
   request.price=GetRandomPrice(request.type);  // open price
//--- 거래 요청 전송
   MqlTradeResult result={0};
   OrderSend(request,result);
//--- 로그에 서버 응답을 기록  
   Print(__FUNCTION__,":",result.comment);
   if(result.retcode==10016) Print(result.bid,result.ask,result.price);
//--- 거래 서버 응답의 반환 코드
   return result.retcode;
  }
//+------------------------------------------------------------------+
//| 보류 주문의 유형을 임의 방식으로 반환                  |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE GetRandomType()
  {
   int t=MathRand()%4;
//---   0<=t<4
   switch(t)
     {
      case(0):return(ORDER_TYPE_BUY_LIMIT);
      case(1):return(ORDER_TYPE_SELL_LIMIT);
      case(2):return(ORDER_TYPE_BUY_STOP);
      case(3):return(ORDER_TYPE_SELL_STOP);
     }
//--- 부정확한 값
   return(WRONG_VALUE);
  }
//+------------------------------------------------------------------+
//| 임의의 방법으로 가격 반환                                    |
//+------------------------------------------------------------------+
double GetRandomPrice(ENUM_ORDER_TYPE type)
  {
   int t=(int)type;
//--- 심볼에 대한 스탑 레벨
   int distance=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
//--- 최근 틱 데이터 수신
   MqlTick last_tick={0};
   SymbolInfoTick(_Symbol,last_tick);
//--- 유형에 따라 가격 계산
   double price;
   if(t==2 || t==5) // ORDER_TYPE_BUY_LIMIT or ORDER_TYPE_SELL_STOP
     {
      price=last_tick.bid; // Bid 가격에서부터 시작
      price=price-(distance+(MathRand()%10)*5)*_Point;
     }
   else             // ORDER_TYPE_SELL_LIMIT 또는 ORDER_TYPE_BUY_STOP
     {
      price=last_tick.ask; // Ask 가격에서부터 시작
      price=price+(distance+(MathRand()%10)*5)*_Point;
     }
//---
   return(price);
  }

참고 항목

Trade Operation Types, Trade Request Structure, Structure of Request Check Results, Structure of a Trade Request Result