Página 1 de 1

MQL4 Cerrar todas las posiciones

Publicado: 20 Mar 2010 21:50
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

Re: MQL4 Cerrar todas las posiciones

Publicado: 20 Mar 2010 22:34
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();}

Re: MQL4 Cerrar todas las posiciones

Publicado: 20 Mar 2010 23:01
por Fer137
Y en el codigo que has puesto falta la "{" despues del for, así solo cerraría una.

Re: MQL4 Cerrar todas las posiciones

Publicado: 20 Mar 2010 23:21
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

Re: MQL4 Cerrar todas las posiciones

Publicado: 20 Mar 2010 23:39
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! ;-)

Re: MQL4 Cerrar todas las posiciones

Publicado: 21 Mar 2010 01:00
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);}

Re: MQL4 Cerrar todas las posiciones

Publicado: 21 Mar 2010 12:25
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: