Problema: Script para cerrar todas las órdenes

Hoy quiero daros un problema a resolver, el siguiente script es muy sencillo, explicaremos qué hace y cómo lo hace. Pero hay un error que tenéis que detectar y resolver, podéis dejar un comentario con vuestra respuesta.
El script CierraTodasLasOrdenes hace lo que su nombre indica: cerrar todas las órdenes abiertas que tenemos en la plataforma MetaTrader. ¿En qué momento puede sernos útil? A todo trader le ha pasado alguna vez que operando manualmente se ha emocionado en exceso (demasiada confianza) por la última racha positiva y ha empezado a abrir posiciones sin control. En un momento te das cuenta que no puedes seguir tantas operaciones, están empezando a perder y se están comiendo tus ganancias… tienes que cerrar. Cerrar todo, respirar hondo y volver a empezar. ¿Os suena?
Veamos cómo programar un script que cierre posiciones. El código es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | int start() { int error; for(int pos = OrdersTotal()-1; pos >= 0; pos--) { Print("Cerrando orden #",pos); OrderSelect(pos,SELECT_BY_POS,MODE_TRADES); if(OrderType() == OP_BUY) { RefreshRates(); if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Yellow)) {error=GetLastError(); Print("LastError = ",error); } } if(OrderType() == OP_SELL) { RefreshRates(); if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Yellow)) {error=GetLastError(); Print("LastError = ",error); } } } return(0); } |
La linea más importante es la del bucle for:
for(int pos = OrdersTotal()-1; pos >= 0; pos--)
Vamos a recorrer las posiciones (que corresponden a operaciones abiertas), las recorremos en orden descendente. Si hay 10 posiciones abiertas MetaTrader numera a la primera con un 0, a la segunda con un 1, y así sucesivamente hasta la décima con un 9. Es decir, 10 posiciones numeradas del 0 al 9.
Por eso, inicializamos la variable pos con OrdersTotal()-1, y vamos descontando pos–. ¿Por qué decreciente? Porque si lo hacemos creciente, cuando cerremos la orden 0, la orden 1 pasará a numerarse como 0… y nuestro bucle for pasará a la siguiente operación numerada con 1, saltandose una posición.
Lo demás es muy sencillo, tomamos cada posición:
OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);
Y en función del tipo (BUY o SELL) la cerramos a un precio u otro (Bid o Ask).
Sin embargo este script no funciona… No cierra ninguna posición, debe tener algún error y para encontrarlo hemos utilizado la función GetLastError. Esto ya nos debería dar una pista de cuál es el error… Pero ¿sabéis cómo resolverlo?
La respuesta en los comentarios del foro…




