OrderCalcMargin

A função calcula a margem necessária para o tipo de ordem especificado, considerando a conta atual e o mercado do momento, sem levar em conta as ordens pendentes ou posições abertas. Ela possibilita a avaliação da margem para a operação de negociação planejada. O valor retornado é na moeda da conta.

bool  OrderCalcMargin(
   ENUM_ORDER_TYPE       action,           // tipo de ordem
   string                symbol,           // nome do símbolo
   double                volume,           // volume
   double                price,            // preço aberto
   double&               margin            // valor para a obtenção do valor da margem
   );

Parâmetros

action

[in]  O tipo de ordem pode ser um dos valores da enumeração ENUM_ORDER_TYPE.

symbol

[in]  Nome do ativo.

volume

[in]  Volume das operações de negociação (comércio).

price

[in]  Preço de abertura.

margin

[out]  A variável onde o valor da margem requerida será armazenado, caso a função seja executada com sucesso. O cálculo é feito como se não houvesse ordens pendentes ou posições abertas na conta atual. O valor da margem depende de vários fatores e pode mudar conforme o ambiente de mercado.

Valor retornado

A função retorna true em caso de sucesso, caso contrário ela retorna false. Para obter informações sobre o erro, chame a função GetLastError().

Exemplo:

#define   VOLUME     1.0   // // volume da ordem
#define   DEVIATION  100   // // distância de colocação da ordem pendente
#define   STOP_LIMIT 50    // // distância do StopLimit da ordem
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string currency=AccountInfoString(ACCOUNT_CURRENCY);
   int array_types[8]={ORDER_TYPE_BUY,
                       ORDER_TYPE_SELL,
                       ORDER_TYPE_BUY_LIMIT,
                       ORDER_TYPE_SELL_LIMIT,
                       ORDER_TYPE_BUY_STOP,
                       ORDER_TYPE_SELL_STOP,
                       ORDER_TYPE_BUY_STOP_LIMIT,
                       ORDER_TYPE_SELL_STOP_LIMIT };
                       
//--- no loop pelo array de tipos de ordens
   for(int i=0i<(int)array_types.Size(); i++)
     {
      //--- dependendo do tipo de ordem, obtemos o tipo ORDER_TYPE_BUY ou ORDER_TYPE_SELL
      ENUM_ORDER_TYPE type=MarketOrderByOrderType((ENUM_ORDER_TYPE)array_types[i]);
      
      //--- dependendo do tipo de ordem, obtemos o preço
      double price=PriceByOrderType(_Symboltype);
      
      //--- obtemos o tamanho da margem necessária para o tipo de ordem especificado em action 
      double margin=EMPTY_VALUE;
      ResetLastError();
      if(!OrderCalcMargin(type_SymbolVOLUMEpricemargin))
        {
         Print("OrderCalcMargin() failed. Error ",GetLastError());
         continue;
        }
      //--- imprimimos o resultado no log
      PrintFormat("Margin required for %.2f %s order at price %.*f on %s symbol: %.2f %s"VOLUMEOrderTypeDescription((ENUM_ORDER_TYPE)i), _Digitsprice_Symbolmargincurrency);
     }
   /*
   Resultado:
   Margin required for 1.00 Buy order at price 1.31668 on GBPUSD symbol1316.68 USD
   Margin required for 1.00 Sell order at price 1.31661 on GBPUSD symbol1316.61 USD
   Margin required for 1.00 Buy Limit order at price 1.31568 on GBPUSD symbol1315.68 USD
   Margin required for 1.00 Sell Limit order at price 1.31761 on GBPUSD symbol1317.61 USD
   Margin required for 1.00 Buy Stop order at price 1.31768 on GBPUSD symbol1317.68 USD
   Margin required for 1.00 Sell Stop order at price 1.31561 on GBPUSD symbol1315.61 USD
   Margin required for 1.00 Buy Stop Limit order at price 1.31718 on GBPUSD symbol1317.18 USD
   Margin required for 1.00 Sell Stop Limit order at price 1.31611 on GBPUSD symbol1316.11 USD
   */
  }
//+------------------------------------------------------------------+
//| Retorna o tipo de ordem Buy ou Sell com base no tipo de ordem    |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE MarketOrderByOrderType(ENUM_ORDER_TYPE type)
  {
   switch(type)
     {
      case ORDER_TYPE_BUY  : case ORDER_TYPE_BUY_LIMIT  : case ORDER_TYPE_BUY_STOP  : case ORDER_TYPE_BUY_STOP_LIMIT  :
        return(ORDER_TYPE_BUY);
      case ORDER_TYPE_SELL : case ORDER_TYPE_SELL_LIMIT : case ORDER_TYPE_SELL_STOP : case ORDER_TYPE_SELL_STOP_LIMIT :
        return(ORDER_TYPE_SELL);
     }
   return(WRONG_VALUE);
  }
//+------------------------------------------------------------------+
//| Retorna o preço de abertura com base no tipo de ordem            |
//+------------------------------------------------------------------+
double PriceByOrderType(const string symbolconst ENUM_ORDER_TYPE order_type)
  {
   int     digits=0;
   double  point=0;
   MqlTick tick={};
 
//--- obtemos o valor do Point do símbolo
   ResetLastError();
   if(!SymbolInfoDouble(symbolSYMBOL_POINTpoint))
     {
      Print("SymbolInfoDouble() failed. Error "GetLastError());
      return 0;
     }
     
//--- obtemos o valor de Digits do símbolo
   long value=0;
   if(!SymbolInfoInteger(symbolSYMBOL_DIGITSvalue))
     {
      Print("SymbolInfoInteger() failed. Error "GetLastError());
      return 0;
     }
   digits=(int)value;
   
//--- obtemos os últimos preços do símbolo
   if(!SymbolInfoTick(symboltick))
     {
      Print("SymbolInfoTick() failed. Error "GetLastError());
      return 0;
     }
     
//--- dependendo do tipo de ordem, retornamos o preço
   switch(order_type)
     {
      case ORDER_TYPE_BUY              :  return(tick.ask);
      case ORDER_TYPE_SELL             :  return(tick.bid);
      case ORDER_TYPE_BUY_LIMIT        :  return(NormalizeDouble(tick.ask - DEVIATION * pointdigits));
      case ORDER_TYPE_SELL_LIMIT       :  return(NormalizeDouble(tick.bid + DEVIATION * pointdigits));
      case ORDER_TYPE_BUY_STOP         :  return(NormalizeDouble(tick.ask + DEVIATION * pointdigits));
      case ORDER_TYPE_SELL_STOP        :  return(NormalizeDouble(tick.bid - DEVIATION * pointdigits));
      case ORDER_TYPE_BUY_STOP_LIMIT   :  return(NormalizeDouble(tick.ask + DEVIATION * point - STOP_LIMIT * pointdigits));
      case ORDER_TYPE_SELL_STOP_LIMIT  :  return(NormalizeDouble(tick.bid - DEVIATION * point + STOP_LIMIT * pointdigits));
      default                          :  return(0);
     }
  }
//+------------------------------------------------------------------+
//| Retorna a descrição do tipo de ordem                             |
//+------------------------------------------------------------------+
string OrderTypeDescription(const ENUM_ORDER_TYPE order_type)
  {
   switch(order_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");
      case ORDER_TYPE_CLOSE_BY         :  return("Close By");
      default                          :  return("Unknown order type");
     }
  }
//+------------------------------------------------------------------+

Também Veja

OrderSend(), Order Properties, Tipos de Operações de Negociação (Trade)