거래 요청 결과 구조 (MqlTradeResult)

거래 서버는 거래 요청의 결과로 거래 요청 처리 결과에 대한 데이터를 MqlTradeResult type 유형의 특수 사전정의된 구조로 반환합니다.

struct MqlTradeResult
  {
   uint     retcode;          // 작업 반환 코드
   ulong    deal;             // 수행된 경우 티켓 거래
   ulong    order;            // 발주된 경우 티켓 주문
   double   volume;           // 브로커가 확인한 딜 볼륨
   double   price;            // 브로커가 확인한 딜 가격
   double   bid;              // 현재 입찰 가격
   double   ask;              // 현재 호가
   string   comment;          // 브로커 설명 작업(기본적으로 거래 서버 반환 코드에 대한 설명으로 작성됨)
   uint     request_id;       // 발송 중 터미널에서 설정한 요청 ID
   int      retcode_external// 외부 트레이딩 시스템의 반환 코드
  };

필드 설명

필드

설명

retcode

거래 서버의 반환 코드

거래가 성사된 경우 티켓 거래. TRADE_ACTION_DEAL 유형의 거래 작업에 사용할 수 있습니다

주문

발주된 경우 티켓을 주문. TRADE_ACTION_PENDING 유형의 거래 작업에 사용할 수 있습니다

볼륨

브로커가 확인한 딜 볼륨. 주문 채우기 유형에 따라 다릅니다

가격

브로커가 확인한 거래 가격. 편차 필드 (거래 요청) 및/또는 거래 작업에 따라 다릅니다

입찰

현재 시장 입찰 가격 (재산정 가격)

요구

현재 시장 호가 (재산정 가격)

코멘트

작업에 대한 브로커 설명 (기본적으로 거래 서버 반환 코드에 대한 설명으로 채워짐)

request_id

거래 서버로 보낼 때 터미널에서 설정한 요청 ID

retcode_external

외부 거래 시스템에서 반환한 오류 코드. 이러한 오류의 용도 및 유형은 거래 작업이 전송되는 브로커 및 외부 거래 시스템에 따라 달라집니다.

거래 작업 결과가 MqlTradeResult 유형의 변수로 반환되며, 이 변수는 OrderSend()에 두 번째 매개변수로 거래 작업을 수행하기 위해 전달됩니다.

터미널은 요청 ID를 거래 서버로 전송할 때 OrdersSend() 및 OrderSendAsync() 함수를 사용하여 request_id 필드에서 수정합니다. 터미널은 거래 서버로부터 수행된 거래에 대한 메시지를 수신하고 다음 구성 요소를 매개 변수로 포함하는 OnTradeTransaction() 함수로 처리할 수 있도록 제출합니다:

  • MqlTradeTransaction 구조의 거래 설명;
  • OrderSend() 또는 OrdersSendAsync() 기능에서 보낸 거래 요청에 대한 설명입니다. 요청 ID 터미널에서 거래 서버로 전송되고 요청 자체와 해당 request_id는 터미널 메모리에 저장됩니다;
  • 이 요청의 ID가 포함된 request_id 필드가 있는 MqlTradeResult 구조로 된 거래 요청 실행 결과 있니다.

OnTradeTransaction() 함수는 3개의 입력 매개변수를 수신하지만 마지막 2개는 TRADE_TRANSACTION_REQUEST 유형의 트랜잭션에 대해서만 분석해야 합니다. 그 밖의 모든 경우에는 거래 요청 자료와 그 실행 결과에 대한 자료가 채워지지 않습니다. 매개변수 분석 예는 거래 요청 구조에서 확인할 수 있습니다.

거래 요청을 서버로 보낼 때 단말기가 request_id를 설정하는 것은 주로 OrderSendAsync() 비동기 함수로 작업할 때 도입됩니다. 이 지표를 사용하면 수행된 작업(OrderSend 또는 OrderSendAsync 함수 호출)을 OnTradeTransaction()으로 전송된 이 작업의 결과와 연결할 수 있습니다.

예:

//+------------------------------------------------------------------+
//| 결과 처리와 함께 거래 요청 전송               |
//+------------------------------------------------------------------+
bool MyOrderSend(MqlTradeRequest 요청,MqlTradeResult 결과)
  {
//--- 마지막 오류 코드를 0으로 재설정
   ResetLastError();
//--- 요청 전송
   bool success=OrderSend(request,result);
//--- 결과가 실패하는 경우 - 그 이유를 알아보세요
   if(!success)
     {
      int answer=result.retcode;
      Print("TradeLog: 거래 요청 실패함. Error = ",GetLastError());
      switch(answer)
        {
         //--- 재산정
         case 10004:
           {
            Print("TRADE_RETCODE_REQUOTE");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- 서버에서 주문을 수락하지 않습니다
         case 10006:
           {
            Print("TRADE_RETCODE_REJECT");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- 유효하지 않은 가격
         case 10015:
           {
            Print("TRADE_RETCODE_INVALID_PRICE");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- 유효하지 않은 SL 및/또는 TP
         case 10016:
           {
            Print("TRADE_RETCODE_INVALID_STOPS");
            Print("request.sl = ",request.sl," request.tp = ",request.tp);
            Print("result.ask = ",result.ask," result.bid = ",result.bid);
            break;
           }
         //--- 유효하지 않은 볼륨
         case 10014:
           {
            Print("TRADE_RETCODE_INVALID_VOLUME");
            Print("request.volume = ",request.volume,"   result.volume = ",
                  result.volume);
            break;
           }
         //--- 거래 작업을 위한 충분한 자금이 없습니다 
         case 10019:
           {
            Print("TRADE_RETCODE_NO_MONEY");
            Print("request.volume = ",request.volume,"   result.volume = ",
                  result.volume,"   result.comment = ",result.comment);
            break;
           }
         //--- 다른 이유로 서버 응답 코드를 출력 
         default:
           {
            Print("Other answer = ",answer);
           }
        }
      //--- 거래 요청의 실패 결과를 false로 반환하여 알림
      return(false);
     }
//--- OrderSend()가 true를 반환 - 답변을 반복
   return(true);
  }