Cerrar todas las operaciones de golpe
Cerrar todas las operaciones de golpe
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.
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.
Puedes usar este script
Saludos
Edito: He vuelto a poner el archivo. Ya funciona el link
Saludos
Edito: He vuelto a poner el archivo. Ya funciona el link
- Adjuntos
-
- dump_533.mq4
- (828 Bytes) Descargado 1140 veces
Última edición por Surfer el 03 Mar 2009 20:44, editado 1 vez en total.
Esto hace lo que pides, creo:
Lo del "profittarget++" es para que vuelva a empezar con un nuevo objetivo... sólo es si quieres seguir operando.
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);
}
"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.
Aristóteles.
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!
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.
Aristóteles.
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);
}
Re: Cerrar todas las operaciones de golpe
Buenas,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.
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.
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()
//--------------------------------------------------------------------
para cerrar el Hedge
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.
Un saludo.
- Adjuntos
-
- CerrandoTODOporEUROS.mq4
- (3.2 KiB) Descargado 510 veces
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
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
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.
Me gusta como me ha quedado porque es secillo y efectivo.
Muchas gracias por tu comentario.
Un saludo.
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.
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 567 veces
Si te ha gustado este hilo del Foro, ¡compártelo en redes!