거래 요청 구조 (MqlTradeRequest)

주문 배치 작업을 실행하기 위한 클라이언트 터미널과 거래 서버 간의 상호 작용은 거래 요청을 사용하여 수행됩니다. 거래 요청은 거래 딜을 수행하는 데 필요한 모든 필드를 포함하는 MqlTradeRequest 유형의 특별한 사전 정의된 구조로 표시됩니다. 요청 처리 결과는 MqlTradeResult 유형의 구조로 표시됩니다.

struct MqlTradeRequest
  {
   ENUM_TRADE_REQUEST_ACTIONS    action;           // 거래 작업 유형
   ulong                         magic;            // 엑스퍼트 어드바이저 ID (매직 넘버)
   ulong                         order;            // 주문 티켓
   string                        symbol;           // 거래 기호
   double                        volume;           // 로트 단위 거래 요청 볼륨
   double                        price;            // 가격
   double                        stoplimit;        // 주문의 StopLimit 레벨
   double                        sl;               // 주문의 손실 수준 중지
   double                        tp;               // 주문의 수익 취득 수준
   ulong                         deviation;        // 요청된 가격에서 최대 가능 편차
   ENUM_ORDER_TYPE               type;             // 주문 유형
   ENUM_ORDER_TYPE_FILLING       type_filling;     // 주문 실행 유형
   ENUM_ORDER_TYPE_TIME          type_time;        // 주문 만료 유형
   datetime                      expiration;       // 주문 만료 시간 (ORDER_TIME_SPECIFIED 유형의 주문)
   string                        comment;          // 주문 코멘트
   ulong                         position;         // 포지션 티켓
   ulong                         position_by;      // 반대 포지션의 티켓
  };

필드 설명

필드

설명

액션

거래 작업 유형. ENUM_TRADE_REQUEST_ACTIONS 열거 값 중 하나일 수 있습니다.

매직

엑스퍼트 어드바이저 ID. 거래 주문의 분석 처리를 체계화 할 수 있습니다. 각 엑스퍼트 어드바이저는 거래 요청을 보낼 때 고유한 ID를 설정할 수 있습니다.

주문

주문 티켓. 보류 중인 주문을 수정하는 데 사용됩니다.

심볼

주문의 심볼. 주문 수정 및 포지션 닫기 작업에는 필요하지 않습니다.

볼륨

요청된 로트 단위 주문량. 거래의 실제 볼륨은 주문 실행 유형에 따라 달라집니다.

가격

가격, 무문을 실행해야 하는 수준입니다. 실행 유형이 (SYMBOL_TRADE_EXECUTION_MARKET) TRADE_ACTION_DEAL 유형의 "시장 실행"인 기호의 시장 주문에는 가격 사양이 필요하지 않습니다.

stoplimit

가격이 가격 가치에 도달했을 때(해당 조건이 의무임) 제한 보류 중인 주문이 배치되는 가격 가치. 그 때까지 보류 중인 주문이 처리되지 않습니다.

sl

가격 이동이 불리한 경우 손실 가격 중지하기

tp

가격 이동이 유리한 경우 이익 가격 취득

편차

포인트로 지정된 최대 가격 편차

유형

주문 유형. ENUM_ORDER_TYPE 열거 값 중 하나일 수 있습니다.

type_filling

주문 실행 유형. ENUM_ORDER_TYPE_FILLING 열거 값 중 하나일 수 있습니다.

type_time

주문 만료 유형. ENUM_ORDER_TYPE_TIME 열거 값 중 하나일 수 있습니다.

만료

주문 만료 시간 (ORDER_TIME_SPECIFIED 유형 주문의 경우)

코멘트

주문 코멘트

포지션

포지션의 티켓. 위치를 식별하기 위해 포지션을 수정하거나 닫을 때 채워야 합니다. 원칙적으로 그것은 그 포지션이 열린 주문의 티켓과 같습니다.

position_by

반대 포지션의 티켓. 위치가 반대 방향으로 동일한 기호에 대해 반대 방향으로 열려 있을 때 사용됩니다.

위험 회피 시스템에서 위치를 수정하거나 닫을 때 해당 티켓(MqlTradeRequest::position)을 지정해야 합니다. 위치는 기호 이름으로 식별되지만 티켓은 네트 시스템에서 지정할 수도 있습니다.

거래 작업을 수행하기 위해 주문을 전송하려면 OrderSend() 기능을 사용해야 합니다. 각 거래 작업에 대해 의무 필드를 지정해야 하며, 옵션 필드도 채워질 수 있습니다. 거래 주문을 보낼 수 있는 7가지 경우가 있습니다:

요청 실행

요청 실행 모두에서 포지션을 열기 위한 거래 주문입니다(요청된 가격에 따라 거래). 다음 9개의 필드를 지정해야 합니다:

  • 액션
  • 심볼
  • 볼륨
  • 가격
  • sl
  • tp
  • 편차
  • 유형
  • type_filling

또한 "매직" 및 "코멘트" 필드 값을 지정할 수 있습니다.

인스턴트 실행

인스턴트 실행 모드에서 포지션을 열기 위한 거래 순서입니다(현재 가격 기준 거래). 다음 9개의 필드를 지정해야 합니다:

  • 액션
  • 심볼
  • 볼륨
  • 가격
  • sl
  • tp
  • 편차
  • 유형
  • type_filling

또한 "매직" 및 "코멘트" 필드 값을 지정할 수 있습니다.

마켓 실행

마켓 실행 모드에서 포지션을 열기 위한 거래 순서입니다. 다음 5개의 필드를 지정해야 합니다:

  • 액션
  • 심볼
  • 볼륨
  • 유형
  • type_filling

또한 "매직" 및 "코멘트" 필드 값을 지정할 수 있습니다.

교환 실행

교환 실행 모드에서 포지션을 열기 위한 거래 순서입니다. 다음 5개의 필드를 지정해야 합니다:

  • 액션
  • 심볼
  • 볼륨
  • 유형
  • type_filling

또한 "매직" 및 "코멘트" 필드 값을 지정할 수 있습니다.

매입 포지션을 열기 위한 TRADE_ACTION_DEAL 거래 작업의 예:

#define EXPERT_MAGIC 123456   // MagicNumber of the expert
//+------------------------------------------------------------------+
//| 매입 위치 열기                                             |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 거래 요청과 거래 요청 결과를 선언하고 초기화
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
//--- 요청의 매개변수
   request.action   =TRADE_ACTION_DEAL;                     // 거래 작업 유형
   request.symbol   =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;                          // 주문의 MagicNumber
//--- 요청 전송
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());     // if unable to send the request, output the error code
//--- 작업에 대한 정보
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }
//+------------------------------------------------------------------+

 
매도 포지션을 열기 위한 TRADE_ACTION_DEAL 거래 작업의 예:

#define EXPERT_MAGIC 123456   // 엑스퍼트의 MagicNumber
//+------------------------------------------------------------------+
//| 매도 위치 열기                                            |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 거래 요청과 거래 요청 결과를 선언하고 초기화
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
//--- 요청의 매개변수
   request.action   =TRADE_ACTION_DEAL;                     // 거래 작업 유형
   request.symbol   =Symbol();                              // symbol
   request.volume   =0.2;                                   // 0.2 로트의 볼륨
   request.type     =ORDER_TYPE_SELL;                       // 주문 유형
   request.price    =SymbolInfoDouble(Symbol(),SYMBOL_BID); // 개장 가격
   request.deviation=5;                                     // 가격에 대한 허용 편차
   request.magic    =EXPERT_MAGIC;                          // MagicNumber of the order
//--- 요청 전송
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());     // if unable to send the request, output the error code
//--- 작업에 대한 정보
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }
//+------------------------------------------------------------------+

 
마감 포지션에 대한 TRADE_ACTION_DEAL 거래 작업의 예:

#define EXPERT_MAGIC 123456   // 엑스퍼트의 MagicNumber
//+------------------------------------------------------------------+
//| 모든 포지션 닫기                                            |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 거래 요청 및 거래 요청 결과 선언하고 초기화
   MqlTradeRequest request;
   MqlTradeResult  result;
   int total=PositionsTotal(); // 열린 포지션의 숫자   
//--- 모든 열린 포지션에서 반복
   for(int i=total-1; i>=0; i--)
     {
      //--- 주문의 매개변수
      ulong  position_ticket=PositionGetTicket(i);                                      // 포지션의 티켓
      string position_symbol=PositionGetString(POSITION_SYMBOL);                        // 기호 
      int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS);              // 소수점 이하의 자릿수
      ulong  magic=PositionGetInteger(POSITION_MAGIC);                                  // 포지션의 MagicNumber
      double volume=PositionGetDouble(POSITION_VOLUME);                                 // 포지션의 볼륨
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);    // 포지션의 유형
      //--- 포지션에 대한 출력 정보
      PrintFormat("#%I64u %s  %s  %.2f  %s [%I64d]",
                  position_ticket,
                  position_symbol,
                  EnumToString(type),
                  volume,
                  DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
                  magic);
      //--- MagicNumber가 일치하면
      if(magic==EXPERT_MAGIC)
        {
         //--- 요청 및 결과 값 0 설정
         ZeroMemory(request);
         ZeroMemory(result);
         //--- 작업 매개변수 설정
         request.action   =TRADE_ACTION_DEAL;        // 거래 작업의 유형
         request.position =position_ticket;          // t포지션의 티켓
         request.symbol   =position_symbol;          // 기호
         request.volume   =volume;                   // 포지션의 볼륨
         request.deviation=5;                        // 가격에서의 허용 편차
         request.magic    =EXPERT_MAGIC;             // 포지션의 MagicNumber
         //--- 포지션에 따라 가격과 주문의 종류를 설정
         if(type==POSITION_TYPE_BUY)
           {
            request.price=SymbolInfoDouble(position_symbol,SYMBOL_BID);
            request.type =ORDER_TYPE_SELL;
           }
         else
           {
            request.price=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
            request.type =ORDER_TYPE_BUY;
           }
         //--- 마감에 대한 정보 출력
         PrintFormat("Close #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
         //--- 요청 전송
         if(!OrderSend(request,result))
            PrintFormat("OrderSend error %d",GetLastError());  // 요청을 보낼 수 없는 경우 오류 코드를 출력
         //--- 작업에 대한 정보   
         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
         //---
        }
     }
  }
//+------------------------------------------------------------------+

 
SL & TP 수정

StopLoss 및/또는 TakeProfit 가격 수준을 수정하기 위한 거래 주문. 다음 4개의 필드를 지정해야 합니다:

  • 액션
  • 심볼
  • sl
  • tp
  • 포지션

 

열린 포지션의 솔실 중지 및 이익 취하기 값을 수정하기 위한 TRADE_ACTION_SLTP 거래 작업의 예:

#define EXPERT_MAGIC 123456  // 엑스퍼트의 MagicNumber
//+------------------------------------------------------------------+
//| 손실 정지 수정 및 포지션 이익 취득            |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 거래 요청과 거래 요청 결과를 선언하고 초기화
   MqlTradeRequest request;
   MqlTradeResult  result;
   int total=PositionsTotal(); // 열린 포지션의 숫자   
//--- 모든 열린 포지션에서 반복
   for(int i=0; i<total; i++)
     {
      //--- 주문의 매개변수
      ulong  position_ticket=PositionGetTicket(i);// 포지션의 티켓
      string position_symbol=PositionGetString(POSITION_SYMBOL); // 기호 
      int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // 소수점 이하 자릿수
      ulong  magic=PositionGetInteger(POSITION_MAGIC); // 포지션의 MagicNumber
      double volume=PositionGetDouble(POSITION_VOLUME);    // 포지션의 볼륨
      double sl=PositionGetDouble(POSITION_SL);  // 포지션의 손실 중지
      double tp=PositionGetDouble(POSITION_TP);  // 포지션의 이익 가져가기
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);  // 포지션의 유형
      //--- 포지션에 대한 정보 출력
      PrintFormat("#%I64u %s  %s  %.2f  %s  sl: %s  tp: %s  [%I64d]",
                  position_ticket,
                  position_symbol,
                  EnumToString(type),
                  volume,
                  DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
                  DoubleToString(sl,digits),
                  DoubleToString(tp,digits),
                  magic);
      //--- MagicNumber가 일치하는 경우 손실 중지 및 이익 취득이 정의되지 않습니다
      if(magic==EXPERT_MAGIC && sl==0 && tp==0)
        {
         //--- 현재 가격 수준 계산
         double price=PositionGetDouble(POSITION_PRICE_OPEN);
         double bid=SymbolInfoDouble(position_symbol,SYMBOL_BID);
         double ask=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
         int    stop_level=(int)SymbolInfoInteger(position_symbol,SYMBOL_TRADE_STOPS_LEVEL);
         double price_level;
         //--- 현재 마감 가격에서 허용되는 최소 편치 거리(포인트)가 설정되지 않은 경우
         if(stop_level<=0)
            stop_level=150; // 현행 종가 대비 편치 거리를 150 포인트로 설정
         else
            stop_level+=50; // 신뢰성에 대해 편치 거리를 (SYMBOL_TRADE_STOPS_LEVEL + 50) 포인트로 설정
 
         //--- 손실 중지 및 이익 취득 값의 계산 및 반올림
         price_level=stop_level*SymbolInfoDouble(position_symbol,SYMBOL_POINT);
         if(type==POSITION_TYPE_BUY)
           {
            sl=NormalizeDouble(bid-price_level,digits);
            tp=NormalizeDouble(bid+price_level,digits);
           }
         else
           {
            sl=NormalizeDouble(ask+price_level,digits);
            tp=NormalizeDouble(ask-price_level,digits);
           }
         //--- 요청 및 결과 값 0 설정
         ZeroMemory(request);
         ZeroMemory(result);
         //--- 작업 매개변수 설정
         request.action  =TRADE_ACTION_SLTP// 거래 작업의 유형
         request.position=position_ticket;   // 포지션의 티켓
         request.symbol=position_symbol;     // 기호 
         request.sl      =sl;                // 포지션의 손실 중지
         request.tp      =tp;                // 포지션의 이익 취득
         request.magic=EXPERT_MAGIC;         // 포지션의 MagicNumber
         //--- 수정 정보 출력
         PrintFormat("Modify #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
         //--- 요청 전송
         if(!OrderSend(request,result))
            PrintFormat("OrderSend error %d",GetLastError());  // 요청을 보낼 수 없는 경우 오류 코드를 출력
         //--- 작업에 대한 정보   
         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
        }
     }
  }
//+------------------------------------------------------------------+

 
보류 중인 주문

보류 중인 주문을 발주하기 위한 거래 주문 다음 11개 필드를 지정해야 합니다:

  • 액션
  • 심볼
  • 볼륨
  • 가격
  • stoplimit
  • sl
  • tp
  • 유형
  • type_filling
  • type_time
  • 만료

또한 "매직" 및 "코멘트" 필드 값을 지정할 수 있습니다.

보류 중인 주문을 발주하기 위한 TRADE_ACTION_PENDING 거래 작업의 예:

#property description "Example of placing pending orders"
#property script_show_inputs
#define EXPERT_MAGIC 123456                             // 엑스퍼트의 MagicNumber
input ENUM_ORDER_TYPE orderType=ORDER_TYPE_BUY_LIMIT;   // 주문 유형
//+------------------------------------------------------------------+
//| 보류 중인 주문 발주                                           |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 거래 요청과 거래 요청 결과를 선언하고 초기화
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
//--- 보류 중인 주문을 발주할 매개 변수
   request.action   =TRADE_ACTION_PENDING;                             // 거래 작업 유형
   request.symbol   =Symbol();                                         // 기호
   request.volume   =0.1;                                              // 0.1 로트의 볼륨
   request.deviation=2;                                                // 가격에 대한 허용 편차
   request.magic    =EXPERT_MAGIC;                                     // 주문의 MagicNumber
   int offset = 50;                                                    // 주문을 발주할 현재 가격에서 오프셋(포인트)
   double price;                                                       // 가격 유발 주문
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);                // 포인트의 값
   int digits=SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);                // 소수 자릿수(숫자)
   //--- 작업 유형 확인
   if(orderType==ORDER_TYPE_BUY_LIMIT)
     {
      request.type     =ORDER_TYPE_BUY_LIMIT;                          // order type
      price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point;        // 개장 가격 
      request.price    =NormalizeDouble(price,digits);                 // 정규화된 개시 가격 
     }
   else if(orderType==ORDER_TYPE_SELL_LIMIT)
     {
      request.type     =ORDER_TYPE_SELL_LIMIT;                          // 주문 유형
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point;         // 개장 가격 
      request.price    =NormalizeDouble(price,digits);                  // 정규화된 시가 
     }
   else if(orderType==ORDER_TYPE_BUY_STOP)
     {
      request.type =ORDER_TYPE_BUY_STOP;                                // 주문 유형
      price        =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point; // 개장 가격 
      request.price=NormalizeDouble(price,digits);                      // 정규화된 시가 
     }
   else if(orderType==ORDER_TYPE_SELL_STOP)
     {
      request.type     =ORDER_TYPE_SELL_STOP;                           // 주문 유형
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-offset*point;         // 개장 가격 
      request.price    =NormalizeDouble(price,digits);                  // 정규화된 시가 
     }
   else Alert("이 예는 보류 중인 주문을 작성하는 경우에만 해당");   // 보류 중인 주문이 선택되지 않은 경우
//--- 요청 전송
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());                 // 요청을 보낼 수 없는 경우 오류 코드를 출력
//--- 작업 정보
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }
//+------------------------------------------------------------------+

 
보류 중인 주문 수정

보류 중인 주문의 가격을 수정하기 위한 거래 주문. 다음 7개의 필드를 지정해야 합니다:

  • 액션
  • 주문
  • 가격
  • sl
  • tp
  • type_time
  • 만료

 

예시 - TRADE_ACTION_MODIFY 거래 작업 (보류 중인 주문의 가격 수준을 수정하기 위함):

#define EXPERT_MAGIC 123456  // 엑스퍼트의 MagicNumber
//+------------------------------------------------------------------+
//| 보류 중인 주문 수정                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 거래와 거래 요청의 결과를 선언하고 초기화
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
   int total=OrdersTotal(); // 보류 중인 총 주문 수
//--- 보류 중인 주문을 전부 반복
   for(int i=0; i<total; i++)
     {
      //--- 주문의 매개변수
      ulong  order_ticket=OrderGetTicket(i);                             // 주문 티켓
      string order_symbol=Symbol();                                      // 기호
      int    digits=(int)SymbolInfoInteger(order_symbol,SYMBOL_DIGITS);  // 소수점 이하 자릿수
      ulong  magic=OrderGetInteger(ORDER_MAGIC);                         // 주문의 MagicNumber
      double volume=OrderGetDouble(ORDER_VOLUME_CURRENT);                // 주문의 현재 볼륨
      double sl=OrderGetDouble(ORDER_SL);                                // current Stop Loss of the order
      double tp=OrderGetDouble(ORDER_TP);                                // 현재 주문의 이익 취득 
      ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); // 주문의 유형
      int offset = 50;                                                   // 주문을 발주할 현재 가격에서 오프셋(포인트)
      double price;                                                      // 가격 유발 주문
      double point=SymbolInfoDouble(order_symbol,SYMBOL_POINT);          // 포인트의 값
      //--- 주문 정보 출력
      PrintFormat("#%I64u %s  %s  %.2f  %s  sl: %s  tp: %s  [%I64d]",
                  order_ticket,
                  order_symbol,
                  EnumToString(type),
                  volume,
                  DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
                  DoubleToString(sl,digits),
                  DoubleToString(tp,digits),
                  magic);
      //--- MagicNumber가 일치하지 않는 경우 손실 중지 및 이익 취득이 정의되지 않습니다
      if(magic==EXPERT_MAGIC && sl==0 && tp==0)
        {
         request.action=TRADE_ACTION_MODIFY;                           // 거래 작업의 유형
         request.order = OrderGetTicket(i);                            // 주문 티켓
         request.symbol   =Symbol();                                   // 기호
         request.deviation=5;                                          // 가격에 대한 허용 편차
        //--- 가격 수준 설정, 주문 유형에 따라 이익 가져가기 및 손실 중지
         if(type==ORDER_TYPE_BUY_LIMIT)
           {
            price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point; 
            request.tp = NormalizeDouble(price+offset*point,digits);
            request.sl = NormalizeDouble(price-offset*point,digits);
            request.price    =NormalizeDouble(price,digits);                // 정규화된 시가
           }
         else if(type==ORDER_TYPE_SELL_LIMIT)
           {
           price = SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point; 
            request.tp = NormalizeDouble(price-offset*point,digits);
            request.sl = NormalizeDouble(price+offset*point,digits);
            request.price    =NormalizeDouble(price,digits);                 // 정규화된 시가
           }
         else if(type==ORDER_TYPE_BUY_STOP)
           {
           price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point; 
            request.tp = NormalizeDouble(price+offset*point,digits);
            request.sl = NormalizeDouble(price-offset*point,digits);
            request.price    =NormalizeDouble(price,digits);                 // 정규화된 시가
           }
         else if(type==ORDER_TYPE_SELL_STOP)
           {
           price = SymbolInfoDouble(Symbol(),SYMBOL_BID)-offset*point; 
            request.tp = NormalizeDouble(price-offset*point,digits);
            request.sl = NormalizeDouble(price+offset*point,digits);
            request.price    =NormalizeDouble(price,digits);                 // 정규화된 시간
           }
         //--- 요청 전송
         if(!OrderSend(request,result))
            PrintFormat("OrderSend error %d",GetLastError());  // 요청 전송이 불가능한 경우, 오류 코드 출력
         //--- 작업 정보   
         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
         //--- 요청 및 결과 값 0 설정
         ZeroMemory(request);
         ZeroMemory(result);
        }
     }
  }
//+------------------------------------------------------------------+

 
보류 중인 주문 삭제

보류 중인 주문을 삭제하기 위한 거래 주문. 다음 두 개의 필드를 지정해야 합니다:

  • 액션
  • 주문

 

보류 중인 주문을 삭제하기 위한 TRADE_ACTION_REMOVE 거래 작업의 예:

#define EXPERT_MAGIC 123456  // 엑스퍼트의 MagicNumber
//+------------------------------------------------------------------+
//| 보류 중인 주문 삭제                                          |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 거래 요청과 거래 요청 결과를 선언하고 초기화
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
   int total=OrdersTotal(); // 보류 중인 총 주문 수
//--- 보류 중인 주문을 전부 반복
   for(int i=total-1; i>=0; i--)
     {
      ulong  order_ticket=OrderGetTicket(i);                   // 주문 티켓
      ulong  magic=OrderGetInteger(ORDER_MAGIC);               // 주문의 MagicNumber
      //--- MagicNumber가 일치하면 
      if(magic==EXPERT_MAGIC)
        {
         //--- 요청 및 결과 값 0 설정
         ZeroMemory(request);
         ZeroMemory(result);
         //--- 작업 매개변수 설정     
         request.action=TRADE_ACTION_REMOVE;                   // 거래 작업 유형
         request.order = order_ticket;                         // 주문 티켓
         //--- 요청 전송
         if(!OrderSend(request,result))
            PrintFormat("OrderSend error %d",GetLastError());  // 요청을 보낼 수 없는 경우 오류 코드를 출력
         //--- 작업 정보   
         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
        }
     }
  }
//+------------------------------------------------------------------+

 
추가 참조

구조 및 클래스, 거래 함수, 주문 속성