A Estrutura de Solicitação de Negociação (MqlTradeRequest)

A interação entre o terminal do cliente e o servidor de negociação para colocar ordens realiza-se usando solicitações de negociação (pedidos de negociação). A solicitação de negociação é apresentada por uma estrutura predefinida especial chamada de MqlTradeRequest, ela contém todos os campos necessários para realizar operações (deals) de negociação. O resultado do processamento da solicitação é apresentado pela mesma estrutura MqlTradeResult.

struct MqlTradeRequest
  {
   ENUM_TRADE_REQUEST_ACTIONS    action;           // Tipo de operação de negociação
   ulong                         magic;            // Expert Advisor -conselheiro- ID (número mágico)
   ulong                         order;            // Bilhetagem da ordem
   string                        symbol;           // Símbolo de negociação
   double                        volume;           // Volume solicitado para uma encomenda em lotes
   double                        price;            // Preço
   double                        stoplimit;        // Nível StopLimit da ordem
   double                        sl;               // Nível Stop Loss da ordem
   double                        tp;               // Nível Take Profit da ordem
   ulong                         deviation;        // Máximo desvio possível a partir do preço requisitado
   ENUM_ORDER_TYPE               type;             // Tipo de ordem
   ENUM_ORDER_TYPE_FILLING       type_filling;     // Tipo de execução da ordem
   ENUM_ORDER_TYPE_TIME          type_time;        // Tipo de expiração da ordem
   datetime                      expiration;       // Hora de expiração da ordem (para ordens do tipo ORDER_TIME_SPECIFIED))
   string                        comment;          // Comentário sobre a ordem
   ulong                         position;         // Bilhete da posição
   ulong                         position_by;      // Bilhete para uma posição oposta
  };

Descrição dos Campos

Campo

Descrição

action

Tipo de operação de negociação. Pode ser um dos valores da enumeração ENUM_TRADE_REQUEST_ACTIONS.

magic

Expert Advisor ID. Permite organizar um processamento analítico de ordens de negociação. Cada Expert Advisor pode definir seu próprio ID (identificador) único ao enviar uma solicitação de negociação.

order

Bilhetagem (ticket) da ordem. É usado para modificar ordens pendentes.

symbol

Ativo da ordem. Não é necessário para modificação de ordens e operações de encerramento de posição.

volume

Volume da ordem solicitada em lotes. Note que o volume real de uma operação (deal) dependerá do tipo de execução da ordem.

price

Preço no qual a ordem deve ser executada. Ordens a mercado de ativos, cujo tipo de execução é "Market Execution" (SYMBOL_TRADE_EXECUTION_MARKET), de tipo TRADE_ACTION_DEAL, não necessitam que se especifique o preço.

stoplimit

O valor do preço, no qual a ordem pendente Limit será colocada, quando o preço corrente alcança o valor deste preço(esta condição é obrigatória). Até lá, a ordem pendente não é colocada.

sl

Preço de Stop Loss no caso de um movimento desfavorável de preço

tp

Preço de Take Profit no caso de um movimento favorável de preço

deviation

O máximo desvio de preço, especificado em pontos

type

Tipo de ordem. Pode ser um dos valores da enumeração ENUM_ORDER_TYPE.

type_filling

Tipo de execução da ordem. Pode ser um dos valores da enumeração ENUM_ORDER_TYPE_FILLING.

type_time

Tipo de expiração da ordem. Pode ser um dos valores da enumeração ENUM_ORDER_TYPE_TIME.

expiration

Hora de expiração da ordem (para ordens do tipo ORDER_TIME_SPECIFIED)

comment

Comentário sobre a ordem

position

Bilhete da posição. Deve ser preenchido ao alterar e fechar a posição para a sua identificação inequívoca. Normalmente, corresponde ao bilhete de ordem, do qual, como resultado, a posição foi aberta.

position_by

Bilhete da posição oposta. Utiliza-se ao fechar uma posição usando outra oposta, se estiver aberta no mesmo instrumento, mas na direção oposta.

Para modificar ou fechar posições no sistema de cobertura, você deve especificar o seu bilhete (MqlTradeRequest::position). No sistema de compensação o bilhete também pode ser especificado, mas a identificação da posição é realizada segundo o nome do símbolo.

Para enviar ordens para realizaroperações de negociação (trade)é necessário usar a função OrderSend(). Para cada operação de negociação é necessário especificar campos obrigatórios; campos opcionais também podem ser preenchidos. Existem sete possíveis casos para enviar uma ordem de negociação:

Execução a Pedido

Esta é uma ordem de negociação para abrir uma posição no modo Request Execution (negociação sobre preços solicitados). Ela requer que se especifique os seguintes 9 campos:

  • action
  • symbol
  • volume
  • price
  • sl
  • tp
  • deviation
  • type
  • type_filling

Também é possível especificar valores dos campos "magic" e "comment".

Execução Instantânea

Esta é uma ordem de negociação para abrir uma posição no modo Instant Execution (negociação pelos preços correntes). Ela requer que se especifique os seguintes 9 campos:

  • action
  • symbol
  • volume
  • price
  • sl
  • tp
  • deviation
  • type
  • type_filling

Também é possível especificar valores dos campos "magic" e "comment".

Execução de Mercado

Esta é uma ordem de negociação para abrir uma posição no modo Market Execution (execução a mercado). Ela requer que se especifique os seguintes 5 campos:

  • action
  • symbol
  • volume
  • type
  • type_filling

Também é possível especificar valores dos campos "magic" e "comment".

Execução Exchange

Esta é uma ordem de negociação para abrir uma posição no modo Exchange Execution (execução em um sistema de negociação externo). Ela requer que se especifique os seguintes 5 campos:

  • action
  • symbol
  • volume
  • type
  • type_filling

Também é possível especificar valores dos campos "magic" e "comment".

Exemplo de operação de negociação TRADE_ACTION_DEAL para abrir uma posição Buy:

#define EXPERT_MAGIC 123456   // MagicNumber do conselheiro
//+------------------------------------------------------------------+
//| Abertura da posição Buy                                          |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Atualização e inicialização do pedido e o seu resultado
   MqlTradeRequest request={};
   MqlTradeResult  result={};
//--- parâmetros do pedido
   request.action   =TRADE_ACTION_DEAL;                     // tipo de operação de negociação
   request.symbol   =Symbol();                              // símbolo
   request.volume   =0.1;                                   // volume de 0.1 lotes
   request.type     =ORDER_TYPE_BUY;                        // tipo de ordem
   request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // preço para abertura
   request.deviation=5;                                     // desvio permitido do preço
   request.magic    =EXPERT_MAGIC;                          // MagicNumber da ordem
//--- envio do pedido
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());     // se não for possível enviar o pedido, sairá um código de erro
//--- informação sobre a operação
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }
//+------------------------------------------------------------------+

 
Exemplo de operação de negociaçãoTRADE_ACTION_DEAL para abertura da posição Sell:

#define EXPERT_MAGIC 123456   // MagicNumber do conselheiro
//+------------------------------------------------------------------+
//| Abertura da posição Sell                                         |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Declaração e inicialização do pedido e o seu resultado
   MqlTradeRequest request={};
   MqlTradeResult  result={};
//--- parâmetros do pedido
   request.action   =TRADE_ACTION_DEAL;                     // tipo de operação de negociação
   request.symbol   =Symbol();                              // símbolo
   request.volume   =0.2;                                   // volume de 0.2 lotes
   request.type     =ORDER_TYPE_SELL;                       // tipo da ordem
   request.price    =SymbolInfoDouble(Symbol(),SYMBOL_BID); // preço para a abertura
   request.deviation=5;                                     // desvio permitido do preço
   request.magic    =EXPERT_MAGIC;                          // MagicNumber da ordem
//--- envio do pedido
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());     // se não for possível enviar o pedido, exibir um código de erro
//--- informação sobre a operação
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }
//+------------------------------------------------------------------+

 
Exemplo de ordem de negociação TRADE_ACTION_DEAL para fechadura de posições:

#define EXPERT_MAGIC 123456   // MagicNumber do conselheiro
//+------------------------------------------------------------------+
//| Fechadura de todas as posições                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- declaração do pedido e o seu resultado
   MqlTradeRequest request;
   MqlTradeResult  result;
   int total=PositionsTotal(); // número de posições abertas   
//--- iterar todas as posições abertas
   for(int i=total-1; i>=0; i--)
     {
      //--- parâmetros da ordem
      ulong  position_ticket=PositionGetTicket(i);                                      // bilhete da posição
      string position_symbol=PositionGetString(POSITION_SYMBOL);                        // simbolo 
      int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS);              //número de signos depois da coma
      ulong  magic=PositionGetInteger(POSITION_MAGIC);                                  // MagicNumber da posição
      double volume=PositionGetDouble(POSITION_VOLUME);                                 // volume da posição
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);    // tipo de posição
      //--- saída de informação sobre a posição
      PrintFormat("#%I64u %s  %s  %.2f  %s [%I64d]",
                  position_ticket,
                  position_symbol,
                  EnumToString(type),
                  volume,
                  DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
                  magic);
      //--- se o MagicNumber coincidir
      if(magic==EXPERT_MAGIC)
        {
         //--- zerar os valores do pedido e os seus resultados
         ZeroMemory(request);
         ZeroMemory(result);
         //--- configuração dos parâmetros da ordem
         request.action   =TRADE_ACTION_DEAL;        // tipo de operação de negociação
         request.position =position_ticket;          // bilhete da posição
         request.symbol   =position_symbol;          // símbolo 
         request.volume   =volume;                   // volume da posição
         request.deviation=5;                        // desvio permitido do preço
         request.magic    =EXPERT_MAGIC;             // MagicNumber da posição
         //--- colocação do preço e tipo de ordem dependendo do tipo de ordem
         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;
           }
         //--- saída de informação sobre o fechamento
         PrintFormat("Close #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
         //--- envio do pedido
         if(!OrderSend(request,result))
            PrintFormat("OrderSend error %d",GetLastError());  // se não for possível enviar o pedido, exibir um código de erro
         //--- informação sobre a operação 
         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
         //---
        }
     }
  }
//+------------------------------------------------------------------+

SL & TP Modificação

Ordem de negociação para modificar os níveis de preço StopLoss e/ou TakeProfit Ela requer que se especifique os seguintes 4 campos:

  • action
  • symbol
  • sl
  • tp
  • position

 

Exemplo da operação de negociação TRADE_ACTION_SLTP para alterar o valor Stop-Loss e Take-Profit na posição aberta:

#define EXPERT_MAGIC 123456  // MagicNumber do conselheiro
//+------------------------------------------------------------------+
//| Modificação do Stop-Loss e Take-Profit da posição                |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- declaracão do pedido e o seu resultado
   MqlTradeRequest request;
   MqlTradeResult  result;
   int total=PositionsTotal(); // número de posições abertas   
//--- iterar sobre todas as posições abertas
   for(int i=0; i<total; i++)
     {
      //--- parâmetros da ordem
      ulong  position_ticket=PositionGetTicket(i);// bilhete da posição
      string position_symbol=PositionGetString(POSITION_SYMBOL); // símbolo 
      int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // número de signos depois da coma
      ulong  magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber da posição
      double volume=PositionGetDouble(POSITION_VOLUME);    // volume da posição
      double sl=PositionGetDouble(POSITION_SL);  // Stop Loss da posição
      double tp=PositionGetDouble(POSITION_TP);  // Take-Profit da posição
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);  // tipo da posição
      //--- saída de informações sobre a posição
      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);
      //--- se o MagicNumber coincidir, o Stop-Loss e o Take-Profit não estão definidos
      if(magic==EXPERT_MAGIC && sl==0 && tp==0)
        {
         //--- cálculo dos níveis de preços atuais
         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;
         //--- se o nível de deslocamento mínimo permitido em pontos a partir do preço atual de fechamento não estiver definido
         if(stop_level<=0)
            stop_level=150; // definimos o deslocamento em 150 pontos a partir do preço atual de fechamento
         else
            stop_level+=50; // definimos o nível de deslocamento (SYMBOL_TRADE_STOPS_LEVEL + 50) pontos para a confiabilidade
 
         //--- cálculo e arredondamento dos valores Stop-Loss e Take-Profit
         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);
           }
         //--- zerar os valores de pedido e o seu resultado
         ZeroMemory(request);
         ZeroMemory(result);
         //--- definição dos parâmetros de operação
         request.action  =TRADE_ACTION_SLTP// tipo de operação de negociação
         request.position=position_ticket;   // bilhete da posição
         request.symbol=position_symbol;     // símbolo 
         request.sl      =sl;                // Stop Loss da posição
         request.tp      =tp;                // Take Profit da posição
         request.magic=EXPERT_MAGIC;         // MagicNumber da posição
         //--- saída de informações sobre a modificação
         PrintFormat("Modify #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
         //--- envio do pedido
         if(!OrderSend(request,result))
            PrintFormat("OrderSend error %d",GetLastError());  // se não for possível enviar o pedido, exibir o código de erro
         //--- informações sobre a operação   
         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
        }
     }
  }
//+------------------------------------------------------------------+

Ordem Pendente

Ordem de negociação para colocar uma ordem pendente. Ela requer que se especifiquem os seguintes 11 campos:

  • action
  • symbol
  • volume
  • price
  • stoplimit
  • sl
  • tp
  • type
  • type_filling
  • type_time
  • expiration

Também é possível especificar valores dos campos "magic" e "comment".

Exemplo de operação de negociação TRADE_ACTION_PENDING para colocação de ordens pendentes:

#property description "Exemplo de colocação de ordens pendentes"
#property script_show_inputs
#define EXPERT_MAGIC 123456                             // MagicNumber do conselheiro
input ENUM_ORDER_TYPE orderType=ORDER_TYPE_BUY_LIMIT;   // tipo da ordem
//+------------------------------------------------------------------+
//| Colocação de ordens pendentes                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//-- declaração e inicialização do pedido e o seu resultado
   MqlTradeRequest request={};
   MqlTradeResult  result={};
//--- parâmetros para colocação da ordem pendente
   request.action   =TRADE_ACTION_PENDING;                             // tipo de operação de negociação
   request.symbol   =Symbol();                                         // símbolo
   request.volume   =0.1;                                              // volume de 0.1 lotes
   request.deviation=2;                                                //desvio permitido do preço
   request.magic    =EXPERT_MAGIC;                                     // MagicNumber da ordem
   int offset = 50;                                                    // deslocamento a partir do preço atua para colocação da ordem, em pontos
   double price;                                                       // preço de execução da ordem
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);                // tamanho do ponto
   int digits=SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);                // número de símbolos depois da coma (precisão)
   //--- verificação do tipo de operação
   if(orderType==ORDER_TYPE_BUY_LIMIT)
     {
      request.type     =ORDER_TYPE_BUY_LIMIT;                          // tipo de ordem
      price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point;        // preço para abertura 
      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);                  // preço de abertura normalizado 
     }
   else if(orderType==ORDER_TYPE_BUY_STOP)
     {
      request.type =ORDER_TYPE_BUY_STOP;                                // tipo de ordem
      price        =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point; // preço de abertura 
      request.price=NormalizeDouble(price,digits);                      // preço de abertura normalizado 
     }
   else if(orderType==ORDER_TYPE_SELL_STOP)
     {
      request.type     =ORDER_TYPE_SELL_STOP;                           // tipo de ordem
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-offset*point;         // preço para abertura 
      request.price    =NormalizeDouble(price,digits);                  // preço de abertura normalizado 
     }
   else Alert("Este exemplo é apenas para colocação de ordens pendentes");   // Se a ordem pendente não for selecionada
//--- enviar a ordem
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());                 // Se não for possível enviar o pedido, exibir um código de erro
//--- informações sobre a operação
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }
//+------------------------------------------------------------------+

Modificar Ordem Pendente

Ordem de negociação para modificar os preços de uma ordem pendente. Ela requer que se especifiquem os seguintes 7 campos:

  • action
  • order
  • price
  • sl
  • tp
  • type_time
  • expiration

Exemplo de operação de negociação TRADE_ACTION_MODIFY para modificação dos níveis de preços da ordem pendente:

#define EXPERT_MAGIC 123456 // MagicNumber do conselheiro
//+------------------------------------------------------------------+
//| Modificação de ordens pendentes                                  |
//+------------------------------------------------------------------+
void OnStart()
 {
//-- declaração e inicialização do pedido e o seu resultado
 MqlTradeRequest request={};
 MqlTradeResult result={};
 int total=OrdersTotal(); // número de ordens pendentes colocadas
//--- iterar todas as ordens pendentes colocadas
 for(int i=0; i<total; i++)
 {
 //--- parâmetros da ordem
 ulong order_ticket=OrderGetTicket(i); // bilhete da ordem
 string order_symbol=Symbol(); // símbolo
 int digits=(int)SymbolInfoInteger(order_symbol,SYMBOL_DIGITS); // número de signos depois da coma
 ulong magic=OrderGetInteger(ORDER_MAGIC); // MagicNumber da ordem
 double volume=OrderGetDouble(ORDER_VOLUME_CURRENT); // volume atual da ordem
 double sl=OrderGetDouble(ORDER_SL); // Stop Loss atual da ordem
 double tp=OrderGetDouble(ORDER_TP); // Take Profit atual da ordem
 ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); // tipo de ordem
 int offset = 50; // deslocação a partir do preço atual para colocação da ordem, em pontos
 double price; // preço de ativação da ordem
 double point=SymbolInfoDouble(order_symbol,SYMBOL_POINT); // tamanho do ponto
 //--- saída de informações sobre a ordem
 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);
 //--- se o MagicNumber coincidir, o Stop Loss e o Take Profit nao foram definidos
 if(magic==EXPERT_MAGIC && sl==0 && tp==0)
 {
 request.action=TRADE_ACTION_MODIFY// tipo de operação de negociação
 request.order = OrderGetTicket(i); // bilhete da ordem
 request.symbol =Symbol(); // símbolo
 request.deviation=5; // desvio permitido a partir do preço
 //--- definição do nível de preços Take Profit e Stop Loss da ordem dependendo do seu tipo
 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); // preço de abertura normalizado
 }
 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); // preço de abertura normalizado
 }
 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); // preço de abertura normalizado
 }
 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); // preço de abertura normalizado
 }
 //--- envio do pedido
 if(!OrderSend(request,result))
 PrintFormat("OrderSend error %d",GetLastError()); // se não foi possível enviar o pedido, exibir o código de erro 
 //--- informações sobre a operação 
 PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
 //--- zerado dos valores do pedido e o seu resultado
 ZeroMemory(request);
 ZeroMemory(result);
 }
 }
 }
//+------------------------------------------------------------------+

Excluir Ordem Pendente

Ordem de negociação para excluir uma ordem pendente. Ela requer que se especifiquem os seguintes 2 campos:

  • action
  • order

Exemplo de operação de negociação TRADE_ACTION_REMOVE para excluir ordens pendentes:

#define EXPERT_MAGIC 123456  // MagicNumber do conselheiro
//+------------------------------------------------------------------+
//| Exclusão de ordens pendentes                                     |
//+------------------------------------------------------------------+
void OnStart()
 {
//-- Declaração e inicialização do pedido e resultado 
 MqlTradeRequest request={};
 MqlTradeResult result={};
 int total=OrdersTotal(); // número de ordens pendentes colocadas 
//--- iterar todas as ordens pendentes colocadas 
 for(int i=total-1; i>=0; i--)
 {
 ulong order_ticket=OrderGetTicket(i); // bilhete da ordem
 ulong magic=OrderGetInteger(ORDER_MAGIC); // MagicNumber da ordem 
 //--- se o MagicNumber coincidir
 if(magic==EXPERT_MAGIC)
 {
 //--- zerar os valores do pedido e o resultado
 ZeroMemory(request);
 ZeroMemory(result);
 //--- instalação de parâmetros de operação 
 request.action=TRADE_ACTION_REMOVE// tipo de operação de negociação
 request.order = order_ticket; // bilhete da ordem
 //--- envio do pedido
 if(!OrderSend(request,result))
 PrintFormat("OrderSend error %d",GetLastError()); // Se não for capaz de enviar o pedido, exibir um código de erro 
 //--- informações sobre a operação 
 PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
 }
 }
 }
//+------------------------------------------------------------------+

Também Veja

Estruturas e Classes, Funções de Negociação (Trade), Propriedades de Ordem