Respuesta

Posible codificación para permitir la apertura de operaciones múltiples más allá del tamaño máximo de la parcela

0 respuestas

jbrunet

Abonado, bbp_participant, comunidad, 13 respuestas.

Visitar el perfil

hace 10 años #111607

La mayoría de los corredores tienen un límite en el número de lotes que le permitirán abrir. En algunos casos, es deseable abrir múltiples operaciones para conseguir un número de lotes abiertos que supere el máximo del broker para cualquier ticket de operación. He hecho algunos experimentos, y he encontrado que la siguiente modificación a la función sqOpenOrderWithErrorHandling() permitirá que esto suceda. Lo ofrezco como sugerencia para que se incluya en futuras versiones, si los desarrolladores y otros usuarios lo consideran conveniente. Si alguien desea probar esto, es libre de hacerlo, pero asegúrese de probarlo a fondo para asegurarse de que no rompe nada más. Mis propias pruebas personales han encontrado (hasta ahora) que no rompe otras funciones y por eso lo he estado usando con buen éxito.

 

Tenga en cuenta que en lugar de LotsDecimals, que se define como doble por EA Wizard, suelo utilizar una variable int, decimales, que es una variable int global y se define como el número de decimales permitidos para el tamaño del lote por ese corredor en particular. En la mayoría de los casos, es 2, para los corredores que permiten micro lotes. He utilizado LotsDecimals en mi codificación personalizada a continuación, ya que es la norma para EA Wizard, pero en mi propia práctica, yo uso la variable int decimales en su lugar.

 

int sqOpenOrderWithErrorHandling(cadena symbol, int orderType, doble orderLots, doble price, doble realSL, doble realPT, cadena comment, int orderMagicNumber) {
   int ticket, error;
 
// ***** Código personalizado añadido
  double mmaxlots=MarketInfo(Symbol(), MODE_MAXLOT) ;
  double mminlots=MarketInfo(Symbol(), MODE_MINLOT) ;
 
  double jlots=ordenLotes ;     
  doble ilots=0,0 ;
  while(jlots>0.0) 
    {
        ilots=jlots ;
        if(ilots>mmaxlots) ilots=mmaxlots ;
        if(ilots<mminlots) ilots=mminlots ;
        ilots=NormalizarDoble(ilots,LotesDecimales) ;
        jlots=jlots-ilots ;
      
 
 
   if(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);
   }
// **** Fin del código personalizado añadido para esta sección...Ver código adicional al final de la función.
 

 

   if(ticket < 0) {
      // pedido fallido, escribir error en log
      return(-1*GetLastError());
   }
 
   OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
   Log("Orden abierta: ", OrderTicket(), " al precio:", OrderOpenPrice());
 
   // establecer stop loss y objetivo de beneficio
   // tiene que hacerse por separado para apoyar a los corredores ECN
   if((realSL > 0 || realPT > 0) && (OrderStopLoss() != realSL || OrderTakeProfit() != realPT)) {
      if(OrderModify(ticket, OrderOpenPrice(), realSL, realPT, 0, 0)) {
         Log("Orden modificada, StopLoss: ", realSL,", Profit Objetivo: ", realPT);
      } else {
         error = GetLastError();
         Log("Error al modificar el pedido: ",error, " : ", ErrorDescription(error));
 
         RefreshRates();
         if(orderType == OP_BUY) precio = Ask;
         if(orderType == OP_SELL) precio = Oferta;
         if(OrderClose(ticket, orderLots, price, 6) != true) {
            error = GetLastError();
            Log("NO SE PUEDE CERRAR EL PEDIDO: ", OrderTicket(), ", Error al abrir el pedido : ",error, " : ", ErrorDescription(error));
            return(-1*error);
         }
      }
   }
 
// ***** Código adicional personalizado

 

  if(jlots>0.0) continuar ;
 }  
 
// **** Fin del código personalizado añadido para esta sección

 

 
  return(ticket);
}

0