Resposta

Possível codificação para permitir a abertura de várias negociações para ir além do tamanho máximo do lote

0 respostas

jbrunet

Assinante, bbp_participante, comunidade, 13 respostas.

Perfil da visita

10 anos atrás #111607

A maioria dos corretores tem um limite para o número de lotes que permitem que você abra. Em alguns casos, é desejável abrir várias negociações para obter um número de lotes abertos que ultrapasse o limite máximo da corretora para qualquer ticket de negociação. Fiz alguns experimentos e descobri que a modificação a seguir na função sqOpenOrderWithErrorHandling() permitirá que isso aconteça. Estou oferecendo isso como uma sugestão a ser incluída em versões futuras, se for considerado desejável pelos desenvolvedores e outros usuários. Se alguém quiser experimentar, pode fazê-lo, mas não se esqueça de testá-lo minuciosamente para ter certeza de que ele não quebrará mais nada. Meus testes pessoais constataram (até o momento) que ele não interrompe outras funções e, portanto, eu o tenho usado com bastante sucesso.

 

Observe que, em vez de LotsDecimals, que é definido como double pelo EA Wizard, geralmente uso uma variável int, decimals, que é uma variável int global e é definida como o número de casas decimais permitidas para o dimensionamento de lotes por essa corretora específica. Na maioria dos casos, é 2, para corretoras que permitem microlotes. Usei LotsDecimals em minha codificação personalizada abaixo, já que essa é a norma para o EA Wizard, mas, em minha própria prática, uso a variável int decimals.

 

int sqOpenOrderWithErrorHandling(string symbol, int orderType, double orderLots, double price, double realSL, double realPT, string comment, int orderMagicNumber) {
   int ticket, error;
 
// ***** Código personalizado adicionado
  double mmaxlots=MarketInfo(Symbol(), MODE_MAXLOT) ;
  double mminlots=MarketInfo(Symbol(), MODE_MINLOT) ;
 
  double jlots=orderLots ;     
  double ilots=0.0 ;
  while(jlots>0.0) 
    {
        ilots=jlots ;
        se(ilots>mmaxlots) ilots=mmaxlots ;
        se(ilots<mminlots) ilots=mminlots ;
        ilots=NormalizeDouble(ilots,LotsDecimals) ;
        jlots=jlots-ilots ;
      
 
 
   Se (símbolo == "NULL") {
      ticket = OrderSend(Symbol(), orderType, ilots, price, MaxSlippage, 0, 0, comment, orderMagicNumber);
   {} else {
      ticket = OrderSend(symbol, orderType, ilots, price, MaxSlippage, 0, 0, comment, orderMagicNumber);
   }
// **** Fim do código personalizado adicionado para esta seção... Veja o código adicional no final da função.
 

 

   if(ticket < 0) {
      // o pedido falhou, escreva o erro no registro
      return(-1*GetLastError());
   }
 
   OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
   Log("Order opened: ", OrderTicket(), " at price:", OrderOpenPrice());
 
   // definir stop loss e meta de lucro
   // tem que ser feito separadamente para dar suporte a corretores ECN
   se((realSL > 0 || realPT > 0) && (OrderStopLoss() != realSL || OrderTakeProfit() != realPT)) {
      if(OrderModify(ticket, OrderOpenPrice(), realSL, realPT, 0, 0)) {
         Log("Ordem modificada, StopLoss: ", realSL,", Profit Target: ", realPT);
      {} else {
         error = GetLastError();
         Log("Erro ao modificar o pedido: ",error, " : ", ErrorDescription(error));
 
         RefreshRates();
         if(orderType == OP_BUY) price = Ask;
         if(orderType == OP_SELL) price = Bid;
         if(OrderClose(ticket, orderLots, price, 6) != true) {
            error = GetLastError();
            Log("CANNOT CLOSE ORDER: ", OrderTicket(), ", Error opening order : ",error, " : ", ErrorDescription(error));
            retornar(-1*erro);
         }
      }
   }
 
// ***** Código adicional personalizado adicionado

 

  se(jlots>0.0) continue ;
 }  
 
// **** Fim do código personalizado adicionado para esta seção

 

 
  return(ticket);
}

0