MQL4 Cerrar todas las posiciones

Foro dedicado a todo lo relacionado con la versión 4 de la plataforma de Metaquotes.
Responder
Avatar de Usuario
Gamelu
Mensajes: 787
Registrado: 21 May 2009 16:49

MQL4 Cerrar todas las posiciones

Mensaje por Gamelu »

Buenas noches, aqui ando liado puliendo un EA. No consigo cerrar todas las posiciones automaticamente con este for,
for(int i=0;i<total;i++)
OrderSelect(i, SELECT_BY_POS);
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
}

Lo que pretendo es dejar el panel limpio, se trata de un EA ciclico, cuando termina el ciclo, se considera que tiene que comenzar otro nuevo, por eso que quiero cerrar todo sin contemplaciones. Solo consigo cerrar una posicion con ese codigo,
Saludos
Avatar de Usuario
Fer137
Mensajes: 1371
Registrado: 12 Nov 2007 18:43

Re: MQL4 Cerrar todas las posiciones

Mensaje por Fer137 »

Cambia "total" por OrdersTotal() y añade otra linea para cerrar las sell.
En bruto sería:

Código: Seleccionar todo

for(int i=0;i<OrdersTotal();i++){
    OrderSelect(i, SELECT_BY_POS);
    OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);   
    OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);}
Tambien es aconsejable repetirlo varias veces para asegurarse, por si el broker es lento y se aturulla. Si eso fuera una función de nombre closeall, algo así como if(ciclo_talycual){closeall();closeall();closeall();}
Avatar de Usuario
Fer137
Mensajes: 1371
Registrado: 12 Nov 2007 18:43

Re: MQL4 Cerrar todas las posiciones

Mensaje por Fer137 »

Y en el codigo que has puesto falta la "{" despues del for, así solo cerraría una.
Avatar de Usuario
Gamelu
Mensajes: 787
Registrado: 21 May 2009 16:49

Re: MQL4 Cerrar todas las posiciones

Mensaje por Gamelu »

Gracias fer137, creo que la "{" va a tener la culpa, después del for no se la he abierto, me he liado con la del if anterior, suele ser recomendable marcarlas pero se me paso por completo. No sabia que se cerraban por una parte los buy y por otra los sell..

Lo estoy testeando ahora con la modificación, el EA lo programe hace tiempo, bastante escaso la verdad, le estoy implementando una gestión monetaria, teniendo en cuenta temas que tratáis por aquí, a ver cuanto puede llegar a mejorar, por que da demasiadas señales y si no lo controlas te lleva a la ruina, en fin el pan de cada día, ejej

Saludos
Avatar de Usuario
bolsa1
Mensajes: 1347
Registrado: 13 May 2008 09:53
Ubicación: Gallaecia

Re: MQL4 Cerrar todas las posiciones

Mensaje por bolsa1 »

Te dejo el Void que utilizo yo. Copialo al final del programa, y luego con llamar a "CierraTodas()" ya está.

Código: Seleccionar todo

 void CierraTodas()
{
  int total = OrdersTotal();
  for(int i=total-1;i>=0;i--)
  {
    OrderSelect(i, SELECT_BY_POS);
    int type   = OrderType();

    bool result = false;
    
    switch(type)
    {
      //Close opened long positions
      case OP_BUY       : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
                          break;
      
      //Close opened short positions
      case OP_SELL      : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
                          break;

      //Close pending orders
      case OP_BUYLIMIT  :
      case OP_BUYSTOP   :
      case OP_SELLLIMIT :
      case OP_SELLSTOP  : result = OrderDelete( OrderTicket() );
    }
    
    if(result == false)
    {
      Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
      Sleep(3000);
    }  
  }
}
De la forma que lo estábais haciendo, al cerrar de 0 a Total, cierras la cero y la que antes era 1 ahora pasa a ser 0, y tú estarías cerrando la 1 ( que sería la dos...) es decir, cuando cierras una orden todas las superiores corren un puesto hacia abajo. Por ello creo que la forma correcta es hacer el recorrido de OrdersTotal()-1 hasta 0.

Corregidme si me equivoco.

Saludos! ;-)
"Mercaderes e industriales no deben ser admitidos a la ciudadanía; porque su género de vida es abyecto y contrario a la virtud."

Aristóteles.

Avatar de Usuario
Fer137
Mensajes: 1371
Registrado: 12 Nov 2007 18:43

Re: MQL4 Cerrar todas las posiciones

Mensaje por Fer137 »

Creo que tienes razón. Alguna vez observé que dejaba algunas sin cerrar y le hacía varias pasadas, ...y yo echando la culpa a los brokers :D

El codigo de antes quedaría:

Código: Seleccionar todo

for(int i=OrdersTotal()-1;i>=0;i--){
    OrderSelect(i, SELECT_BY_POS);
    OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);   
    OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);}
Avatar de Usuario
Gamelu
Mensajes: 787
Registrado: 21 May 2009 16:49

Re: MQL4 Cerrar todas las posiciones

Mensaje por Gamelu »

Gracias a los dos, al final he implantado el codigo de bolsa1, funciona perfecto, muy recomendable.
La historia es que estoy testeando el EA, y estoy obteniendo mejores resultados de los que esperaba.
Aun tengo que mejorar muchos aspectos, os subiria un test de varios meses, pero el problema es que cuando entra en un hedge no sabe salir de el, se queda plano.
Reglas:
Cuando se inicia un nuevo ciclo se aceptan las señales de una relevancia ("1.5"), y a partir de ahí cada señal debe ser mas relevante que la anterior, y cada ciclo puede contener 10 posiciones maximas. Como regla le obligo a haber entrado en un drawdown mayor a 1% para comenzar a cerrar ordenes, y el cierre se efectua cuando el porcentaje de beneficio sea mayor al drawdown anterior. Con estas simples reglas, un sistema de ruina absoluta, esta empezando a ser controlado.

Resultados marzo:
Adjuntos
marzo.gif
ComparaVelas Test.pdf
(33.33 KiB) Descargado 133 veces
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Metatrader 4”