Cerrar todas las operaciones de golpe

Foro dedicado a todo lo relacionado con la versión 4 de la plataforma de Metaquotes.
ciclista
Mensajes: 169
Registrado: 11 Ene 2007 13:13
Ubicación: MADRID

Cerrar todas las operaciones de golpe

Mensaje por ciclista »

Hola amigos,

cacharreando en una versión demo de Metatrader tengo abiertas seis operaciones a la vez intentando "hedgear".

Lógicamente el beneficio conjunto va variando a la vez que el precio. Pero mi pregunta es, ¿se pueden cerrar todas las operaciones de una sola vez, es decir, cuando el beneficio llegue a un nivel prefijado, en lugar de tener que andar cerrando una a una? Sería interesante poder hacerlo, porque si tienes abiertas muchas órdenes, el beneficio se puede si no evaporar, al menos diluir.

Spirit, tú que haces el hedge y tienes muchas operaciones abiertas al mismo tiempo, ¿me puedes hechar una mano?

Muchas gracias.
No pain, no gain.
jodio69
Mensajes: 31
Registrado: 24 Feb 2009 14:02

Mensaje por jodio69 »

podrias decirme como cerrar una a una q o aun no se ni siquiera eso
gracias
Avatar de Usuario
Surfer
Mensajes: 184
Registrado: 25 Nov 2007 20:07
Contactar:

Mensaje por Surfer »

Puedes usar este script

Saludos


Edito: He vuelto a poner el archivo. Ya funciona el link
Adjuntos
dump_533.mq4
(828 Bytes) Descargado 1112 veces
Última edición por Surfer el 03 Mar 2009 20:44, editado 1 vez en total.
Avatar de Usuario
CIBM
Mensajes: 52
Registrado: 17 Sep 2004 16:32

Mensaje por CIBM »

Hola Surfer,
he intentado descargar tu script pero no va el link de descarga.
Un saludo
Avatar de Usuario
bolsa1
Mensajes: 1347
Registrado: 13 May 2008 09:53
Ubicación: Gallaecia

Mensaje por bolsa1 »

Esto hace lo que pides, creo:

Código: Seleccionar todo

extern int profit_target=100;

  if (AccountProfit()>profit_target)
{
while(OrdersTotal()>0)
{
OrderSelect(0,SELECT_BY_POS);
if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),999,Red);
if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),999,Orange);
if(OrderType()==OP_BUYSTOP||OrderType()==OP_SELLSTOP||OrderType()==OP_BUYLIMIT||OrderType()==OP_SELLLIMIT) OrderDelete(OrderTicket());
}
profit_target++;
return(0);
}
Lo del "profittarget++" es para que vuelva a empezar con un nuevo objetivo... sólo es si quieres seguir operando.
"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
CIBM
Mensajes: 52
Registrado: 17 Sep 2004 16:32

Mensaje por CIBM »

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

Mensaje por bolsa1 »

También sería interesante estudiar la orden "OrderCloseBy()", que sirve para cerrar posiciones opuestas, ahorrándote el spread de una de las posiciones que cierres. En este enlace lo explican:

http://book.mql4.com/trading/orderclose

Busca la sección "Closing Opposite Orders". Si algún gurú del foro se atreve a hacer un Void para automatizar los cierres con esta función, se agradecería... yo me pondré con ello un poco más adelante, cuando domine un poco más el MQL4...

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.
Spirit
Mensajes: 4739
Registrado: 12 Jun 2008 19:49

Mensaje por Spirit »

Modificando este código para eliminar todas las órdenes limitadas pendientes lo puedes hacer con las activas.

Código: Seleccionar todo

int start()
  {
   bool   result;
   int    cmd,total;
//----
   total=OrdersTotal();
//----
   for(int i=0; i<total; i++)
     {
      if(OrderSelect(1,SELECT_BY_POS,MODE_TRADES))
        {
         cmd=OrderType();
         //---- pending orders only are considered
         if(cmd!=OP_BUY && cmd!=OP_SELL)
           {
            //---- print selected order
            OrderPrint();
            //---- delete first pending order
            result=OrderDelete(OrderTicket());
            if(result!=TRUE) Print("LastError = ", GetLastError());
            break;
           }
        }
      else { Print( "Error when order select ", GetLastError()); break; }
     }
//----
   return(0);
  }
OneMore
Mensajes: 80
Registrado: 29 Abr 2008 09:39

Re: Cerrar todas las operaciones de golpe

Mensaje por OneMore »

ciclista escribió:Hola amigos,

cacharreando en una versión demo de Metatrader tengo abiertas seis operaciones a la vez intentando "hedgear".

Lógicamente el beneficio conjunto va variando a la vez que el precio. Pero mi pregunta es, ¿se pueden cerrar todas las operaciones de una sola vez, es decir, cuando el beneficio llegue a un nivel prefijado, en lugar de tener que andar cerrando una a una? Sería interesante poder hacerlo, porque si tienes abiertas muchas órdenes, el beneficio se puede si no evaporar, al menos diluir.

Spirit, tú que haces el hedge y tienes muchas operaciones abiertas al mismo tiempo, ¿me puedes hechar una mano?

Muchas gracias.
Buenas,

En el Metatrader, en la ventana de introducción de ordenes, puedes seleccionar el tipo; si eliges "Cierre múltiple por" te cierra todas las que tengas abiertas en el par seleccionado.

Si las posiciones están desbalanceadas, te deja una orden abierta con el saldo que corresponda.

Como indica la documentación, esta opción -dependiendo del broker- te ahorra además pagar un spread de más.

Saludos.
ciclista
Mensajes: 169
Registrado: 11 Ene 2007 13:13
Ubicación: MADRID

Mensaje por ciclista »

Muchas gracias a todos por las respuestas, ya puedo hacerlo.

Un saludo.
No pain, no gain.
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Mensaje por nstrader »

OrderCloseBy(), la tenía en la lista de espera para su estudio, bolsa1 en el link que has puesto hay un ejemplo de script, es un bucle que busca ordenes opuestas y las cierra, si la cantidad de lotes es diferente "abre" otra orden sin spread con la diferencia y esta última tambien se tendrá en cuenta para el cierre de otro par de ordenes opuestas. Una función muy interesante

Código: Seleccionar todo

//--------------------------------------------------------------------
// closeby.mq4 
// Ïðåäíàçíà÷åí äëÿ èñïîëüçîâàíèÿ â êà÷åñòâå ïðèìåðà â ó÷åáíèêå MQL4.
//--------------------------------------------------------------- 1 --
int start()                                     // Ñïåö.ôóíêöèÿ start
  {
   string Symb=Symbol();                      // Ôèíàíñ. èíñòðóìåíò
   double Dist=1000000.0;                     // Ïðåäóñòàíîâêà
//--------------------------------------------------------------- 2 --
   while(true)                                 // Öèêë îáðàáîòêè.. 
     {                                         // ..âñòðå÷íûõ îðäåðîâ
      double Hedg_Buy=-1.0;                   // Ìàêñ. ñòîèìîñòü Buy
      double Hedg_Sell= -1.0;                   // Ìàêñ.ñòîèìîñòü Sell
      for(int i=1; i<OrdersTotal>1) continue;                // Îòëîæåííûé îðäåð  
            //--------------------------------------------------- 4 --
            switch(Tip)                        // Ïî òèïó îðäåðà
              {
               case 0:                          // Îðäåð Buy
                  if (OrderLots()>Hedg_Buy)
                    {
                     Hedg_Buy=OrderLots();    // Âûáèðàåì ìàêñ.ñòîèì
                     int Ticket_Buy=OrderTicket();//Íîìåð îðäåðà
                    }
                  break;                        // Èç switch
               case 1:                          // Îðäåð Sell
                  if (OrderLots()>Hedg_Sell)
                    {
                     Hedg_Sell=OrderLots();   // Âûáèðàåì ìàêñ.ñòîèì
                     int Ticket_Sell=OrderTicket();//Íîìåð îðäåðà
                    }
              }                                //Êîíåö switch
           }                                   //Êîíåö àíàëèçà îðäåðà
        }                                      //Êîíåö ïåðåáîðà îðä.
      //--------------------------------------------------------- 5 --
      if (Hedg_Buy<0 || Hedg_Sell<0)            // Åñëè íåò îðäåðà..
        {                                      // ..êàêîãî-òî òèïà
         Alert("Âñå âñòðå÷íûå îðäåðà çàêðûòû :)");// Ñîîáùåíèå  
         return;                                // Âûõîä èç start()
        }
      //--------------------------------------------------------- 6 --
      while(true)                              // Öèêë çàêðûòèÿ 
        {
         //------------------------------------------------------ 7 --
         Alert("Ïîïûòêà âñòðå÷íîãî çàêðûòèÿ. Îæèäàíèå îòâåòà..");
         bool Ans=OrderCloseBy(Ticket_Buy,Ticket_Sell);// Çàêðûòèå 
         //------------------------------------------------------ 8 --
         if (Ans==true)                         // Ïîëó÷èëîñü :)
           {
            Alert ("Âûïîëíåíî âñòðå÷íîå çàêðûòèå.");
            break;                              // Âûõîä èç öèêëà çàêð
           }
         //------------------------------------------------------ 9 --
         int Error=GetLastError();            // Íå ïîëó÷èëîñü :(
         switch(Error)                         // Ïðåîäîëèìûå îøèáêè
           {
            case  4: Alert("Òîðãîâûé ñåðâåð çàíÿò. Ïðîáóåì åù¸ ðàç..");
               Sleep(3000);               // Ïðîñòîå ðåøåíèå
               continue;                  // Íà ñëåä. èòåðàöèþ
            case 137:Alert("Áðîêåð çàíÿò. Ïðîáóåì åù¸ ðàç..");
               Sleep(3000);               // Ïðîñòîå ðåøåíèå
               continue;                  // Íà ñëåä. èòåðàöèþ
            case 146:Alert("Ïîäñèñòåìà òîðãîâëè çàíÿòà. Ïðîáóåì åù¸..");
               Sleep(500);                // Ïðîñòîå ðåøåíèå
               continue;                  // Íà ñëåä. èòåðàöèþ
           }
         switch(Error)                         // Êðèòè÷åñêèå îøèáêè
           {
            case 2 : Alert("Îáùàÿ îøèáêà.");
               break;                     // Âûõîä èç switch
            case 64: Alert("Ñ÷åò çàáëîêèðîâàí.");
               break;                     // Âûõîä èç switch
            case 133:Alert("Òîðãîâëÿ çàïðåùåíà");
               break;                     // Âûõîä èç switch
            case 139:Alert("Îðäåð çàáëîêèðîâàí è óæå îáðàáàòûâàåòñÿ");
               break;                     // Âûõîä èç switch
            case 145:Alert("Ìîäèôèêàöèÿ çàïðåùåíà. ",
                                 "Îðäåð ñëèøêîì áëèçîê ê ðûíêó");
               break;                     // Âûõîä èç switch
            default: Alert("Âîçíèêëà îøèáêà ",Error);//Äðóãèå âàðèàíòû   
           }
         Alert ("Ñêðèïò çàêîí÷èë ðàáîòó --------------------------");
         return;                                // Âûõîä èç start()
        }
     }                                         // Êîíåö öèêëà îáðàáîò
//-------------------------------------------------------------- 10 --
  }                                            // Êîíåö start()
//--------------------------------------------------------------------
elcctrro
Mensajes: 329
Registrado: 26 Nov 2008 11:09
Ubicación: Zona centro España

para cerrar el Hedge

Mensaje por elcctrro »

Este es el experto que me hice para lo del Hedge, cuando alcanza un acantidad e euros cierra todo y quita las pendientes tambien.
Un saludo.
Adjuntos
CerrandoTODOporEUROS.mq4
(3.2 KiB) Descargado 489 veces
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Mensaje por nstrader »

elcctrro, te los cierra todos a la primera o te da algun error?, yo le pondria en la función CloseAll otra vez la comprobación de IsTradeAllowed() antes de cada cierre, y una gestión de errores con pausa con la función Sleep(), porque seguro que se ejecuta más rápido el bucle que el envio y la respuesta del broker con la confirmación del cierre.

Tambien utilizar RefreshRates( ) antes de cada cierre si quieres que se completen todos los cierres con seguridad si el requote supera al Slippage, o en su defecto utilizar en lugar de Bid que tendrá un valor antiguo utilizar MarketInfo(Symbol(),MODE_BID) que extrae el valor del mercado en ese momento.

Gestionar las respuestas que te da el servidor del broker son muy importantes en trading automático y cualquier expert debería saber interpretarlas e incluso monitorizarlas también para estudiar la fiabilidad del broker.

Posibles respuestas del servidor

ERR_NO_ERROR 0 No error returned.
ERR_NO_RESULT 1 No error returned, but the result is unknown.
ERR_COMMON_ERROR 2 Common error.
ERR_INVALID_TRADE_PARAMETERS 3 Invalid trade parameters.
ERR_SERVER_BUSY 4 Trade server is busy.
ERR_OLD_VERSION 5 Old version of the client terminal.
ERR_NO_CONNECTION 6 No connection with trade server.
ERR_NOT_ENOUGH_RIGHTS 7 Not enough rights.
ERR_TOO_FREQUENT_REQUESTS 8 Too frequent requests.
ERR_MALFUNCTIONAL_TRADE 9 Malfunctional trade operation.
ERR_ACCOUNT_DISABLED 64 Account disabled.
ERR_INVALID_ACCOUNT 65 Invalid account.
ERR_TRADE_TIMEOUT 128 Trade timeout.
ERR_INVALID_PRICE 129 Invalid price.
ERR_INVALID_STOPS 130 Invalid stops.
ERR_INVALID_TRADE_VOLUME 131 Invalid trade volume.
ERR_MARKET_CLOSED 132 Market is closed.
ERR_TRADE_DISABLED 133 Trade is disabled.
ERR_NOT_ENOUGH_MONEY 134 Not enough money.
ERR_PRICE_CHANGED 135 Price changed.
ERR_OFF_QUOTES 136 Off quotes.
ERR_BROKER_BUSY 137 Broker is busy.
ERR_REQUOTE 138 Requote.
ERR_ORDER_LOCKED 139 Order is locked.
ERR_LONG_POSITIONS_ONLY_ALLOWED 140 Long positions only allowed.
ERR_TOO_MANY_REQUESTS 141 Too many requests.
ERR_TRADE_MODIFY_DENIED 145 Modification denied because order too close to market.
ERR_TRADE_CONTEXT_BUSY 146 Trade context is busy.
ERR_TRADE_EXPIRATION_DENIED 147 Expirations are denied by broker.
ERR_TRADE_TOO_MANY_ORDERS 148 The amount of open and pending orders has reached the limit set by the broker.

Saludos
elcctrro
Mensajes: 329
Registrado: 26 Nov 2008 11:09
Ubicación: Zona centro España

Mensaje por elcctrro »

Me los cierra muy rápido, es posible que cuando hay poco volumen de contrapartida no lo cierra a la primera pero no pierde tiempo en gestionar el error y si se dan las condiciones intenta de nuevo el cierre.

Me gusta como me ha quedado porque es secillo y efectivo.

Muchas gracias por tu comentario.
Un saludo.
elcctrro
Mensajes: 329
Registrado: 26 Nov 2008 11:09
Ubicación: Zona centro España

Mensaje por elcctrro »

Siguiendo las sugerencias de nstrader he revisado y modificado el experto, pero no me ha dado tiempo a comprobar su correcto funconamiento.
Si alguien observa que no funciona correctamente o lo quiere medificar por mi parte no hay pegas, pero que luego lo postee. Las mejoras a todos nos enriquecen.
un saludo.
Adjuntos
CerrandoTODOporEUROS_rev01.mq4
(2.48 KiB) Descargado 531 veces
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Metatrader 4”